diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 00000000000..9a58b60c3ef --- /dev/null +++ b/.bazelrc @@ -0,0 +1,3 @@ +build --repo_env=CC=clang --repo_env=CXX=clang++ --copt="-std=c++17" + +try-import %workspace%/local.bazelrc diff --git a/.bazelversion b/.bazelversion new file mode 100644 index 00000000000..0062ac97180 --- /dev/null +++ b/.bazelversion @@ -0,0 +1 @@ +5.0.0 diff --git a/.codeqlmanifest.json b/.codeqlmanifest.json index 24e20e77278..2c39a11f9ae 100644 --- a/.codeqlmanifest.json +++ b/.codeqlmanifest.json @@ -6,6 +6,8 @@ "*/ql/examples/qlpack.yml", "*/ql/consistency-queries/qlpack.yml", "cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml", + "go/ql/config/legacy-support/qlpack.yml", + "go/build/codeql-extractor-go/codeql-extractor.yml", "javascript/ql/experimental/adaptivethreatmodeling/lib/qlpack.yml", "javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml", "javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.yml", @@ -15,6 +17,7 @@ "misc/legacy-support/*/qlpack.yml", "misc/suite-helpers/qlpack.yml", "ruby/extractor-pack/codeql-extractor.yml", + "swift/extractor-pack/codeql-extractor.yml", "ql/extractor-pack/codeql-extractor.yml" ], "versionPolicies": { diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ff73bcb4e7b..7fd96b8d941 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,6 +3,8 @@ "rust-lang.rust", "bungcip.better-toml", "github.vscode-codeql", + "hbenl.vscode-test-explorer", + "ms-vscode.test-adapter-converter", "slevesque.vscode-zipexplorer" ], "settings": { diff --git a/.gitattributes b/.gitattributes index 5953177325f..352b2eafe4b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -39,6 +39,7 @@ *.py text *.lua text *.expected text +*.go text # Explicitly set a bunch of known extensions to binary, because Git < 2.10 will treat # `* text=auto eol=lf` as `* text eol=lf` @@ -52,6 +53,14 @@ java/ql/test/stubs/**/*.java linguist-generated=true java/ql/test/experimental/stubs/**/*.java linguist-generated=true +# Force git not to modify line endings for go or html files under the go/ql directory +go/ql/**/*.go -text +go/ql/**/*.html -text +# Force git not to modify line endings for go dbschemes +go/*.dbscheme -text +# Preserve unusual line ending from codeql-go merge +go/extractor/opencsv/CSVReader.java -text + # For some languages, upgrade script testing references really old dbscheme # files from legacy upgrades that have CRLF line endings. Since upgrade # resolution relies on object hashes, we must suppress line ending conversion diff --git a/.github/actions/fetch-codeql/action.yml b/.github/actions/fetch-codeql/action.yml index 41ffeea81fd..13b91525237 100644 --- a/.github/actions/fetch-codeql/action.yml +++ b/.github/actions/fetch-codeql/action.yml @@ -3,12 +3,22 @@ description: Fetches the latest version of CodeQL runs: using: composite steps: + - name: Select platform - Linux + if: runner.os == 'Linux' + shell: bash + run: echo "GA_CODEQL_CLI_PLATFORM=linux64" >> $GITHUB_ENV + + - name: Select platform - MacOS + if: runner.os == 'MacOS' + shell: bash + run: echo "GA_CODEQL_CLI_PLATFORM=osx64" >> $GITHUB_ENV + - name: Fetch CodeQL shell: bash run: | LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | grep -v beta | sort --version-sort | tail -1) - gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-linux64.zip "$LATEST" - unzip -q -d "${RUNNER_TEMP}" codeql-linux64.zip + gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-$GA_CODEQL_CLI_PLATFORM.zip "$LATEST" + unzip -q -d "${RUNNER_TEMP}" codeql-$GA_CODEQL_CLI_PLATFORM.zip echo "${RUNNER_TEMP}/codeql" >> "${GITHUB_PATH}" env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 613f9287146..99a64d3b8d0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,3 +16,11 @@ updates: directory: "ruby/autobuilder" schedule: interval: "daily" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + ignore: + - dependency-name: '*' + update-types: ['version-update:semver-patch', 'version-update:semver-minor'] diff --git a/.github/labeler.yml b/.github/labeler.yml index 50956ba51c5..1dc166d6b44 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -11,7 +11,7 @@ Java: - change-notes/**/*java.* JS: - - javascript/**/* + - any: [ 'javascript/**/*', '!javascript/ql/experimental/adaptivethreatmodeling/**/*' ] - change-notes/**/*javascript* Python: @@ -21,6 +21,10 @@ Python: Ruby: - ruby/**/* - change-notes/**/*ruby* + +Swift: + - swift/**/* + - change-notes/**/*swift* documentation: - "**/*.qhelp" @@ -28,4 +32,4 @@ documentation: - docs/**/* "QL-for-QL": - - ql/**/* \ No newline at end of file + - ql/**/* diff --git a/.github/problem-matchers/codeql-query-format.json b/.github/problem-matchers/codeql-query-format.json new file mode 100644 index 00000000000..35f9c1a6f64 --- /dev/null +++ b/.github/problem-matchers/codeql-query-format.json @@ -0,0 +1,14 @@ +{ + "problemMatcher": [ + { + "owner": "codeql-query-format", + "pattern": [ + { + "regexp": "^((.*) would change by autoformatting\\.)$", + "file": 2, + "message": 1 + } + ] + } + ] +} diff --git a/.github/problem-matchers/codeql-syntax-check.json b/.github/problem-matchers/codeql-syntax-check.json new file mode 100644 index 00000000000..d285ffd77d8 --- /dev/null +++ b/.github/problem-matchers/codeql-syntax-check.json @@ -0,0 +1,17 @@ +{ + "problemMatcher": [ + { + "owner": "codeql-syntax-check", + "pattern": [ + { + "regexp": "^((ERROR|WARNING): .* \\((.*):(\\d+),(\\d+)-\\d+\\))$", + "message": 1, + "file": 3, + "line": 4, + "col": 5, + "severity": 2 + } + ] + } + ] +} diff --git a/.github/problem-matchers/codeql-test-run.json b/.github/problem-matchers/codeql-test-run.json new file mode 100644 index 00000000000..918758b3390 --- /dev/null +++ b/.github/problem-matchers/codeql-test-run.json @@ -0,0 +1,14 @@ +{ + "problemMatcher": [ + { + "owner": "codeql-test-run", + "pattern": [ + { + "regexp": "(\\[.*\\] FAILED\\((RESULT|COMPILATION)\\) (.*))$", + "file": 3, + "message": 1 + } + ] + } + ] +} diff --git a/.github/problem-matchers/make.json b/.github/problem-matchers/make.json new file mode 100644 index 00000000000..8275f4851ab --- /dev/null +++ b/.github/problem-matchers/make.json @@ -0,0 +1,13 @@ +{ + "problemMatcher": [ + { + "owner": "make", + "pattern": [ + { + "regexp": "^(make: \\*\\*\\* .*)$", + "message": 1 + } + ] + } + ] +} diff --git a/.github/workflows/check-qldoc.yml b/.github/workflows/check-qldoc.yml new file mode 100644 index 00000000000..77f524b73e7 --- /dev/null +++ b/.github/workflows/check-qldoc.yml @@ -0,0 +1,54 @@ +name: "Check QLdoc coverage" + +on: + pull_request: + paths: + - "*/ql/lib/**" + - .github/workflows/check-qldoc.yml + branches: + - main + - "rc/*" + +jobs: + qldoc: + runs-on: ubuntu-latest + + steps: + - name: Install CodeQL + run: | + gh extension install github/gh-codeql + gh codeql set-channel nightly + gh codeql version + env: + GITHUB_TOKEN: ${{ github.token }} + + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Check QLdoc coverage + shell: bash + run: | + EXIT_CODE=0 + # TODO: remove the swift exception from the regex when we fix generated QLdoc + changed_lib_packs="$(git diff --name-only --diff-filter=ACMRT HEAD^ HEAD | { grep -Po '^(?!swift)[a-z]*/ql/lib' || true; } | sort -u)" + for pack_dir in ${changed_lib_packs}; do + lang="${pack_dir%/ql/lib}" + gh codeql generate library-doc-coverage --output="${RUNNER_TEMP}/${lang}-current.txt" --dir="${pack_dir}" + done + git checkout HEAD^ + for pack_dir in ${changed_lib_packs}; do + # When we add a new language, pack_dir would not exist in HEAD^. + # In this case the right thing to do is to skip the check. + [[ ! -d "${pack_dir}" ]] && continue + lang="${pack_dir%/ql/lib}" + gh codeql generate library-doc-coverage --output="${RUNNER_TEMP}/${lang}-baseline.txt" --dir="${pack_dir}" + awk -F, '{gsub(/"/,""); if ($4==0 && $6=="public") print "\""$3"\"" }' "${RUNNER_TEMP}/${lang}-current.txt" | sort -u > "${RUNNER_TEMP}/current-undocumented.txt" + awk -F, '{gsub(/"/,""); if ($4==0 && $6=="public") print "\""$3"\"" }' "${RUNNER_TEMP}/${lang}-baseline.txt" | sort -u > "${RUNNER_TEMP}/baseline-undocumented.txt" + UNDOCUMENTED="$(grep -f <(comm -13 "${RUNNER_TEMP}/baseline-undocumented.txt" "${RUNNER_TEMP}/current-undocumented.txt") "${RUNNER_TEMP}/${lang}-current.txt" || true)" + if [ -n "$UNDOCUMENTED" ]; then + echo "$UNDOCUMENTED" | awk -F, '{gsub(/"/,""); print "::warning file='"${pack_dir}"'/"$1",line="$2"::Missing QLdoc for "$5, $3 }' + EXIT_CODE=1 + fi + done + exit "${EXIT_CODE}" diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml index c63a6be690c..4f4db041493 100644 --- a/.github/workflows/close-stale.yml +++ b/.github/workflows/close-stale.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v3 + - uses: actions/stale@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Comment or remove the `Stale` label in order to avoid having this issue closed in 7 days.' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 312feb3359b..73826e30f9e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -28,12 +28,12 @@ jobs: steps: - name: Setup dotnet - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v2 with: - dotnet-version: 6.0.101 + dotnet-version: 6.0.202 - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL @@ -49,7 +49,7 @@ jobs: # uses: github/codeql-action/autobuild@main # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # 📚 https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project diff --git a/.github/workflows/csv-coverage-metrics.yml b/.github/workflows/csv-coverage-metrics.yml index ca7bc176d6d..7778221dc2f 100644 --- a/.github/workflows/csv-coverage-metrics.yml +++ b/.github/workflows/csv-coverage-metrics.yml @@ -14,11 +14,11 @@ on: - ".github/workflows/csv-coverage-metrics.yml" jobs: - publish: + publish-java: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql - name: Create empty database @@ -31,13 +31,40 @@ jobs: - name: Capture coverage information run: | DATABASE="${{ runner.temp }}/java-database" - codeql database analyze --format=sarif-latest --output=metrics.sarif -- "$DATABASE" ./java/ql/src/Metrics/Summaries/FrameworkCoverage.ql - - uses: actions/upload-artifact@v2 + codeql database analyze --format=sarif-latest --output=metrics-java.sarif -- "$DATABASE" ./java/ql/src/Metrics/Summaries/FrameworkCoverage.ql + - uses: actions/upload-artifact@v3 with: - name: metrics.sarif - path: metrics.sarif + name: metrics-java.sarif + path: metrics-java.sarif retention-days: 20 - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v1 + uses: github/codeql-action/upload-sarif@main with: - sarif_file: metrics.sarif + sarif_file: metrics-java.sarif + + publish-csharp: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup CodeQL + uses: ./.github/actions/fetch-codeql + - name: Create empty database + run: | + DATABASE="${{ runner.temp }}/csharp-database" + PROJECT="${{ runner.temp }}/csharp-project" + dotnet new classlib --language=C# --output="$PROJECT" + codeql database create "$DATABASE" --language=csharp --source-root="$PROJECT" --command 'dotnet build /t:rebuild csharp-project.csproj /p:UseSharedCompilation=false' + - name: Capture coverage information + run: | + DATABASE="${{ runner.temp }}/csharp-database" + codeql database analyze --format=sarif-latest --output=metrics-csharp.sarif -- "$DATABASE" ./csharp/ql/src/Metrics/Summaries/FrameworkCoverage.ql + - uses: actions/upload-artifact@v3 + with: + name: metrics-csharp.sarif + path: metrics-csharp.sarif + retention-days: 20 + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@main + with: + sarif_file: metrics-csharp.sarif diff --git a/.github/workflows/csv-coverage-pr-artifacts.yml b/.github/workflows/csv-coverage-pr-artifacts.yml index 8b89b9b22c1..46d43cc411b 100644 --- a/.github/workflows/csv-coverage-pr-artifacts.yml +++ b/.github/workflows/csv-coverage-pr-artifacts.yml @@ -28,11 +28,11 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - MERGE - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: merge - name: Clone self (github/codeql) - BASE - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 path: base @@ -41,7 +41,7 @@ jobs: git log -1 --format='%H' working-directory: base - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 - name: Download CodeQL CLI @@ -69,21 +69,21 @@ jobs: run: | python base/misc/scripts/library-coverage/compare-folders.py out_base out_merge comparison.md - name: Upload CSV package list - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: csv-framework-coverage-merge path: | out_merge/framework-coverage-*.csv out_merge/framework-coverage-*.rst - name: Upload CSV package list - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: csv-framework-coverage-base path: | out_base/framework-coverage-*.csv out_base/framework-coverage-*.rst - name: Upload comparison results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: comparison path: | @@ -93,7 +93,7 @@ jobs: mkdir -p pr echo ${{ github.event.pull_request.number }} > pr/NR - name: Upload PR number - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: pr path: pr/ diff --git a/.github/workflows/csv-coverage-pr-comment.yml b/.github/workflows/csv-coverage-pr-comment.yml index 399fee33e5e..c819b068b9f 100644 --- a/.github/workflows/csv-coverage-pr-comment.yml +++ b/.github/workflows/csv-coverage-pr-comment.yml @@ -20,9 +20,9 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 diff --git a/.github/workflows/csv-coverage-timeseries.yml b/.github/workflows/csv-coverage-timeseries.yml index e7c01623e04..4243f640cd2 100644 --- a/.github/workflows/csv-coverage-timeseries.yml +++ b/.github/workflows/csv-coverage-timeseries.yml @@ -10,16 +10,16 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: script - name: Clone self (github/codeql) for analysis - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: codeqlModels fetch-depth: 0 - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 - name: Download CodeQL CLI @@ -35,7 +35,7 @@ jobs: echo $CLI PATH="$PATH:$CLI" python script/misc/scripts/library-coverage/generate-timeseries.py codeqlModels - name: Upload timeseries CSV - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: framework-coverage-timeseries path: framework-coverage-timeseries-*.csv diff --git a/.github/workflows/csv-coverage-update.yml b/.github/workflows/csv-coverage-update.yml index eb227ec844f..2c04d6c844f 100644 --- a/.github/workflows/csv-coverage-update.yml +++ b/.github/workflows/csv-coverage-update.yml @@ -17,12 +17,12 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: ql fetch-depth: 0 - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 - name: Download CodeQL CLI diff --git a/.github/workflows/csv-coverage.yml b/.github/workflows/csv-coverage.yml index c7ab92eb0f3..b5cd915fa9d 100644 --- a/.github/workflows/csv-coverage.yml +++ b/.github/workflows/csv-coverage.yml @@ -14,16 +14,16 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: script - name: Clone self (github/codeql) for analysis - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: codeqlModels ref: ${{ github.event.inputs.qlModelShaOverride || github.ref }} - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 - name: Download CodeQL CLI @@ -37,12 +37,12 @@ jobs: run: | PATH="$PATH:codeql-cli/codeql" python script/misc/scripts/library-coverage/generate-report.py ci codeqlModels script - name: Upload CSV package list - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: framework-coverage-csv path: framework-coverage-*.csv - name: Upload RST package list - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: framework-coverage-rst path: framework-coverage-*.rst diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml new file mode 100644 index 00000000000..12e162adf29 --- /dev/null +++ b/.github/workflows/go-tests.yml @@ -0,0 +1,161 @@ +name: "Go: Run Tests" +on: + pull_request: + paths: + - "go/**" + - .github/workflows/go-tests.yml +jobs: + + test-linux: + name: Test Linux (Ubuntu) + runs-on: ubuntu-latest + steps: + + - name: Set up Go 1.18.1 + uses: actions/setup-go@v3 + with: + go-version: 1.18.1 + id: go + + - name: Set up CodeQL CLI + run: | + echo "Removing old CodeQL Directory..." + rm -rf $HOME/codeql + echo "Done" + cd $HOME + echo "Downloading CodeQL CLI..." + LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | sort --version-sort | grep -v beta | tail -1) + gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-linux64.zip "$LATEST" + echo "Done" + echo "Unpacking CodeQL CLI..." + unzip -q codeql-linux64.zip + rm -f codeql-linux64.zip + echo "Done" + env: + GITHUB_TOKEN: ${{ github.token }} + + - name: Check out code + uses: actions/checkout@v2 + + - name: Enable problem matchers in repository + shell: bash + run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;' + + - name: Build + run: | + cd go + env PATH=$PATH:$HOME/codeql make + + - name: Check that all QL and Go code is autoformatted + run: | + cd go + env PATH=$PATH:$HOME/codeql make check-formatting + + - name: Compile qhelp files to markdown + run: | + cd go + env PATH=$PATH:$HOME/codeql QHELP_OUT_DIR=qhelp-out make qhelp-to-markdown + + - name: Upload qhelp markdown + uses: actions/upload-artifact@v2 + with: + name: qhelp-markdown + path: go/qhelp-out/**/*.md + + - name: Test + run: | + cd go + env PATH=$PATH:$HOME/codeql make test + + test-mac: + name: Test MacOS + runs-on: macOS-latest + steps: + - name: Set up Go 1.18.1 + uses: actions/setup-go@v3 + with: + go-version: 1.18.1 + id: go + + - name: Set up CodeQL CLI + run: | + echo "Removing old CodeQL Directory..." + rm -rf $HOME/codeql + echo "Done" + cd $HOME + echo "Downloading CodeQL CLI..." + LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | sort --version-sort | grep -v beta | tail -1) + gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-osx64.zip "$LATEST" + echo "Done" + echo "Unpacking CodeQL CLI..." + unzip -q codeql-osx64.zip + rm -f codeql-osx64.zip + echo "Done" + env: + GITHUB_TOKEN: ${{ github.token }} + + - name: Check out code + uses: actions/checkout@v2 + + - name: Enable problem matchers in repository + shell: bash + run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;' + + - name: Build + run: | + cd go + env PATH=$PATH:$HOME/codeql make + + - name: Test + run: | + cd go + env PATH=$PATH:$HOME/codeql make test + + test-win: + name: Test Windows + runs-on: windows-2019 + steps: + - name: Set up Go 1.18.1 + uses: actions/setup-go@v3 + with: + go-version: 1.18.1 + id: go + + - name: Set up CodeQL CLI + run: | + echo "Removing old CodeQL Directory..." + rm -rf $HOME/codeql + echo "Done" + cd "$HOME" + echo "Downloading CodeQL CLI..." + LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | sort --version-sort | grep -v beta | tail -1) + gh release download --repo https://github.com/github/codeql-cli-binaries --pattern codeql-win64.zip "$LATEST" + echo "Done" + echo "Unpacking CodeQL CLI..." + unzip -q -o codeql-win64.zip + unzip -q -o codeql-win64.zip codeql/codeql.exe + rm -f codeql-win64.zip + echo "Done" + env: + GITHUB_TOKEN: ${{ github.token }} + shell: + bash + + - name: Check out code + uses: actions/checkout@v2 + + - name: Enable problem matchers in repository + shell: bash + run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;' + + - name: Build + run: | + $Env:Path += ";$HOME\codeql" + cd go + make + + - name: Test + run: | + $Env:Path += ";$HOME\codeql" + cd go + make test diff --git a/.github/workflows/js-ml-tests.yml b/.github/workflows/js-ml-tests.yml index 35d8a2378e4..e6401a09c35 100644 --- a/.github/workflows/js-ml-tests.yml +++ b/.github/workflows/js-ml-tests.yml @@ -22,7 +22,7 @@ jobs: name: Check QL formatting runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql @@ -35,7 +35,7 @@ jobs: name: Check QL compilation runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql @@ -59,7 +59,7 @@ jobs: name: Run QL tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 3606bd75cc5..31e78f82a62 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -6,6 +6,6 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v2 + - uses: actions/labeler@v4 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/mad_modelDiff.yml b/.github/workflows/mad_modelDiff.yml index a4b9169b44e..3a1f52c532e 100644 --- a/.github/workflows/mad_modelDiff.yml +++ b/.github/workflows/mad_modelDiff.yml @@ -27,12 +27,12 @@ jobs: slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}} steps: - name: Clone github/codeql from PR - uses: actions/checkout@v2 + uses: actions/checkout@v3 if: github.event.pull_request with: path: codeql-pr - name: Clone github/codeql from main - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: codeql-main ref: main @@ -91,12 +91,12 @@ jobs: name="diff_${basename/_main.qll/""}" (diff -w -u $m $t | diff2html -i stdin -F $MODELS/$name.html) || true done - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: models path: tmp-models/*.qll retention-days: 20 - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: diffs path: tmp-models/*.html diff --git a/.github/workflows/mad_regenerate-models.yml b/.github/workflows/mad_regenerate-models.yml index 03e64816f9d..735e224d0d6 100644 --- a/.github/workflows/mad_regenerate-models.yml +++ b/.github/workflows/mad_regenerate-models.yml @@ -26,11 +26,11 @@ jobs: ref: "placeholder" steps: - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup CodeQL binaries uses: ./.github/actions/fetch-codeql - name: Clone repositories - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: repos/${{ matrix.ref }} ref: ${{ matrix.ref }} @@ -55,7 +55,7 @@ jobs: find java -name "*.qll" -print0 | xargs -0 git add git status git diff --cached > models.patch - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: patch path: models.patch diff --git a/.github/workflows/post-pr-comment.yml b/.github/workflows/post-pr-comment.yml index 0d92b0af7eb..7a86909371f 100644 --- a/.github/workflows/post-pr-comment.yml +++ b/.github/workflows/post-pr-comment.yml @@ -1,12 +1,17 @@ -name: Post pull-request comment +# This workflow is the second part of the process described in +# .github/workflows/qhelp-pr-preview.yml +# See that file for more info. + +name: Post PR comment on: workflow_run: - workflows: ["Query help preview"] + workflows: [Render QHelp changes] types: - completed permissions: pull-requests: write + actions: read jobs: post_comment: @@ -17,15 +22,53 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} - - run: | - PR="$(grep -o '^[0-9]\+$' pr.txt)" + + - name: Check that PR SHA matches workflow SHA + run: | + PR="$(grep -o '^[0-9]\+$' pr_number.txt)" PR_HEAD_SHA="$(gh api "/repos/${GITHUB_REPOSITORY}/pulls/${PR}" --jq .head.sha)" # Check that the pull-request head SHA matches the head SHA of the workflow run if [ "${WORKFLOW_RUN_HEAD_SHA}" != "${PR_HEAD_SHA}" ]; then echo "PR head SHA ${PR_HEAD_SHA} does not match workflow_run event SHA ${WORKFLOW_RUN_HEAD_SHA}. Stopping." 1>&2 exit 1 fi - gh pr comment "${PR}" --repo "${GITHUB_REPOSITORY}" -F comment.txt env: GITHUB_TOKEN: ${{ github.token }} WORKFLOW_RUN_HEAD_SHA: ${{ github.event.workflow_run.head_commit.id }} + + - name: Create or update comment + run: | + COMMENT_PREFIX="QHelp previews" + COMMENT_AUTHOR="github-actions[bot]" + PR_NUMBER="$(grep -o '^[0-9]\+$' pr_number.txt)" + + # If there is no existing comment, comment_id.txt will contain just a + # newline (due to jq & gh behaviour). This will cause grep to fail, so + # we catch that. + RAW_COMMENT_ID=$(grep -o '^[0-9]\+$' comment_id.txt || true) + + if [ $RAW_COMMENT_ID ] + then + # Fetch existing comment, and validate: + # - comment belongs to the PR with number $PR_NUMBER + # - comment starts with the expected prefix ("QHelp previews") + # - comment author is github-actions[bot] + FILTER='select(.issue_url | endswith($repo+"/issues/"+$pr)) + | select(.body | startswith($prefix)) + | select(.user.login == $author) + | .id' + COMMENT_ID=$(gh api "repos/${GITHUB_REPOSITORY}/issues/comments/${RAW_COMMENT_ID}" | jq --arg repo "${GITHUB_REPOSITORY}" --arg pr "${PR_NUMBER}" --arg prefix "${COMMENT_PREFIX}" --arg author "${COMMENT_AUTHOR}" "${FILTER}") + if [ $COMMENT_ID ] + then + # Update existing comment + jq --rawfile body comment_body.txt '{"body":$body}' -n | gh api "repos/${GITHUB_REPOSITORY}/issues/comments/${COMMENT_ID}" -X PATCH --input - + else + echo "Comment ${RAW_COMMENT_ID} did not pass validations: not editing." >&2 + exit 1 + fi + else + # Create new comment + jq --rawfile body comment_body.txt '{"body":$body}' -n | gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" -X POST --input - + fi + env: + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/qhelp-pr-preview.yml b/.github/workflows/qhelp-pr-preview.yml index ade85a730e1..8aba0a0c5e3 100644 --- a/.github/workflows/qhelp-pr-preview.yml +++ b/.github/workflows/qhelp-pr-preview.yml @@ -1,7 +1,25 @@ -name: Query help preview +# This workflow checks for any changes in .qhelp files in pull requests. +# For any changed files, it renders them to markdown in a file called `comment_body.txt`. +# It then checks if there's an existing comment on the pull request generated by +# this workflow, and writes the comment ID to `comment_id.txt`. +# It also writes the PR number to `pr_number.txt`. +# These three files are uploaded as an artifact. + +# When this workflow completes, the workflow "Post PR comment" runs. +# It downloads the artifact and adds a comment to the PR with the rendered +# QHelp. + +# The task is split like this because creating PR comments requires extra +# permissions that we don't want to expose to PRs from external forks. + +# For more info see: +# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run +# https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token +name: Render QHelp changes permissions: contents: read + pull-requests: read on: pull_request: @@ -15,13 +33,17 @@ jobs: qhelp: runs-on: ubuntu-latest steps: - - run: echo "${{ github.event.number }}" > pr.txt - - uses: actions/upload-artifact@v2 + - run: echo "${PR_NUMBER}" > pr_number.txt + env: + PR_NUMBER: ${{ github.event.number }} + - uses: actions/upload-artifact@v3 with: name: comment - path: pr.txt + path: pr_number.txt + if-no-files-found: error retention-days: 1 - - uses: actions/checkout@v2 + + - uses: actions/checkout@v3 with: fetch-depth: 2 persist-credentials: false @@ -36,7 +58,7 @@ jobs: - name: QHelp preview run: | EXIT_CODE=0 - echo "QHelp previews:" > comment.txt + echo "QHelp previews:" > comment_body.txt while read -r -d $'\0' path; do if [ ! -f "${path}" ]; then exit 1 @@ -52,12 +74,29 @@ jobs: echo '```' fi echo "" - done < "${RUNNER_TEMP}/paths.txt" >> comment.txt + done < "${RUNNER_TEMP}/paths.txt" >> comment_body.txt exit "${EXIT_CODE}" - if: always() - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: comment - path: comment.txt + path: comment_body.txt + if-no-files-found: error + retention-days: 1 + + - name: Save ID of existing QHelp comment (if it exists) + run: | + # Find the latest comment starting with "QHelp previews" + COMMENT_PREFIX="QHelp previews" + gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" --paginate | jq --arg prefix "${COMMENT_PREFIX}" '[.[] | select(.body|startswith($prefix)) | .id] | max' > comment_id.txt + env: + GITHUB_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.number }} + + - uses: actions/upload-artifact@v3 + with: + name: comment + path: comment_id.txt + if-no-files-found: error retention-days: 1 diff --git a/.github/workflows/ql-for-ql-build.yml b/.github/workflows/ql-for-ql-build.yml index 255540fd49d..6b4f6a0abee 100644 --- a/.github/workflows/ql-for-ql-build.yml +++ b/.github/workflows/ql-for-ql-build.yml @@ -13,12 +13,13 @@ jobs: queries: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Find codeql id: find-codeql - uses: github/codeql-action/init@erik-krogh/ql + uses: github/codeql-action/init@aa93aea877e5fb8841bcb1193f672abf6e9f2980 with: languages: javascript # does not matter + tools: latest - name: Get CodeQL version id: get-codeql-version run: | @@ -28,7 +29,7 @@ jobs: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} - name: Cache queries id: cache-queries - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ${{ runner.temp }}/query-pack.zip key: queries-${{ hashFiles('ql/**/*.ql*') }}-${{ hashFiles('ql/**/qlpack.yml') }}-${{ hashFiles('ql/ql/src/ql.dbscheme*') }}-${{ steps.get-codeql-version.outputs.version }} @@ -43,7 +44,7 @@ jobs: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} PACKZIP: ${{ runner.temp }}/query-pack.zip - name: Upload query pack - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: query-pack-zip path: ${{ runner.temp }}/query-pack.zip @@ -55,10 +56,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Cache entire extractor id: cache-extractor - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ql/target/release/ql-autobuilder @@ -68,7 +69,7 @@ jobs: key: ${{ runner.os }}-extractor-${{ hashFiles('ql/**/Cargo.lock') }}-${{ hashFiles('ql/**/*.rs') }} - name: Cache cargo if: steps.cache-extractor.outputs.cache-hit != 'true' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ~/.cargo/registry @@ -90,7 +91,7 @@ jobs: - name: Generate dbscheme if: steps.cache-extractor.outputs.cache-hit != 'true' run: ql/target/release/ql-generator --dbscheme ql/ql/src/ql.dbscheme --library ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: extractor-ubuntu-latest path: | @@ -107,12 +108,12 @@ jobs: - queries steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v2 + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 with: name: query-pack-zip path: query-pack-zip - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: extractor-ubuntu-latest path: linux64 @@ -130,7 +131,7 @@ jobs: fi cd pack zip -rq ../codeql-ql.zip . - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: codeql-ql-pack path: codeql-ql.zip @@ -139,14 +140,14 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - folder: [cpp, csharp, java, javascript, python, ql, ruby] + folder: [cpp, csharp, java, javascript, python, ql, ruby, swift, go] needs: - package steps: - name: Download pack - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: codeql-ql-pack path: ${{ runner.temp }}/codeql-ql-pack-artifact @@ -159,40 +160,43 @@ jobs: PACK: ${{ runner.temp }}/pack - name: Hack codeql-action options run: | - JSON=$(jq -nc --arg pack "${PACK}" '.resolve.queries=["--search-path", $pack] | .resolve.extractor=["--search-path", $pack] | .database.init=["--search-path", $pack]') + JSON=$(jq -nc --arg pack "${PACK}" '.database."run-queries"=["--search-path", $pack] | .resolve.queries=["--search-path", $pack] | .resolve.extractor=["--search-path", $pack] | .database.init=["--search-path", $pack]') echo "CODEQL_ACTION_EXTRA_OPTIONS=${JSON}" >> ${GITHUB_ENV} env: PACK: ${{ runner.temp }}/pack - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Create CodeQL config file run: | echo "paths:" > ${CONF} echo " - ${FOLDER}" >> ${CONF} echo "paths-ignore:" >> ${CONF} - echo " - ql/ql/test" >> ${CONF} + echo " - ql/ql/test" >> ${CONF} + echo "disable-default-queries: true" >> ${CONF} + echo "packs:" >> ${CONF} + echo " - codeql/ql" >> ${CONF} echo "Config file: " cat ${CONF} env: CONF: ./ql-for-ql-config.yml FOLDER: ${{ matrix.folder }} - - name: Initialize CodeQL - uses: github/codeql-action/init@erik-krogh/ql + uses: github/codeql-action/init@aa93aea877e5fb8841bcb1193f672abf6e9f2980 with: languages: ql db-location: ${{ runner.temp }}/db config-file: ./ql-for-ql-config.yml + tools: latest - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@erik-krogh/ql + uses: github/codeql-action/analyze@aa93aea877e5fb8841bcb1193f672abf6e9f2980 with: category: "ql-for-ql-${{ matrix.folder }}" - name: Copy sarif file to CWD run: cp ../results/ql.sarif ./${{ matrix.folder }}.sarif - name: Sarif as artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ matrix.folder }}.sarif path: ${{ matrix.folder }}.sarif diff --git a/.github/workflows/ql-for-ql-dataset_measure.yml b/.github/workflows/ql-for-ql-dataset_measure.yml index c103f64ede9..cf3b696f3b8 100644 --- a/.github/workflows/ql-for-ql-dataset_measure.yml +++ b/.github/workflows/ql-for-ql-dataset_measure.yml @@ -19,17 +19,16 @@ jobs: matrix: repo: - github/codeql - - github/codeql-go runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Find codeql id: find-codeql - uses: github/codeql-action/init@erik-krogh/ql + uses: github/codeql-action/init@aa93aea877e5fb8841bcb1193f672abf6e9f2980 with: languages: javascript # does not matter - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.cargo/registry @@ -41,7 +40,7 @@ jobs: env: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} - name: Checkout ${{ matrix.repo }} - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: ${{ matrix.repo }} path: ${{ github.workspace }}/repo @@ -60,7 +59,7 @@ jobs: "${CODEQL}" dataset measure --threads 4 --output "stats/${{ matrix.repo }}/stats.xml" "${{ runner.temp }}/database/db-ql" env: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: measurements path: stats @@ -70,15 +69,15 @@ jobs: runs-on: ubuntu-latest needs: measure steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v2 + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 with: name: measurements path: stats - run: | python -m pip install --user lxml - find stats -name 'stats.xml' -print0 | sort -z | xargs -0 python ql/scripts/merge_stats.py --output ql/ql/src/ql.dbscheme.stats --normalise ql_tokeninfo - - uses: actions/upload-artifact@v2 + find stats -name 'stats.xml' -print0 | sort -z | xargs -0 python ruby/scripts/merge_stats.py --output ql/ql/src/ql.dbscheme.stats --normalise ql_tokeninfo + - uses: actions/upload-artifact@v3 with: name: ql.dbscheme.stats path: ql/ql/src/ql.dbscheme.stats diff --git a/.github/workflows/ql-for-ql-tests.yml b/.github/workflows/ql-for-ql-tests.yml index 2e5eb845ed5..a6c79237759 100644 --- a/.github/workflows/ql-for-ql-tests.yml +++ b/.github/workflows/ql-for-ql-tests.yml @@ -17,13 +17,13 @@ jobs: qltest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Find codeql id: find-codeql - uses: github/codeql-action/init@erik-krogh/ql + uses: github/codeql-action/init@aa93aea877e5fb8841bcb1193f672abf6e9f2980 with: languages: javascript # does not matter - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.cargo/registry diff --git a/.github/workflows/query-list.yml b/.github/workflows/query-list.yml index a9f24b8c9c7..7484cc4a7a4 100644 --- a/.github/workflows/query-list.yml +++ b/.github/workflows/query-list.yml @@ -17,33 +17,23 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: codeql - - name: Clone github/codeql-go - uses: actions/checkout@v2 - with: - repository: 'github/codeql-go' - path: codeql-go - name: Set up Python 3.8 - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: 3.8 - name: Download CodeQL CLI - uses: dsaltares/fetch-gh-release-asset@aa37ae5c44d3c9820bc12fe675e8670ecd93bd1c - with: - repo: "github/codeql-cli-binaries" - version: "latest" - file: "codeql-linux64.zip" - token: ${{ secrets.GITHUB_TOKEN }} + # Look under the `codeql` directory, as this is where we checked out the `github/codeql` repo + uses: ./codeql/.github/actions/fetch-codeql - name: Unzip CodeQL CLI run: unzip -d codeql-cli codeql-linux64.zip - name: Build code scanning query list run: | - PATH="$PATH:codeql-cli/codeql" python codeql/misc/scripts/generate-code-scanning-query-list.py > code-scanning-query-list.csv + python codeql/misc/scripts/generate-code-scanning-query-list.py > code-scanning-query-list.csv - name: Upload code scanning query list - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: code-scanning-query-list path: code-scanning-query-list.csv - diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 63aff63b9d6..9e95839789f 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -38,13 +38,13 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install GNU tar if: runner.os == 'macOS' run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.cargo/registry @@ -62,17 +62,17 @@ jobs: - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' }} run: target/release/ruby-generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: ${{ matrix.os == 'ubuntu-latest' }} with: name: ruby.dbscheme path: ruby/ql/lib/ruby.dbscheme - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: ${{ matrix.os == 'ubuntu-latest' }} with: name: TreeSitter.qll path: ruby/ql/lib/codeql/ruby/ast/internal/TreeSitter.qll - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: extractor-${{ matrix.os }} path: | @@ -86,7 +86,7 @@ jobs: env: CODEQL_THREADS: 4 # TODO: remove this once it's set by the CLI steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Fetch CodeQL run: | LATEST=$(gh release list --repo https://github.com/github/codeql-cli-binaries | cut -f 1 | grep -v beta | sort --version-sort | tail -1) @@ -102,7 +102,7 @@ jobs: PACK_FOLDER=$(readlink -f target/packs/codeql/ruby-queries/*) codeql/codeql generate query-help --format=sarifv2.1.0 --output="${PACK_FOLDER}/rules.sarif" ql/src (cd ql/src; find queries \( -name '*.qhelp' -o -name '*.rb' -o -name '*.erb' \) -exec bash -c 'mkdir -p "'"${PACK_FOLDER}"'/$(dirname "{}")"' \; -exec cp "{}" "${PACK_FOLDER}/{}" \;) - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: codeql-ruby-queries path: | @@ -113,20 +113,20 @@ jobs: runs-on: ubuntu-latest needs: [build, compile-queries] steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v2 + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 with: name: ruby.dbscheme path: ruby/ruby - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: extractor-ubuntu-latest path: ruby/linux64 - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: extractor-windows-latest path: ruby/win64 - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: extractor-macos-latest path: ruby/osx64 @@ -142,12 +142,12 @@ jobs: cp win64/ruby-extractor.exe ruby/tools/win64/extractor.exe chmod +x ruby/tools/{linux64,osx64}/{autobuilder,extractor} zip -rq codeql-ruby.zip ruby - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: codeql-ruby-pack path: ruby/codeql-ruby.zip retention-days: 1 - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: codeql-ruby-queries path: ruby/qlpacks @@ -159,7 +159,7 @@ jobs: ] }' > .codeqlmanifest.json zip -rq codeql-ruby-bundle.zip .codeqlmanifest.json ruby qlpacks - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: codeql-ruby-bundle path: ruby/codeql-ruby-bundle.zip @@ -177,7 +177,7 @@ jobs: runs-on: ${{ matrix.os }} needs: [package] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: repository: Shopify/example-ruby-app ref: 67a0decc5eb550f3a9228eda53925c3afd40dfe9 @@ -191,7 +191,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} working-directory: ${{ runner.temp }} - name: Download Ruby bundle - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: codeql-ruby-bundle path: ${{ runner.temp }} diff --git a/.github/workflows/ruby-dataset-measure.yml b/.github/workflows/ruby-dataset-measure.yml index ea923770dca..bb8bb6858fd 100644 --- a/.github/workflows/ruby-dataset-measure.yml +++ b/.github/workflows/ruby-dataset-measure.yml @@ -27,14 +27,14 @@ jobs: repo: [rails/rails, discourse/discourse, spree/spree, ruby/ruby] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql - uses: ./ruby/actions/create-extractor-pack - name: Checkout ${{ matrix.repo }} - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: ${{ matrix.repo }} path: ${{ github.workspace }}/repo @@ -49,7 +49,7 @@ jobs: run: | mkdir -p "stats/${{ matrix.repo }}" codeql dataset measure --threads 4 --output "stats/${{ matrix.repo }}/stats.xml" "${{ runner.temp }}/database/db-ruby" - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: measurements path: stats @@ -59,15 +59,15 @@ jobs: runs-on: ubuntu-latest needs: measure steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v2 + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 with: name: measurements path: stats - run: | python -m pip install --user lxml find stats -name 'stats.xml' | sort | xargs python ruby/scripts/merge_stats.py --output ruby/ql/lib/ruby.dbscheme.stats --normalise ruby_tokeninfo - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ruby.dbscheme.stats path: ruby/ql/lib/ruby.dbscheme.stats diff --git a/.github/workflows/ruby-qltest.yml b/.github/workflows/ruby-qltest.yml index 99dfe4ba1ca..463c501c765 100644 --- a/.github/workflows/ruby-qltest.yml +++ b/.github/workflows/ruby-qltest.yml @@ -27,14 +27,14 @@ jobs: qlformat: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql - name: Check QL formatting run: find ql "(" -name "*.ql" -or -name "*.qll" ")" -print0 | xargs -0 codeql query format --check-only qlcompile: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql - name: Check QL compilation run: | @@ -44,7 +44,7 @@ jobs: qlupgrade: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql - name: Check DB upgrade scripts run: | @@ -63,10 +63,11 @@ jobs: qltest: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: slice: ["1/2", "2/2"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: ./.github/actions/fetch-codeql - uses: ./ruby/actions/create-extractor-pack - name: Run QL tests diff --git a/.github/workflows/swift-codegen.yml b/.github/workflows/swift-codegen.yml new file mode 100644 index 00000000000..b0415606415 --- /dev/null +++ b/.github/workflows/swift-codegen.yml @@ -0,0 +1,32 @@ +name: "Swift: Check code generation" + +on: + pull_request: + paths: + - "swift/**" + - .github/workflows/swift-codegen.yml + branches: + - main + +jobs: + codegen: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/fetch-codeql + - uses: bazelbuild/setup-bazelisk@v2 + - name: Run unit tests + run: | + bazel test //swift/codegen/test --test_output=errors + - name: Check that QL generated code was checked in + run: | + bazel run //swift/codegen + git add swift + git diff --exit-code --stat HEAD + - name: Generate C++ files + run: | + bazel run //swift/codegen:cppcodegen -- --cpp-output=$PWD/swift-generated-headers + - uses: actions/upload-artifact@v3 + with: + name: swift-generated-headers + path: swift-generated-headers/*.h diff --git a/.github/workflows/swift-qltest.yml b/.github/workflows/swift-qltest.yml new file mode 100644 index 00000000000..e0cc5a1cd02 --- /dev/null +++ b/.github/workflows/swift-qltest.yml @@ -0,0 +1,39 @@ +name: "Swift: Run QL Tests" + +on: + pull_request: + paths: + - "swift/**" + - .github/workflows/swift-qltest.yml + branches: + - main +defaults: + run: + working-directory: swift + +jobs: + qlformat: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/fetch-codeql + - name: Check QL formatting + run: find ql "(" -name "*.ql" -or -name "*.qll" ")" -print0 | xargs -0 codeql query format --check-only + qltest: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os : [ubuntu-20.04, macos-latest] + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/fetch-codeql + - uses: bazelbuild/setup-bazelisk@v2 + - name: Build Swift extractor + run: | + bazel run //swift:create-extractor-pack + - name: Run QL tests + run: | + codeql test run --threads=0 --ram 5000 --search-path "${{ github.workspace }}/swift/extractor-pack" --check-databases --check-unused-labels --check-repeated-labels --check-redefined-labels --check-use-before-definition ql/test + env: + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/sync-files.yml b/.github/workflows/sync-files.yml index e41f4b75dc6..afa1e78edfa 100644 --- a/.github/workflows/sync-files.yml +++ b/.github/workflows/sync-files.yml @@ -14,7 +14,7 @@ jobs: sync: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Check synchronized files run: python config/sync-files.py diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml index 2547b34d6a8..798913746be 100644 --- a/.github/workflows/validate-change-notes.yml +++ b/.github/workflows/validate-change-notes.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql diff --git a/.gitignore b/.gitignore index 7cef88986a8..fd9e5b6a07e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ # qltest projects and artifacts */ql/test/**/*.testproj */ql/test/**/*.actual +*/ql/test/**/go.sum # Visual studio temporaries, except a file used by QL4VS .vs/* @@ -17,9 +18,12 @@ # Byte-compiled python files *.pyc -# python virtual environment folder +# python virtual environment folder .venv/ +# binary files created by pytest-cov +.coverage + # It's useful (though not required) to be able to unpack codeql in the ql checkout itself /codeql/ @@ -29,4 +33,25 @@ csharp/extractor/Semmle.Extraction.CSharp.Driver/Properties/launchSettings.json .codeql # Compiled class file -*.class \ No newline at end of file +*.class + +# links created by bazel +/bazel-* + +# local bazel options +/local.bazelrc + +# CLion project files +/.clwb + +# Go build artifacts +go/build/* + +# Go binaries +go/tools/bin +go/tools/linux64 +go/tools/osx64 +go/tools/win64 +go/tools/tokenizer.jar +go/main + diff --git a/.lgtm.yml b/.lgtm.yml index ca0d8fa4eeb..b544d59f520 100755 --- a/.lgtm.yml +++ b/.lgtm.yml @@ -6,6 +6,7 @@ path_classifiers: test: - csharp/ql/src - csharp/ql/test + - go/ql/test - javascript/extractor/parser-tests - javascript/extractor/tests - javascript/ql/src @@ -13,6 +14,9 @@ path_classifiers: - python/ql/src - python/ql/test + example: + - go/ql/src + queries: - include: "*" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..ccbe07a8aa4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,51 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + exclude: /test/.*$(?= Date.now() - 14 * 31 * 24 * 60 * 60 * 1000) { + continue; + } + const message = `${file}:${lineNumber} was last updated on ${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`; + yield [message, date]; + } catch (e) { + console.log(e); + console.log("----"); + console.log(line); + console.log("----"); + process.exit(0); + } + } + } + } +} +[...deprecationMessages(".")] + .sort((a, b) => a[1].getTime() - b[1].getTime()) + .forEach((msg) => console.log(msg[0])); diff --git a/config/identical-files.json b/config/identical-files.json index bef8b72c87e..d6af2fc7e1d 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -22,12 +22,15 @@ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll", + "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll", "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll" + "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll", + "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForLibraries.qll", + "swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll" ], "DataFlow Java/C++/C#/Python Common": [ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll", @@ -35,7 +38,8 @@ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll" + "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll", + "swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll" ], "TaintTracking::Configuration Java/C++/C#/Python": [ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", @@ -50,11 +54,14 @@ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll", "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", + "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll", "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTrackingImpl.qll", "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking2/TaintTrackingImpl.qll", "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking3/TaintTrackingImpl.qll", "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking4/TaintTrackingImpl.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTrackingImpl.qll" + "ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", + "ruby/ql/lib/codeql/ruby/dataflow/internal/tainttrackingforlibraries/TaintTrackingImpl.qll", + "swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTrackingImpl.qll" ], "DataFlow Java/C++/C#/Python Consistency checks": [ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll", @@ -62,7 +69,8 @@ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll", "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplConsistency.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplConsistency.qll" + "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplConsistency.qll", + "swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplConsistency.qll" ], "DataFlow Java/C# Flow Summaries": [ "java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll", @@ -73,6 +81,10 @@ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll" ], + "Model as Data Generation Java/C# - CaptureModels": [ + "java/ql/src/utils/model-generator/internal/CaptureModels.qll", + "csharp/ql/src/utils/model-generator/internal/CaptureModels.qll" + ], "Sign Java/C#": [ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll" @@ -377,7 +389,8 @@ "csharp/ql/test/TestUtilities/InlineExpectationsTest.qll", "java/ql/test/TestUtilities/InlineExpectationsTest.qll", "python/ql/test/TestUtilities/InlineExpectationsTest.qll", - "ruby/ql/test/TestUtilities/InlineExpectationsTest.qll" + "ruby/ql/test/TestUtilities/InlineExpectationsTest.qll", + "ql/ql/test/TestUtilities/InlineExpectationsTest.qll" ], "C++ ExternalAPIs": [ "cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll", @@ -426,7 +439,6 @@ "python/ql/src/Lexical/CommentedOutCodeMetricOverview.inc.qhelp" ], "FLinesOfDuplicatedCodeCommon.inc.qhelp": [ - "cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp", "java/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp", "javascript/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp", "python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp" @@ -451,7 +463,8 @@ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll", "csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll", "ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImplCommon.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll" + "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll", + "swift/ql/lib/codeql/swift/dataflow/internal/SsaImplCommon.qll" ], "CryptoAlgorithms Python/JS/Ruby": [ "javascript/ql/lib/semmle/javascript/security/CryptoAlgorithms.qll", @@ -468,19 +481,23 @@ "python/ql/lib/semmle/python/security/internal/SensitiveDataHeuristics.qll", "ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll" ], - "ReDoS Util Python/JS/Ruby": [ + "ReDoS Util Python/JS/Ruby/Java": [ "javascript/ql/lib/semmle/javascript/security/performance/ReDoSUtil.qll", "python/ql/lib/semmle/python/security/performance/ReDoSUtil.qll", - "ruby/ql/lib/codeql/ruby/security/performance/ReDoSUtil.qll" + "ruby/ql/lib/codeql/ruby/security/performance/ReDoSUtil.qll", + "java/ql/lib/semmle/code/java/security/performance/ReDoSUtil.qll" ], - "ReDoS Exponential Python/JS": [ + "ReDoS Exponential Python/JS/Ruby/Java": [ "javascript/ql/lib/semmle/javascript/security/performance/ExponentialBackTracking.qll", - "python/ql/lib/semmle/python/security/performance/ExponentialBackTracking.qll" + "python/ql/lib/semmle/python/security/performance/ExponentialBackTracking.qll", + "ruby/ql/lib/codeql/ruby/security/performance/ExponentialBackTracking.qll", + "java/ql/lib/semmle/code/java/security/performance/ExponentialBackTracking.qll" ], - "ReDoS Polynomial Python/JS": [ + "ReDoS Polynomial Python/JS/Ruby/Java": [ "javascript/ql/lib/semmle/javascript/security/performance/SuperlinearBackTracking.qll", "python/ql/lib/semmle/python/security/performance/SuperlinearBackTracking.qll", - "ruby/ql/lib/codeql/ruby/security/performance/SuperlinearBackTracking.qll" + "ruby/ql/lib/codeql/ruby/security/performance/SuperlinearBackTracking.qll", + "java/ql/lib/semmle/code/java/security/performance/SuperlinearBackTracking.qll" ], "BadTagFilterQuery Python/JS/Ruby": [ "javascript/ql/lib/semmle/javascript/security/BadTagFilterQuery.qll", @@ -489,7 +506,8 @@ ], "CFG": [ "csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll", - "ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImplShared.qll" + "ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImplShared.qll", + "swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplShared.qll" ], "TypeTracker": [ "python/ql/lib/semmle/python/dataflow/new/internal/TypeTracker.qll", @@ -508,5 +526,43 @@ "java/ql/lib/semmle/code/java/dataflow/internal/AccessPathSyntax.qll", "javascript/ql/lib/semmle/javascript/frameworks/data/internal/AccessPathSyntax.qll", "ruby/ql/lib/codeql/ruby/dataflow/internal/AccessPathSyntax.qll" + ], + "IncompleteUrlSubstringSanitization": [ + "javascript/ql/src/Security/CWE-020/IncompleteUrlSubstringSanitization.qll", + "ruby/ql/src/queries/security/cwe-020/IncompleteUrlSubstringSanitization.qll" + ], + "Concepts Python/Ruby/JS": [ + "python/ql/lib/semmle/python/internal/ConceptsShared.qll", + "ruby/ql/lib/codeql/ruby/internal/ConceptsShared.qll", + "javascript/ql/lib/semmle/javascript/internal/ConceptsShared.qll" + ], + "Hostname Regexp queries": [ + "javascript/ql/src/Security/CWE-020/HostnameRegexpShared.qll", + "python/ql/src/Security/CWE-020/HostnameRegexpShared.qll", + "ruby/ql/src/queries/security/cwe-020/HostnameRegexpShared.qll" + ], + "ApiGraphModels": [ + "javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll", + "ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll" + ], + "TaintedFormatStringQuery Ruby/JS": [ + "javascript/ql/lib/semmle/javascript/security/dataflow/TaintedFormatStringQuery.qll", + "ruby/ql/lib/codeql/ruby/security/TaintedFormatStringQuery.qll" + ], + "TaintedFormatStringCustomizations Ruby/JS": [ + "javascript/ql/lib/semmle/javascript/security/dataflow/TaintedFormatStringCustomizations.qll", + "ruby/ql/lib/codeql/ruby/security/TaintedFormatStringCustomizations.qll" + ], + "HttpToFileAccessQuery JS/Ruby": [ + "javascript/ql/lib/semmle/javascript/security/dataflow/HttpToFileAccessQuery.qll", + "ruby/ql/lib/codeql/ruby/security/HttpToFileAccessQuery.qll" + ], + "HttpToFileAccessCustomizations JS/Ruby": [ + "javascript/ql/lib/semmle/javascript/security/dataflow/HttpToFileAccessCustomizations.qll", + "ruby/ql/lib/codeql/ruby/security/HttpToFileAccessCustomizations.qll" + ], + "Typo database": [ + "javascript/ql/src/Expressions/TypoDatabase.qll", + "ql/ql/src/codeql_ql/style/TypoDatabase.qll" ] -} +} \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 00000000000..a118fa835ef --- /dev/null +++ b/conftest.py @@ -0,0 +1 @@ +# this empty file adds the repo root to PYTHON_PATH when running pytest diff --git a/cpp/BUILD.bazel b/cpp/BUILD.bazel new file mode 100644 index 00000000000..5341bd20390 --- /dev/null +++ b/cpp/BUILD.bazel @@ -0,0 +1,17 @@ +package(default_visibility = ["//visibility:public"]) + +load("@rules_pkg//:mappings.bzl", "pkg_filegroup") + +alias( + name = "dbscheme", + actual = "//cpp/ql/lib:dbscheme", +) + +pkg_filegroup( + name = "db-files", + srcs = [ + ":dbscheme", + "//cpp/downgrades", + "//cpp/ql/lib:dbscheme-stats", + ], +) diff --git a/cpp/downgrades/BUILD.bazel b/cpp/downgrades/BUILD.bazel new file mode 100644 index 00000000000..adf540e9a20 --- /dev/null +++ b/cpp/downgrades/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") + +pkg_files( + name = "downgrades", + srcs = glob( + ["**"], + exclude = ["BUILD.bazel"], + ), + prefix = "cpp/downgrades", + strip_prefix = strip_prefix.from_pkg(), + visibility = ["//cpp:__pkg__"], +) diff --git a/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/exprparents.ql b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/exprparents.ql new file mode 100644 index 00000000000..baddd72c144 --- /dev/null +++ b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/exprparents.ql @@ -0,0 +1,21 @@ +class Element extends @element { + string toString() { none() } +} + +class Expr extends @expr { + string toString() { none() } +} + +class Stmt extends @stmt { + string toString() { none() } +} + +predicate isStmtWithInitializer(Stmt stmt) { + exists(int kind | stmts(stmt, kind, _) | kind = 2 or kind = 11 or kind = 35) +} + +from Expr child, int index, int index_new, Element parent +where + exprparents(child, index, parent) and + if isStmtWithInitializer(parent) then index_new = index - 1 else index_new = index +select child, index_new, parent diff --git a/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/old.dbscheme b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/old.dbscheme new file mode 100644 index 00000000000..cf72c8898d1 --- /dev/null +++ b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/old.dbscheme @@ -0,0 +1,2111 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/semmlecode.cpp.dbscheme b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..e9a518baf14 --- /dev/null +++ b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/semmlecode.cpp.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/stmtparents.ql b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/stmtparents.ql new file mode 100644 index 00000000000..85465fdf8a3 --- /dev/null +++ b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/stmtparents.ql @@ -0,0 +1,22 @@ +class Element extends @element { + string toString() { none() } +} + +class Stmt extends @stmt { + string toString() { none() } +} + +predicate isStmtWithInitializer(Stmt stmt) { + exists(int kind | stmts(stmt, kind, _) | kind = 2 or kind = 11 or kind = 35) +} + +from Stmt child, int index, int index_new, Element parent +where + stmtparents(child, index, parent) and + ( + not isStmtWithInitializer(parent) + or + index > 0 + ) and + if isStmtWithInitializer(parent) then index_new = index - 1 else index_new = index +select child, index_new, parent diff --git a/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/upgrade.properties b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/upgrade.properties new file mode 100644 index 00000000000..784726b09de --- /dev/null +++ b/cpp/downgrades/cf72c8898d19eb1b3374432cf79d8276cb07ad43/upgrade.properties @@ -0,0 +1,6 @@ +description: Support C++17 if and switch initializers +compatibility: partial +if_initialization.rel: delete +switch_initialization.rel: delete +exprparents.rel: run exprparents.qlo +stmtparents.rel: run stmtparents.qlo diff --git a/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme new file mode 100644 index 00000000000..e9a518baf14 --- /dev/null +++ b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..bb0f279f2ac --- /dev/null +++ b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties new file mode 100644 index 00000000000..000fa581cfa --- /dev/null +++ b/cpp/downgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties @@ -0,0 +1,2 @@ +description: Remove uniqueness constraint from the uuid property +compatibility: full diff --git a/cpp/ql/lib/BUILD.bazel b/cpp/ql/lib/BUILD.bazel new file mode 100644 index 00000000000..60f56a3ef7a --- /dev/null +++ b/cpp/ql/lib/BUILD.bazel @@ -0,0 +1,15 @@ +package(default_visibility = ["//cpp:__pkg__"]) + +load("@rules_pkg//:mappings.bzl", "pkg_files") + +pkg_files( + name = "dbscheme", + srcs = ["semmlecode.cpp.dbscheme"], + prefix = "cpp", +) + +pkg_files( + name = "dbscheme-stats", + srcs = ["semmlecode.cpp.dbscheme.stats"], + prefix = "cpp", +) diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 01d30a387ee..6f030187ef9 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,5 +1,68 @@ +## 0.2.1 + +## 0.2.0 + +### Breaking Changes + +* The signature of `allowImplicitRead` on `DataFlow::Configuration` and `TaintTracking::Configuration` has changed from `allowImplicitRead(DataFlow::Node node, DataFlow::Content c)` to `allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c)`. + +### Minor Analysis Improvements + +* More Windows pool allocation functions are now detected as `AllocationFunction`s. +* The `semmle.code.cpp.commons.Buffer` library has been enhanced to handle array members of classes that do not specify a size. + +## 0.1.0 + +### Breaking Changes + +* The recently added flow-state versions of `isBarrierIn`, `isBarrierOut`, `isSanitizerIn`, and `isSanitizerOut` in the data flow and taint tracking libraries have been removed. + +### New Features + +* A new library `semmle.code.cpp.security.PrivateData` has been added. The new library heuristically detects variables and functions dealing with sensitive private data, such as e-mail addresses and credit card numbers. + +### Minor Analysis Improvements + +* The `semmle.code.cpp.security.SensitiveExprs` library has been enhanced with some additional rules for detecting credentials. + +## 0.0.13 + +## 0.0.12 + +### Breaking Changes + +* The flow state variants of `isBarrier` and `isAdditionalFlowStep` are no longer exposed in the taint tracking library. The `isSanitizer` and `isAdditionalTaintStep` predicates should be used instead. + +### Deprecated APIs + +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. + The old name still exists as a deprecated alias. + +### New Features + +* The data flow and taint tracking libraries have been extended with versions of `isBarrierIn`, `isBarrierOut`, and `isBarrierGuard`, respectively `isSanitizerIn`, `isSanitizerOut`, and `isSanitizerGuard`, that support flow states. + +### Minor Analysis Improvements + +* `DefaultOptions::exits` now holds for C11 functions with the `_Noreturn` or `noreturn` specifier. +* `hasImplicitCopyConstructor` and `hasImplicitCopyAssignmentOperator` now correctly handle implicitly-deleted operators in templates. +* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted. + +## 0.0.11 + +### Minor Analysis Improvements + +* Many queries now support structured bindings, as structured bindings are now handled in the IR translation. + +## 0.0.10 + +### New Features + +* Added a `isStructuredBinding` predicate to the `Variable` class which holds when the variable is declared as part of a structured binding declaration. + ## 0.0.9 + ## 0.0.8 ### Deprecated APIs diff --git a/cpp/ql/lib/DefaultOptions.qll b/cpp/ql/lib/DefaultOptions.qll index ae3ca205188..73a891bb554 100644 --- a/cpp/ql/lib/DefaultOptions.qll +++ b/cpp/ql/lib/DefaultOptions.qll @@ -54,11 +54,13 @@ class Options extends string { * * By default, this holds for `exit`, `_exit`, `abort`, `__assert_fail`, * `longjmp`, `__builtin_unreachable` and any function with a - * `noreturn` attribute. + * `noreturn` attribute or specifier. */ predicate exits(Function f) { f.getAnAttribute().hasName("noreturn") or + f.getASpecifier().hasName("noreturn") + or f.hasGlobalOrStdName([ "exit", "_exit", "abort", "__assert_fail", "longjmp", "__builtin_unreachable" ]) diff --git a/cpp/ql/lib/Options.qll b/cpp/ql/lib/Options.qll index b18aede94f2..a0a13881a94 100644 --- a/cpp/ql/lib/Options.qll +++ b/cpp/ql/lib/Options.qll @@ -39,7 +39,7 @@ class CustomOptions extends Options { * * By default, this holds for `exit`, `_exit`, `abort`, `__assert_fail`, * `longjmp`, `error`, `__builtin_unreachable` and any function with a - * `noreturn` attribute. + * `noreturn` attribute or specifier. */ override predicate exits(Function f) { Options.super.exits(f) } diff --git a/cpp/ql/lib/change-notes/2022-04-12-if-and-switch-initializers.md b/cpp/ql/lib/change-notes/2022-04-12-if-and-switch-initializers.md new file mode 100644 index 00000000000..dcfa69120fa --- /dev/null +++ b/cpp/ql/lib/change-notes/2022-04-12-if-and-switch-initializers.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* A `getInitialization` predicate was added to the `ConstexprIfStmt`, `IfStmt`, and `SwitchStmt` classes that yields the C++17-style initializer of the `if` or `switch` statement when it exists. diff --git a/cpp/ql/lib/change-notes/2022-05-11-deprecated-analysed-string.md b/cpp/ql/lib/change-notes/2022-05-11-deprecated-analysed-string.md new file mode 100644 index 00000000000..82626eaf329 --- /dev/null +++ b/cpp/ql/lib/change-notes/2022-05-11-deprecated-analysed-string.md @@ -0,0 +1,4 @@ +--- + category: deprecated +--- + * The `AnalysedString` class in the `StringAnalysis` module has been replaced with `AnalyzedString`, to follow our style guide. The old name still exists as a deprecated alias. diff --git a/cpp/ql/lib/change-notes/2022-02-21-structured-binding-data.md b/cpp/ql/lib/change-notes/released/0.0.10.md similarity index 84% rename from cpp/ql/lib/change-notes/2022-02-21-structured-binding-data.md rename to cpp/ql/lib/change-notes/released/0.0.10.md index 999cbd83d18..aa49a7c2ff2 100644 --- a/cpp/ql/lib/change-notes/2022-02-21-structured-binding-data.md +++ b/cpp/ql/lib/change-notes/released/0.0.10.md @@ -1,4 +1,5 @@ ---- -category: feature ---- +## 0.0.10 + +### New Features + * Added a `isStructuredBinding` predicate to the `Variable` class which holds when the variable is declared as part of a structured binding declaration. diff --git a/cpp/ql/lib/change-notes/released/0.0.11.md b/cpp/ql/lib/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..633eca26993 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.11.md @@ -0,0 +1,5 @@ +## 0.0.11 + +### Minor Analysis Improvements + +* Many queries now support structured bindings, as structured bindings are now handled in the IR translation. diff --git a/cpp/ql/lib/change-notes/released/0.0.12.md b/cpp/ql/lib/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..099524281ee --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.12.md @@ -0,0 +1,20 @@ +## 0.0.12 + +### Breaking Changes + +* The flow state variants of `isBarrier` and `isAdditionalFlowStep` are no longer exposed in the taint tracking library. The `isSanitizer` and `isAdditionalTaintStep` predicates should be used instead. + +### Deprecated APIs + +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. + The old name still exists as a deprecated alias. + +### New Features + +* The data flow and taint tracking libraries have been extended with versions of `isBarrierIn`, `isBarrierOut`, and `isBarrierGuard`, respectively `isSanitizerIn`, `isSanitizerOut`, and `isSanitizerGuard`, that support flow states. + +### Minor Analysis Improvements + +* `DefaultOptions::exits` now holds for C11 functions with the `_Noreturn` or `noreturn` specifier. +* `hasImplicitCopyConstructor` and `hasImplicitCopyAssignmentOperator` now correctly handle implicitly-deleted operators in templates. +* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted. diff --git a/cpp/ql/lib/change-notes/released/0.0.13.md b/cpp/ql/lib/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..30ff8ab8dd0 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.13.md @@ -0,0 +1 @@ +## 0.0.13 diff --git a/cpp/ql/lib/change-notes/released/0.1.0.md b/cpp/ql/lib/change-notes/released/0.1.0.md new file mode 100644 index 00000000000..bdc38108d6a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.1.0.md @@ -0,0 +1,13 @@ +## 0.1.0 + +### Breaking Changes + +* The recently added flow-state versions of `isBarrierIn`, `isBarrierOut`, `isSanitizerIn`, and `isSanitizerOut` in the data flow and taint tracking libraries have been removed. + +### New Features + +* A new library `semmle.code.cpp.security.PrivateData` has been added. The new library heuristically detects variables and functions dealing with sensitive private data, such as e-mail addresses and credit card numbers. + +### Minor Analysis Improvements + +* The `semmle.code.cpp.security.SensitiveExprs` library has been enhanced with some additional rules for detecting credentials. diff --git a/cpp/ql/lib/change-notes/released/0.2.0.md b/cpp/ql/lib/change-notes/released/0.2.0.md new file mode 100644 index 00000000000..e0b751200c4 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.2.0.md @@ -0,0 +1,10 @@ +## 0.2.0 + +### Breaking Changes + +* The signature of `allowImplicitRead` on `DataFlow::Configuration` and `TaintTracking::Configuration` has changed from `allowImplicitRead(DataFlow::Node node, DataFlow::Content c)` to `allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c)`. + +### Minor Analysis Improvements + +* More Windows pool allocation functions are now detected as `AllocationFunction`s. +* The `semmle.code.cpp.commons.Buffer` library has been enhanced to handle array members of classes that do not specify a size. diff --git a/cpp/ql/lib/change-notes/released/0.2.1.md b/cpp/ql/lib/change-notes/released/0.2.1.md new file mode 100644 index 00000000000..c260de2a9ee --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.2.1.md @@ -0,0 +1 @@ +## 0.2.1 diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index ecdd64fbab8..df29a726bcc 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.9 +lastReleaseVersion: 0.2.1 diff --git a/cpp/ql/lib/cpp.qll b/cpp/ql/lib/cpp.qll index a989c9a6c9d..0a29f7b86ba 100644 --- a/cpp/ql/lib/cpp.qll +++ b/cpp/ql/lib/cpp.qll @@ -69,6 +69,4 @@ import semmle.code.cpp.Comments import semmle.code.cpp.Preprocessor import semmle.code.cpp.Iteration import semmle.code.cpp.NameQualifiers -import semmle.code.cpp.ObjectiveC -import semmle.code.cpp.exprs.ObjectiveC import DefaultOptions diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll index 5438722fd08..f82330f3fbd 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll @@ -4,7 +4,7 @@ import cpp import semmle.code.cpp.dataflow.TaintTracking -import experimental.semmle.code.cpp.security.PrivateData +import semmle.code.cpp.security.PrivateData import semmle.code.cpp.security.FileWrite import semmle.code.cpp.security.BufferWrite diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateData.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateData.qll deleted file mode 100644 index ec37e8ce86c..00000000000 --- a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateData.qll +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Provides classes and predicates for identifying private data and functions for security. - * - * 'Private' data in general is anything that would compromise user privacy if exposed. This - * library tries to guess where private data may either be stored in a variable or produced by a - * function. - * - * This library is not concerned with credentials. See `SensitiveActions` for expressions related - * to credentials. - */ - -import cpp - -/** A string for `match` that identifies strings that look like they represent private data. */ -private string privateNames() { - result = - [ - // Inspired by the list on https://cwe.mitre.org/data/definitions/359.html - // Government identifiers, such as Social Security Numbers - "%social%security%number%", - // Contact information, such as home addresses and telephone numbers - "%postcode%", "%zipcode%", - // result = "%telephone%" or - // Geographic location - where the user is (or was) - "%latitude%", "%longitude%", - // Financial data - such as credit card numbers, salary, bank accounts, and debts - "%creditcard%", "%salary%", "%bankaccount%", - // Communications - e-mail addresses, private e-mail messages, SMS text messages, chat logs, etc. - // result = "%email%" or - // result = "%mobile%" or - "%employer%", - // Health - medical conditions, insurance status, prescription records - "%medical%" - ] -} - -/** An expression that might contain private data. */ -abstract class PrivateDataExpr extends Expr { } - -/** A functiond call that might produce private data. */ -class PrivateFunctionCall extends PrivateDataExpr, FunctionCall { - PrivateFunctionCall() { - exists(string s | this.getTarget().getName().toLowerCase() = s | s.matches(privateNames())) - } -} - -/** An access to a variable that might contain private data. */ -class PrivateVariableAccess extends PrivateDataExpr, VariableAccess { - PrivateVariableAccess() { - exists(string s | this.getTarget().getName().toLowerCase() = s | s.matches(privateNames())) - } -} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/Semantic.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/Semantic.qll new file mode 100644 index 00000000000..2238a8b6c94 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/Semantic.qll @@ -0,0 +1,7 @@ +import SemanticExpr +import SemanticBound +import SemanticSSA +import SemanticGuard +import SemanticCFG +import SemanticType +import SemanticOpcode diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticBound.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticBound.qll new file mode 100644 index 00000000000..48a983c3ffb --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticBound.qll @@ -0,0 +1,42 @@ +/** + * Semantic wrapper around the language-specific bounds library. + */ + +private import SemanticExpr +private import SemanticExprSpecific::SemanticExprConfig as Specific +private import SemanticSSA + +/** + * A valid base for an expression bound. + * + * Can be either a variable (`SemSsaBound`) or zero (`SemZeroBound`). + */ +class SemBound instanceof Specific::Bound { + final string toString() { result = super.toString() } + + final SemExpr getExpr(int delta) { result = Specific::getBoundExpr(this, delta) } +} + +/** + * A bound that is a constant zero. + */ +class SemZeroBound extends SemBound { + SemZeroBound() { Specific::zeroBound(this) } +} + +/** + * A bound that is an SSA definition. + */ +class SemSsaBound extends SemBound { + /** + * The variables whose value is used as the bound. + * + * Can be multi-valued in some implementations. If so, all variables will be equivalent. + */ + SemSsaVariable var; + + SemSsaBound() { Specific::ssaBound(this, var) } + + /** Gets a variable whose value is used as the bound. */ + final SemSsaVariable getAVariable() { result = var } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticCFG.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticCFG.qll new file mode 100644 index 00000000000..333edc46b6e --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticCFG.qll @@ -0,0 +1,22 @@ +/** + * Semantic interface to the control flow graph. + */ + +private import Semantic +private import SemanticExprSpecific::SemanticExprConfig as Specific + +/** + * A basic block in the control-flow graph. + */ +class SemBasicBlock extends Specific::BasicBlock { + /** Holds if this block (transitively) dominates `otherblock`. */ + final predicate bbDominates(SemBasicBlock otherBlock) { Specific::bbDominates(this, otherBlock) } + + /** Holds if this block has dominance information. */ + final predicate hasDominanceInformation() { Specific::hasDominanceInformation(this) } + + /** Gets an expression that is evaluated in this basic block. */ + final SemExpr getAnExpr() { result.getBasicBlock() = this } + + final int getUniqueId() { result = Specific::getBasicBlockUniqueId(this) } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExpr.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExpr.qll new file mode 100644 index 00000000000..8aeb15cab12 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExpr.qll @@ -0,0 +1,309 @@ +/** + * Semantic interface for expressions. + */ + +private import Semantic +private import SemanticExprSpecific::SemanticExprConfig as Specific + +/** + * An language-neutral expression. + * + * The expression computes a value of type `getSemType()`. The actual computation is determined by + * the expression's opcode (`getOpcode()`). + */ +class SemExpr instanceof Specific::Expr { + final string toString() { result = super.toString() } + + final Specific::Location getLocation() { result = super.getLocation() } + + Opcode getOpcode() { result instanceof Opcode::Unknown } + + SemType getSemType() { result = Specific::getUnknownExprType(this) } + + final SemBasicBlock getBasicBlock() { result = Specific::getExprBasicBlock(this) } +} + +/** An expression with an opcode other than `Unknown`. */ +abstract private class SemKnownExpr extends SemExpr { + Opcode opcode; + SemType type; + + final override Opcode getOpcode() { result = opcode } + + final override SemType getSemType() { result = type } +} + +/** An expression that returns a literal value. */ +class SemLiteralExpr extends SemKnownExpr { + SemLiteralExpr() { + Specific::integerLiteral(this, type, _) and opcode instanceof Opcode::Constant + or + Specific::largeIntegerLiteral(this, type, _) and opcode instanceof Opcode::Constant + or + Specific::booleanLiteral(this, type, _) and opcode instanceof Opcode::Constant + or + Specific::floatingPointLiteral(this, type, _) and opcode instanceof Opcode::Constant + or + Specific::nullLiteral(this, type) and opcode instanceof Opcode::Constant + or + Specific::stringLiteral(this, type, _) and opcode instanceof Opcode::StringConstant + } +} + +/** An expression that returns a numeric literal value. */ +class SemNumericLiteralExpr extends SemLiteralExpr { + SemNumericLiteralExpr() { + Specific::integerLiteral(this, _, _) + or + Specific::largeIntegerLiteral(this, _, _) + or + Specific::floatingPointLiteral(this, _, _) + } + + /** + * Gets an approximation of the value of the literal, as a `float`. + * + * If the value can be precisely represented as a `float`, the result will be exact. If the actual + * value cannot be precisely represented (for example, it is an integer with more than 53 + * significant bits), then the result is an approximation. + */ + float getApproximateFloatValue() { none() } +} + +/** An expression that returns an integer literal value. */ +class SemIntegerLiteralExpr extends SemNumericLiteralExpr { + SemIntegerLiteralExpr() { + Specific::integerLiteral(this, _, _) + or + Specific::largeIntegerLiteral(this, _, _) + } + + /** + * Gets the value of the literal, if it can be represented as an `int`. + * + * If the value is outside the range of an `int`, use `getApproximateFloatValue()` to get a value + * that is equal to the actual integer value, within rounding error. + */ + final int getIntValue() { Specific::integerLiteral(this, _, result) } + + final override float getApproximateFloatValue() { + result = getIntValue() + or + Specific::largeIntegerLiteral(this, _, result) + } +} + +/** + * An expression that returns a floating-point literal value. + */ +class SemFloatingPointLiteralExpr extends SemNumericLiteralExpr { + float value; + + SemFloatingPointLiteralExpr() { Specific::floatingPointLiteral(this, _, value) } + + final override float getApproximateFloatValue() { result = value } + + /** Gets the value of the literal. */ + final float getFloatValue() { result = value } +} + +/** + * An expression that consumes two operands. + */ +class SemBinaryExpr extends SemKnownExpr { + SemExpr leftOperand; + SemExpr rightOperand; + + SemBinaryExpr() { Specific::binaryExpr(this, opcode, type, leftOperand, rightOperand) } + + /** Gets the left operand. */ + final SemExpr getLeftOperand() { result = leftOperand } + + /** Gets the right operand. */ + final SemExpr getRightOperand() { result = rightOperand } + + /** Holds if `a` and `b` are the two operands, in either order. */ + final predicate hasOperands(SemExpr a, SemExpr b) { + a = getLeftOperand() and b = getRightOperand() + or + a = getRightOperand() and b = getLeftOperand() + } + + /** Gets the two operands. */ + final SemExpr getAnOperand() { result = getLeftOperand() or result = getRightOperand() } +} + +/** An expression that performs and ordered comparison of two operands. */ +class SemRelationalExpr extends SemBinaryExpr { + SemRelationalExpr() { + opcode instanceof Opcode::CompareLT + or + opcode instanceof Opcode::CompareLE + or + opcode instanceof Opcode::CompareGT + or + opcode instanceof Opcode::CompareGE + } + + /** + * Get the operand that will be less than the other operand if the result of the comparison is + * `true`. + * + * For `x < y` or `x <= y`, this will return `x`. + * For `x > y` or `x >= y`, this will return `y`.` + */ + final SemExpr getLesserOperand() { + if opcode instanceof Opcode::CompareLT or opcode instanceof Opcode::CompareLE + then result = getLeftOperand() + else result = getRightOperand() + } + + /** + * Get the operand that will be greater than the other operand if the result of the comparison is + * `true`. + * + * For `x < y` or `x <= y`, this will return `y`. + * For `x > y` or `x >= y`, this will return `x`.` + */ + final SemExpr getGreaterOperand() { + if opcode instanceof Opcode::CompareGT or opcode instanceof Opcode::CompareGE + then result = getLeftOperand() + else result = getRightOperand() + } + + /** Holds if this comparison returns `false` if the two operands are equal. */ + final predicate isStrict() { + opcode instanceof Opcode::CompareLT or opcode instanceof Opcode::CompareGT + } +} + +class SemAddExpr extends SemBinaryExpr { + SemAddExpr() { opcode instanceof Opcode::Add } +} + +class SemSubExpr extends SemBinaryExpr { + SemSubExpr() { opcode instanceof Opcode::Sub } +} + +class SemMulExpr extends SemBinaryExpr { + SemMulExpr() { opcode instanceof Opcode::Mul } +} + +class SemDivExpr extends SemBinaryExpr { + SemDivExpr() { opcode instanceof Opcode::Div } +} + +class SemRemExpr extends SemBinaryExpr { + SemRemExpr() { opcode instanceof Opcode::Rem } +} + +class SemShiftLeftExpr extends SemBinaryExpr { + SemShiftLeftExpr() { opcode instanceof Opcode::ShiftLeft } +} + +class SemShiftRightExpr extends SemBinaryExpr { + SemShiftRightExpr() { opcode instanceof Opcode::ShiftRight } +} + +class SemShiftRightUnsignedExpr extends SemBinaryExpr { + SemShiftRightUnsignedExpr() { opcode instanceof Opcode::ShiftRightUnsigned } +} + +class SemBitAndExpr extends SemBinaryExpr { + SemBitAndExpr() { opcode instanceof Opcode::BitAnd } +} + +class SemBitOrExpr extends SemBinaryExpr { + SemBitOrExpr() { opcode instanceof Opcode::BitOr } +} + +class SemBitXorExpr extends SemBinaryExpr { + SemBitXorExpr() { opcode instanceof Opcode::BitXor } +} + +class SemUnaryExpr extends SemKnownExpr { + SemExpr operand; + + SemUnaryExpr() { Specific::unaryExpr(this, opcode, type, operand) } + + final SemExpr getOperand() { result = operand } +} + +class SemBoxExpr extends SemUnaryExpr { + SemBoxExpr() { opcode instanceof Opcode::Box } +} + +class SemUnboxExpr extends SemUnaryExpr { + SemUnboxExpr() { opcode instanceof Opcode::Unbox } +} + +class SemConvertExpr extends SemUnaryExpr { + SemConvertExpr() { opcode instanceof Opcode::Convert } +} + +class SemCopyValueExpr extends SemUnaryExpr { + SemCopyValueExpr() { opcode instanceof Opcode::CopyValue } +} + +class SemNegateExpr extends SemUnaryExpr { + SemNegateExpr() { opcode instanceof Opcode::Negate } +} + +class SemBitComplementExpr extends SemUnaryExpr { + SemBitComplementExpr() { opcode instanceof Opcode::BitComplement } +} + +class SemLogicalNotExpr extends SemUnaryExpr { + SemLogicalNotExpr() { opcode instanceof Opcode::LogicalNot } +} + +class SemAddOneExpr extends SemUnaryExpr { + SemAddOneExpr() { opcode instanceof Opcode::AddOne } +} + +class SemSubOneExpr extends SemUnaryExpr { + SemSubOneExpr() { opcode instanceof Opcode::SubOne } +} + +private class SemNullaryExpr extends SemKnownExpr { + SemNullaryExpr() { Specific::nullaryExpr(this, opcode, type) } +} + +class SemInitializeParameterExpr extends SemNullaryExpr { + SemInitializeParameterExpr() { opcode instanceof Opcode::InitializeParameter } +} + +class SemLoadExpr extends SemNullaryExpr { + SemLoadExpr() { opcode instanceof Opcode::Load } + + final SemSsaVariable getDef() { result.getAUse() = this } +} + +class SemSsaLoadExpr extends SemLoadExpr { + SemSsaLoadExpr() { exists(getDef()) } +} + +class SemNonSsaLoadExpr extends SemLoadExpr { + SemNonSsaLoadExpr() { not exists(getDef()) } +} + +class SemStoreExpr extends SemUnaryExpr { + SemStoreExpr() { opcode instanceof Opcode::Store } +} + +class SemConditionalExpr extends SemKnownExpr { + SemExpr condition; + SemExpr trueResult; + SemExpr falseResult; + + SemConditionalExpr() { + opcode instanceof Opcode::Conditional and + Specific::conditionalExpr(this, type, condition, trueResult, falseResult) + } + + final SemExpr getBranchExpr(boolean branch) { + branch = true and result = trueResult + or + branch = false and result = falseResult + } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExprSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExprSpecific.qll new file mode 100644 index 00000000000..67867cce9dc --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticExprSpecific.qll @@ -0,0 +1,297 @@ +/** + * C++-specific implementation of the semantic interface. + */ + +private import cpp as Cpp +private import semmle.code.cpp.ir.IR as IR +private import Semantic +private import experimental.semmle.code.cpp.rangeanalysis.Bound as IRBound +private import semmle.code.cpp.controlflow.IRGuards as IRGuards + +module SemanticExprConfig { + class Location = Cpp::Location; + + class Expr = IR::Instruction; + + SemBasicBlock getExprBasicBlock(Expr e) { result = getSemanticBasicBlock(e.getBlock()) } + + private predicate anyConstantExpr(Expr expr, SemType type, string value) { + exists(IR::ConstantInstruction instr | instr = expr | + type = getSemanticType(instr.getResultIRType()) and + value = instr.getValue() + ) + } + + predicate integerLiteral(Expr expr, SemIntegerType type, int value) { + exists(string valueString | + anyConstantExpr(expr, type, valueString) and + value = valueString.toInt() + ) + } + + predicate largeIntegerLiteral(Expr expr, SemIntegerType type, float approximateFloatValue) { + exists(string valueString | + anyConstantExpr(expr, type, valueString) and + not exists(valueString.toInt()) and + approximateFloatValue = valueString.toFloat() + ) + } + + predicate floatingPointLiteral(Expr expr, SemFloatingPointType type, float value) { + exists(string valueString | + anyConstantExpr(expr, type, valueString) and value = valueString.toFloat() + ) + } + + predicate booleanLiteral(Expr expr, SemBooleanType type, boolean value) { + exists(string valueString | + anyConstantExpr(expr, type, valueString) and + ( + valueString = "true" and value = true + or + valueString = "false" and value = false + ) + ) + } + + predicate nullLiteral(Expr expr, SemAddressType type) { anyConstantExpr(expr, type, _) } + + predicate stringLiteral(Expr expr, SemType type, string value) { + anyConstantExpr(expr, type, value) and expr instanceof IR::StringConstantInstruction + } + + predicate binaryExpr(Expr expr, Opcode opcode, SemType type, Expr leftOperand, Expr rightOperand) { + exists(IR::BinaryInstruction instr | instr = expr | + type = getSemanticType(instr.getResultIRType()) and + leftOperand = instr.getLeft() and + rightOperand = instr.getRight() and + // REVIEW: Merge the two `Opcode` types. + opcode.toString() = instr.getOpcode().toString() + ) + } + + predicate unaryExpr(Expr expr, Opcode opcode, SemType type, Expr operand) { + type = getSemanticType(expr.getResultIRType()) and + ( + exists(IR::UnaryInstruction instr | instr = expr | + operand = instr.getUnary() and + // REVIEW: Merge the two operand types. + opcode.toString() = instr.getOpcode().toString() + ) + or + exists(IR::StoreInstruction instr | instr = expr | + operand = instr.getSourceValue() and + opcode instanceof Opcode::Store + ) + ) + } + + predicate nullaryExpr(Expr expr, Opcode opcode, SemType type) { + type = getSemanticType(expr.getResultIRType()) and + ( + expr instanceof IR::LoadInstruction and opcode instanceof Opcode::Load + or + expr instanceof IR::InitializeParameterInstruction and + opcode instanceof Opcode::InitializeParameter + ) + } + + predicate conditionalExpr( + Expr expr, SemType type, Expr condition, Expr trueResult, Expr falseResult + ) { + none() + } + + SemType getUnknownExprType(Expr expr) { result = getSemanticType(expr.getResultIRType()) } + + class BasicBlock = IR::IRBlock; + + predicate bbDominates(BasicBlock dominator, BasicBlock dominated) { + dominator.dominates(dominated) + } + + predicate hasDominanceInformation(BasicBlock block) { any() } + + int getBasicBlockUniqueId(BasicBlock block) { + // REVIEW: `getDisplayIndex()` is not intended for use in real queries, but for now it's the + // best we can do because `equivalentRelation` won't accept a predicate whose parameters are IPA + // types. + result = block.getDisplayIndex() + } + + class SsaVariable instanceof IR::Instruction { + SsaVariable() { super.hasMemoryResult() } + + final string toString() { result = super.toString() } + + final Location getLocation() { result = super.getLocation() } + } + + predicate explicitUpdate(SsaVariable v, Expr sourceExpr) { v = sourceExpr } + + predicate phi(SsaVariable v) { v instanceof IR::PhiInstruction } + + SsaVariable getAPhiInput(SsaVariable v) { result = v.(IR::PhiInstruction).getAnInput() } + + Expr getAUse(SsaVariable v) { result.(IR::LoadInstruction).getSourceValue() = v } + + SemType getSsaVariableType(SsaVariable v) { + result = getSemanticType(v.(IR::Instruction).getResultIRType()) + } + + BasicBlock getSsaVariableBasicBlock(SsaVariable v) { result = v.(IR::Instruction).getBlock() } + + private newtype TReadPosition = + TReadPositionBlock(IR::IRBlock block) or + TReadPositionPhiInputEdge(IR::IRBlock pred, IR::IRBlock succ) { + exists(IR::PhiInputOperand input | + pred = input.getPredecessorBlock() and + succ = input.getUse().getBlock() + ) + } + + class SsaReadPosition extends TReadPosition { + string toString() { none() } + + Location getLocation() { none() } + + predicate hasRead(SsaVariable v) { none() } + } + + private class SsaReadPositionBlock extends SsaReadPosition, TReadPositionBlock { + IR::IRBlock block; + + SsaReadPositionBlock() { this = TReadPositionBlock(block) } + + final override string toString() { result = block.toString() } + + final override Location getLocation() { result = block.getLocation() } + + final override predicate hasRead(SsaVariable v) { + exists(IR::Operand operand | + operand.getDef() = v and not operand instanceof IR::PhiInputOperand + ) + } + } + + private class SsaReadPositionPhiInputEdge extends SsaReadPosition, TReadPositionPhiInputEdge { + IR::IRBlock pred; + IR::IRBlock succ; + + SsaReadPositionPhiInputEdge() { this = TReadPositionPhiInputEdge(pred, succ) } + + final override string toString() { result = pred.toString() + "->" + succ.toString() } + + final override Location getLocation() { result = succ.getLocation() } + + final override predicate hasRead(SsaVariable v) { + exists(IR::PhiInputOperand operand | + operand.getDef() = v and + operand.getPredecessorBlock() = pred and + operand.getUse().getBlock() = succ + ) + } + } + + predicate hasReadOfSsaVariable(SsaReadPosition pos, SsaVariable v) { pos.hasRead(v) } + + predicate readBlock(SsaReadPosition pos, BasicBlock block) { pos = TReadPositionBlock(block) } + + predicate phiInputEdge(SsaReadPosition pos, BasicBlock origBlock, BasicBlock phiBlock) { + pos = TReadPositionPhiInputEdge(origBlock, phiBlock) + } + + predicate phiInput(SsaReadPosition pos, SsaVariable phi, SsaVariable input) { + exists(IR::PhiInputOperand operand | + pos = TReadPositionPhiInputEdge(operand.getPredecessorBlock(), operand.getUse().getBlock()) + | + phi = operand.getUse() and input = operand.getDef() + ) + } + + class Bound instanceof IRBound::Bound { + Bound() { + this instanceof IRBound::ZeroBound + or + this.(IRBound::ValueNumberBound).getValueNumber().getAnInstruction() instanceof SsaVariable + } + + string toString() { result = super.toString() } + + final Location getLocation() { result = super.getLocation() } + } + + private class ValueNumberBound extends Bound { + IRBound::ValueNumberBound bound; + + ValueNumberBound() { bound = this } + + override string toString() { + result = + min(SsaVariable instr | + instr = bound.getValueNumber().getAnInstruction() + | + instr + order by + instr.(IR::Instruction).getBlock().getDisplayIndex(), + instr.(IR::Instruction).getDisplayIndexInBlock() + ).toString() + } + } + + predicate zeroBound(Bound bound) { bound instanceof IRBound::ZeroBound } + + predicate ssaBound(Bound bound, SsaVariable v) { + v = bound.(IRBound::ValueNumberBound).getValueNumber().getAnInstruction() + } + + Expr getBoundExpr(Bound bound, int delta) { + result = bound.(IRBound::Bound).getInstruction(delta) + } + + class Guard = IRGuards::IRGuardCondition; + + predicate guard(Guard guard, BasicBlock block) { + block = guard.(IRGuards::IRGuardCondition).getBlock() + } + + Expr getGuardAsExpr(Guard guard) { result = guard } + + predicate equalityGuard(Guard guard, Expr e1, Expr e2, boolean polarity) { + guard.(IRGuards::IRGuardCondition).comparesEq(e1.getAUse(), e2.getAUse(), 0, true, polarity) + } + + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock controlled, boolean branch) { + guard.(IRGuards::IRGuardCondition).controls(controlled, branch) + } + + predicate guardHasBranchEdge(Guard guard, BasicBlock bb1, BasicBlock bb2, boolean branch) { + guard.(IRGuards::IRGuardCondition).controlsEdge(bb1, bb2, branch) + } + + Guard comparisonGuard(Expr e) { result = e } + + predicate implies_v2(Guard g1, boolean b1, Guard g2, boolean b2) { + none() // TODO + } +} + +SemExpr getSemanticExpr(IR::Instruction instr) { result = instr } + +IR::Instruction getCppInstruction(SemExpr e) { e = result } + +SemBasicBlock getSemanticBasicBlock(IR::IRBlock block) { result = block } + +IR::IRBlock getCppBasicBlock(SemBasicBlock block) { block = result } + +SemSsaVariable getSemanticSsaVariable(IR::Instruction instr) { result = instr } + +IR::Instruction getCppSsaVariableInstruction(SemSsaVariable v) { v = result } + +SemBound getSemanticBound(IRBound::Bound bound) { result = bound } + +IRBound::Bound getCppBound(SemBound bound) { bound = result } + +SemGuard getSemanticGuard(IRGuards::IRGuardCondition guard) { result = guard } + +IRGuards::IRGuardCondition getCppGuard(SemGuard guard) { guard = result } diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticGuard.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticGuard.qll new file mode 100644 index 00000000000..8faf6a3a1de --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticGuard.qll @@ -0,0 +1,65 @@ +/** + * Semantic interface to the guards library. + */ + +private import Semantic +private import SemanticExprSpecific::SemanticExprConfig as Specific + +class SemGuard instanceof Specific::Guard { + SemBasicBlock block; + + SemGuard() { Specific::guard(this, block) } + + final string toString() { result = super.toString() } + + final Specific::Location getLocation() { result = super.getLocation() } + + final predicate isEquality(SemExpr e1, SemExpr e2, boolean polarity) { + Specific::equalityGuard(this, e1, e2, polarity) + } + + final predicate directlyControls(SemBasicBlock controlled, boolean branch) { + Specific::guardDirectlyControlsBlock(this, controlled, branch) + } + + final predicate hasBranchEdge(SemBasicBlock bb1, SemBasicBlock bb2, boolean branch) { + Specific::guardHasBranchEdge(this, bb1, bb2, branch) + } + + final SemBasicBlock getBasicBlock() { result = block } + + final SemExpr asExpr() { result = Specific::getGuardAsExpr(this) } +} + +predicate semImplies_v2(SemGuard g1, boolean b1, SemGuard g2, boolean b2) { + Specific::implies_v2(g1, b1, g2, b2) +} + +/** + * Holds if `guard` directly controls the position `controlled` with the + * value `testIsTrue`. + */ +predicate semGuardDirectlyControlsSsaRead( + SemGuard guard, SemSsaReadPosition controlled, boolean testIsTrue +) { + guard.directlyControls(controlled.(SemSsaReadPositionBlock).getBlock(), testIsTrue) + or + exists(SemSsaReadPositionPhiInputEdge controlledEdge | controlledEdge = controlled | + guard.directlyControls(controlledEdge.getOrigBlock(), testIsTrue) or + guard.hasBranchEdge(controlledEdge.getOrigBlock(), controlledEdge.getPhiBlock(), testIsTrue) + ) +} + +/** + * Holds if `guard` controls the position `controlled` with the value `testIsTrue`. + */ +predicate semGuardControlsSsaRead(SemGuard guard, SemSsaReadPosition controlled, boolean testIsTrue) { + semGuardDirectlyControlsSsaRead(guard, controlled, testIsTrue) + or + exists(SemGuard guard0, boolean testIsTrue0 | + semImplies_v2(guard0, testIsTrue0, guard, testIsTrue) and + semGuardControlsSsaRead(guard0, controlled, testIsTrue0) + ) +} + +SemGuard semGetComparisonGuard(SemRelationalExpr e) { result = Specific::comparisonGuard(e) } diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticOpcode.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticOpcode.qll new file mode 100644 index 00000000000..304d299dfba --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticOpcode.qll @@ -0,0 +1,179 @@ +/** + * Definitions of all possible opcodes for `SemExpr`. + */ +private newtype TOpcode = + TInitializeParameter() or + TCopyValue() or + TLoad() or + TStore() or + TAdd() or + TSub() or + TMul() or + TDiv() or + TRem() or + TNegate() or + TShiftLeft() or + TShiftRight() or + TShiftRightUnsigned() or // TODO: Based on type + TBitAnd() or + TBitOr() or + TBitXor() or + TBitComplement() or + TLogicalNot() or + TCompareEQ() or + TCompareNE() or + TCompareLT() or + TCompareGT() or + TCompareLE() or + TCompareGE() or + TPointerAdd() or + TPointerSub() or + TPointerDiff() or + TConvert() or + TConstant() or + TStringConstant() or + TAddOne() or // TODO: Combine with `TAdd` + TSubOne() or // TODO: Combine with `TSub` + TConditional() or // TODO: Represent as flow + TCall() or + TBox() or + TUnbox() or + TUnknown() + +class Opcode extends TOpcode { + string toString() { result = "???" } +} + +module Opcode { + class InitializeParameter extends Opcode, TInitializeParameter { + override string toString() { result = "InitializeParameter" } + } + + class CopyValue extends Opcode, TCopyValue { + override string toString() { result = "CopyValue" } + } + + class Load extends Opcode, TLoad { + override string toString() { result = "Load" } + } + + class Store extends Opcode, TStore { + override string toString() { result = "Store" } + } + + class Add extends Opcode, TAdd { + override string toString() { result = "Add" } + } + + class Sub extends Opcode, TSub { + override string toString() { result = "Sub" } + } + + class Mul extends Opcode, TMul { + override string toString() { result = "Mul" } + } + + class Div extends Opcode, TDiv { + override string toString() { result = "Div" } + } + + class Rem extends Opcode, TRem { + override string toString() { result = "Rem" } + } + + class Negate extends Opcode, TNegate { + override string toString() { result = "Negate" } + } + + class ShiftLeft extends Opcode, TShiftLeft { + override string toString() { result = "ShiftLeft" } + } + + class ShiftRight extends Opcode, TShiftRight { + override string toString() { result = "ShiftRight" } + } + + class ShiftRightUnsigned extends Opcode, TShiftRightUnsigned { + override string toString() { result = "ShiftRightUnsigned" } + } + + class BitAnd extends Opcode, TBitAnd { + override string toString() { result = "BitAnd" } + } + + class BitOr extends Opcode, TBitOr { + override string toString() { result = "BitOr" } + } + + class BitXor extends Opcode, TBitXor { + override string toString() { result = "BitXor" } + } + + class BitComplement extends Opcode, TBitComplement { + override string toString() { result = "BitComplement" } + } + + class LogicalNot extends Opcode, TLogicalNot { + override string toString() { result = "LogicalNot" } + } + + class CompareEQ extends Opcode, TCompareEQ { + override string toString() { result = "CompareEQ" } + } + + class CompareNE extends Opcode, TCompareNE { + override string toString() { result = "CompareNE" } + } + + class CompareLT extends Opcode, TCompareLT { + override string toString() { result = "CompareLT" } + } + + class CompareLE extends Opcode, TCompareLE { + override string toString() { result = "CompareLE" } + } + + class CompareGT extends Opcode, TCompareGT { + override string toString() { result = "CompareGT" } + } + + class CompareGE extends Opcode, TCompareGE { + override string toString() { result = "CompareGE" } + } + + class Convert extends Opcode, TConvert { + override string toString() { result = "Convert" } + } + + class AddOne extends Opcode, TAddOne { + override string toString() { result = "AddOne" } + } + + class SubOne extends Opcode, TSubOne { + override string toString() { result = "SubOne" } + } + + class Conditional extends Opcode, TConditional { + override string toString() { result = "Conditional" } + } + + class Constant extends Opcode, TConstant { + override string toString() { result = "Constant" } + } + + class StringConstant extends Opcode, TStringConstant { + override string toString() { result = "StringConstant" } + } + + class Box extends Opcode, TBox { + override string toString() { result = "Box" } + } + + class Unbox extends Opcode, TUnbox { + override string toString() { result = "Unbox" } + } + + class Unknown extends Opcode, TUnknown { + override string toString() { result = "Unknown" } + } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticSSA.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticSSA.qll new file mode 100644 index 00000000000..80e1d6c84a6 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticSSA.qll @@ -0,0 +1,75 @@ +/** + * Semantic interface to the SSA library. + */ + +private import Semantic +private import SemanticExprSpecific::SemanticExprConfig as Specific + +class SemSsaVariable instanceof Specific::SsaVariable { + final string toString() { result = super.toString() } + + final Specific::Location getLocation() { result = super.getLocation() } + + final SemLoadExpr getAUse() { result = Specific::getAUse(this) } + + final SemType getType() { result = Specific::getSsaVariableType(this) } + + final SemBasicBlock getBasicBlock() { result = Specific::getSsaVariableBasicBlock(this) } +} + +class SemSsaExplicitUpdate extends SemSsaVariable { + SemExpr sourceExpr; + + SemSsaExplicitUpdate() { Specific::explicitUpdate(this, sourceExpr) } + + final SemExpr getSourceExpr() { result = sourceExpr } +} + +class SemSsaPhiNode extends SemSsaVariable { + SemSsaPhiNode() { Specific::phi(this) } + + final SemSsaVariable getAPhiInput() { result = Specific::getAPhiInput(this) } +} + +class SemSsaReadPosition instanceof Specific::SsaReadPosition { + final string toString() { result = super.toString() } + + final Specific::Location getLocation() { result = super.getLocation() } + + final predicate hasReadOfVar(SemSsaVariable var) { Specific::hasReadOfSsaVariable(this, var) } +} + +class SemSsaReadPositionPhiInputEdge extends SemSsaReadPosition { + SemBasicBlock origBlock; + SemBasicBlock phiBlock; + + SemSsaReadPositionPhiInputEdge() { Specific::phiInputEdge(this, origBlock, phiBlock) } + + predicate phiInput(SemSsaPhiNode phi, SemSsaVariable inp) { Specific::phiInput(this, phi, inp) } + + SemBasicBlock getOrigBlock() { result = origBlock } + + SemBasicBlock getPhiBlock() { result = phiBlock } +} + +class SemSsaReadPositionBlock extends SemSsaReadPosition { + SemBasicBlock block; + + SemSsaReadPositionBlock() { Specific::readBlock(this, block) } + + SemBasicBlock getBlock() { result = block } + + SemExpr getAnExpr() { result = getBlock().getAnExpr() } +} + +/** + * Holds if `inp` is an input to `phi` along a back edge. + */ +predicate semBackEdge(SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge) { + edge.phiInput(phi, inp) and + // Conservatively assume that every edge is a back edge if we don't have dominance information. + ( + phi.getBasicBlock().bbDominates(edge.getOrigBlock()) or + not edge.getOrigBlock().hasDominanceInformation() + ) +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll new file mode 100644 index 00000000000..ce3f4ed90b4 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll @@ -0,0 +1,301 @@ +/** + * Minimal, language-neutral type system for semantic analysis. + */ + +private import SemanticTypeSpecific as Specific + +class LanguageType = Specific::Type; + +cached +private newtype TSemType = + TSemVoidType() { Specific::voidType(_) } or + TSemUnknownType() { Specific::unknownType(_) } or + TSemErrorType() { Specific::errorType(_) } or + TSemBooleanType(int byteSize) { Specific::booleanType(_, byteSize) } or + TSemIntegerType(int byteSize, boolean signed) { Specific::integerType(_, byteSize, signed) } or + TSemFloatingPointType(int byteSize) { Specific::floatingPointType(_, byteSize) } or + TSemAddressType(int byteSize) { Specific::addressType(_, byteSize) } or + TSemFunctionAddressType(int byteSize) { Specific::functionAddressType(_, byteSize) } or + TSemOpaqueType(int byteSize, Specific::OpaqueTypeTag tag) { + Specific::opaqueType(_, byteSize, tag) + } + +/** + * The language-neutral type of a semantic expression, + * The interface to `SemType` and its subclasses is the same across all languages for which the IR + * is supported, so analyses that expect to be used for multiple languages should generally use + * `SemType` rather than a language-specific type. + * + * Many types from the language-specific type system will map to a single canonical `SemType`. Two + * types that map to the same `SemType` are considered equivalent by semantic analysis. As an + * example, in C++, all pointer types map to the same instance of `SemAddressType`. + */ +class SemType extends TSemType { + /** Gets a textual representation of this type. */ + string toString() { none() } + + /** + * Gets a string that uniquely identifies this `SemType`. This string is often the same as the + * result of `SemType.toString()`, but for some types it may be more verbose to ensure uniqueness. + */ + string getIdentityString() { result = toString() } + + /** + * Gets the size of the type, in bytes, if known. + * + * This will hold for all `SemType` objects except `SemUnknownType` and `SemErrorType`. + */ + // This predicate is overridden with `pragma[noinline]` in every leaf subclass. + // This allows callers to ask for things like _the_ floating-point type of + // size 4 without getting a join that first finds all types of size 4 and + // _then_ restricts them to floating-point types. + int getByteSize() { none() } +} + +/** + * An unknown type. Generally used to represent results and operands that access an unknown set of + * memory locations, such as the side effects of a function call. + */ +class SemUnknownType extends SemType, TSemUnknownType { + final override string toString() { result = "unknown" } + + final override int getByteSize() { none() } +} + +/** + * A void type, which has no values. Used to represent the result type of an expression that does + * not produce a result. + */ +class SemVoidType extends SemType, TSemVoidType { + final override string toString() { result = "void" } + + final override int getByteSize() { result = 0 } +} + +/** + * An error type. Used when an error in the source code prevents the extractor from determining the + * proper type. + */ +class SemErrorType extends SemType, TSemErrorType { + final override string toString() { result = "error" } + + final override int getByteSize() { result = 0 } +} + +private class SemSizedType extends SemType { + int byteSize; + + SemSizedType() { + this = TSemBooleanType(byteSize) or + this = TSemIntegerType(byteSize, _) or + this = TSemFloatingPointType(byteSize) or + this = TSemAddressType(byteSize) or + this = TSemFunctionAddressType(byteSize) or + this = TSemOpaqueType(byteSize, _) + } + // Don't override `getByteSize()` here. The optimizer seems to generate better code when this is + // overridden only in the leaf classes. +} + +/** + * A Boolean type, which can hold the values `true` (non-zero) or `false` (zero). + */ +class SemBooleanType extends SemSizedType, TSemBooleanType { + final override string toString() { result = "bool" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * A numeric type. This includes `SemSignedIntegerType`, `SemUnsignedIntegerType`, and + * `SemFloatingPointType`. + */ +class SemNumericType extends SemSizedType { + SemNumericType() { + this = TSemIntegerType(byteSize, _) or + this = TSemFloatingPointType(byteSize) + } + // Don't override `getByteSize()` here. The optimizer seems to generate better code when this is + // overridden only in the leaf classes. +} + +/** + * An integer type. This includes `SemSignedIntegerType` and `SemUnsignedIntegerType`. + */ +class SemIntegerType extends SemNumericType { + boolean signed; + + SemIntegerType() { this = TSemIntegerType(byteSize, signed) } + + /** Holds if this integer type is signed. */ + final predicate isSigned() { signed = true } + + /** Holds if this integer type is unsigned. */ + final predicate isUnsigned() { not isSigned() } + // Don't override `getByteSize()` here. The optimizer seems to generate better code when this is + // overridden only in the leaf classes. +} + +/** + * A signed two's-complement integer. Also used to represent enums whose underlying type is a signed + * integer, as well as character types whose representation is signed. + */ +class SemSignedIntegerType extends SemIntegerType { + SemSignedIntegerType() { signed = true } + + final override string toString() { result = "int" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * An unsigned two's-complement integer. Also used to represent enums whose underlying type is an + * unsigned integer, as well as character types whose representation is unsigned. + */ +class SemUnsignedIntegerType extends SemIntegerType { + SemUnsignedIntegerType() { signed = false } + + final override string toString() { result = "uint" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * A floating-point type. + */ +class SemFloatingPointType extends SemNumericType, TSemFloatingPointType { + final override string toString() { result = "float" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * An address type, representing the memory address of data. Used to represent pointers, references, + * and lvalues, include those that are garbage collected. + * + * The address of a function is represented by the separate `SemFunctionAddressType`. + */ +class SemAddressType extends SemSizedType, TSemAddressType { + final override string toString() { result = "addr" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * An address type, representing the memory address of code. Used to represent function pointers, + * function references, and the target of a direct function call. + */ +class SemFunctionAddressType extends SemSizedType, TSemFunctionAddressType { + final override string toString() { result = "func" + byteSize.toString() } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +/** + * A type with known size that does not fit any of the other kinds of type. Used to represent + * classes, structs, unions, fixed-size arrays, pointers-to-member, and more. + */ +class SemOpaqueType extends SemSizedType, TSemOpaqueType { + Specific::OpaqueTypeTag tag; + + SemOpaqueType() { this = TSemOpaqueType(byteSize, tag) } + + final override string toString() { + result = "opaque" + byteSize.toString() + "{" + tag.toString() + "}" + } + + final override string getIdentityString() { + result = "opaque" + byteSize.toString() + "{" + Specific::getOpaqueTagIdentityString(tag) + "}" + } + + /** + * Gets the "tag" that differentiates this type from other incompatible opaque types that have the + * same size. + */ + final Specific::OpaqueTypeTag getTag() { result = tag } + + pragma[noinline] + final override int getByteSize() { result = byteSize } +} + +cached +SemType getSemanticType(Specific::Type type) { + exists(int byteSize | + Specific::booleanType(type, byteSize) and result = TSemBooleanType(byteSize) + or + exists(boolean signed | + Specific::integerType(type, byteSize, signed) and + result = TSemIntegerType(byteSize, signed) + ) + or + Specific::floatingPointType(type, byteSize) and result = TSemFloatingPointType(byteSize) + or + Specific::addressType(type, byteSize) and result = TSemAddressType(byteSize) + or + Specific::functionAddressType(type, byteSize) and result = TSemFunctionAddressType(byteSize) + or + exists(Specific::OpaqueTypeTag tag | + Specific::opaqueType(type, byteSize, tag) and result = TSemOpaqueType(byteSize, tag) + ) + ) + or + Specific::errorType(type) and result = TSemErrorType() + or + Specific::unknownType(type) and result = TSemUnknownType() +} + +/** + * Holds if the conversion from `fromType` to `toType` can never overflow or underflow. + */ +predicate conversionCannotOverflow(SemNumericType fromType, SemNumericType toType) { + // Identity cast + fromType = toType + or + // Treat any cast to an FP type as safe. It can lose precision, but not overflow. + toType instanceof SemFloatingPointType and fromType = any(SemNumericType n) + or + exists(SemIntegerType fromInteger, SemIntegerType toInteger, int fromSize, int toSize | + fromInteger = fromType and + toInteger = toType and + fromSize = fromInteger.getByteSize() and + toSize = toInteger.getByteSize() + | + // Conversion to a larger type. Safe unless converting signed -> unsigned. + fromSize < toSize and + ( + toInteger.isSigned() + or + not fromInteger.isSigned() + ) + ) +} + +/** + * INTERNAL: Do not use. + * Query predicates used to check invariants that should hold for all `SemType` objects. + */ +module SemTypeConsistency { + /** + * Holds if the type has no result for `getSemanticType()`. + */ + query predicate missingSemType(Specific::Type type, string message) { + not exists(getSemanticType(type)) and + message = "`Type` does not have a corresponding `SemType`." + } + + /** + * Holds if the type has more than one result for `getSemanticType()`. + */ + query predicate multipleSemTypes(Specific::Type type, string message) { + strictcount(getSemanticType(type)) > 1 and + message = + "`Type` " + type + " has multiple `SemType`s: " + + concat(getSemanticType(type).toString(), ", ") + } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticTypeSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticTypeSpecific.qll new file mode 100644 index 00000000000..e301587de2f --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticTypeSpecific.qll @@ -0,0 +1,43 @@ +/** + * C++-specific implementation of the semantic type system. + */ + +private import semmle.code.cpp.ir.IR as IR +private import cpp as Cpp +private import semmle.code.cpp.ir.internal.IRCppLanguage as Language + +class Type = IR::IRType; + +class OpaqueTypeTag = Language::OpaqueTypeTag; + +predicate voidType(Type type) { type instanceof IR::IRVoidType } + +predicate errorType(Type type) { type instanceof IR::IRErrorType } + +predicate unknownType(Type type) { type instanceof IR::IRUnknownType } + +predicate booleanType(Type type, int byteSize) { byteSize = type.(IR::IRBooleanType).getByteSize() } + +predicate integerType(Type type, int byteSize, boolean signed) { + byteSize = type.(IR::IRSignedIntegerType).getByteSize() and signed = true + or + byteSize = type.(IR::IRUnsignedIntegerType).getByteSize() and signed = false +} + +predicate floatingPointType(Type type, int byteSize) { + byteSize = type.(IR::IRFloatingPointType).getByteSize() +} + +predicate addressType(Type type, int byteSize) { byteSize = type.(IR::IRAddressType).getByteSize() } + +predicate functionAddressType(Type type, int byteSize) { + byteSize = type.(IR::IRFunctionAddressType).getByteSize() +} + +predicate opaqueType(Type type, int byteSize, OpaqueTypeTag tag) { + exists(IR::IROpaqueType opaque | opaque = type | + byteSize = opaque.getByteSize() and tag = opaque.getTag() + ) +} + +predicate getOpaqueTagIdentityString = Language::getOpaqueTagIdentityString/1; diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysis.qll new file mode 100644 index 00000000000..2cfa99ae30a --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysis.qll @@ -0,0 +1,31 @@ +/** + * Simple constant analysis using the Semantic interface. + */ + +private import experimental.semmle.code.cpp.semantic.Semantic +private import ConstantAnalysisSpecific as Specific + +/** An expression that always has the same integer value. */ +pragma[nomagic] +private predicate constantIntegerExpr(SemExpr e, int val) { + // An integer literal + e.(SemIntegerLiteralExpr).getIntValue() = val + or + // Copy of another constant + exists(SemSsaExplicitUpdate v, SemExpr src | + e = v.getAUse() and + src = v.getSourceExpr() and + constantIntegerExpr(src, val) + ) + or + // Language-specific enhancements + val = Specific::getIntConstantValue(e) +} + +/** An expression that always has the same integer value. */ +class SemConstantIntegerExpr extends SemExpr { + SemConstantIntegerExpr() { constantIntegerExpr(this, _) } + + /** Gets the integer value of this expression. */ + int getIntValue() { constantIntegerExpr(this, result) } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysisSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysisSpecific.qll new file mode 100644 index 00000000000..cd7f96d6557 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ConstantAnalysisSpecific.qll @@ -0,0 +1,10 @@ +/** + * C++-specific implementation of constant analysis. + */ + +private import experimental.semmle.code.cpp.semantic.Semantic + +/** + * Gets the constant integer value of the specified expression, if any. + */ +int getIntConstantValue(SemExpr expr) { none() } diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysis.qll new file mode 100644 index 00000000000..8e025effbc7 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysis.qll @@ -0,0 +1,310 @@ +/** + * Provides inferences of the form: `e` equals `b + v` modulo `m` where `e` is + * an expression, `b` is a `Bound` (typically zero or the value of an SSA + * variable), and `v` is an integer in the range `[0 .. m-1]`. + */ + +private import ModulusAnalysisSpecific::Private +private import experimental.semmle.code.cpp.semantic.Semantic +private import ConstantAnalysis +private import RangeUtils + +/** + * Holds if `e + delta` equals `v` at `pos`. + */ +private predicate valueFlowStepSsa(SemSsaVariable v, SemSsaReadPosition pos, SemExpr e, int delta) { + semSsaUpdateStep(v, e, delta) and pos.hasReadOfVar(v) + or + exists(SemGuard guard, boolean testIsTrue | + pos.hasReadOfVar(v) and + guard = semEqFlowCond(v, e, delta, true, testIsTrue) and + semGuardDirectlyControlsSsaRead(guard, pos, testIsTrue) + ) +} + +/** + * Holds if `add` is the addition of `larg` and `rarg`, neither of which are + * `ConstantIntegerExpr`s. + */ +private predicate nonConstAddition(SemExpr add, SemExpr larg, SemExpr rarg) { + exists(SemAddExpr a | a = add | + larg = a.getLeftOperand() and + rarg = a.getRightOperand() + ) and + not larg instanceof SemConstantIntegerExpr and + not rarg instanceof SemConstantIntegerExpr +} + +/** + * Holds if `sub` is the subtraction of `larg` and `rarg`, where `rarg` is not + * a `ConstantIntegerExpr`. + */ +private predicate nonConstSubtraction(SemExpr sub, SemExpr larg, SemExpr rarg) { + exists(SemSubExpr s | s = sub | + larg = s.getLeftOperand() and + rarg = s.getRightOperand() + ) and + not rarg instanceof SemConstantIntegerExpr +} + +/** Gets an expression that is the remainder modulo `mod` of `arg`. */ +private SemExpr modExpr(SemExpr arg, int mod) { + exists(SemRemExpr rem | + result = rem and + arg = rem.getLeftOperand() and + rem.getRightOperand().(SemConstantIntegerExpr).getIntValue() = mod and + mod >= 2 + ) + or + exists(SemConstantIntegerExpr c | + mod = 2.pow([1 .. 30]) and + c.getIntValue() = mod - 1 and + result.(SemBitAndExpr).hasOperands(arg, c) + ) +} + +/** + * Gets a guard that tests whether `v` is congruent with `val` modulo `mod` on + * its `testIsTrue` branch. + */ +private SemGuard moduloCheck(SemSsaVariable v, int val, int mod, boolean testIsTrue) { + exists(SemExpr rem, SemConstantIntegerExpr c, int r, boolean polarity | + result.isEquality(rem, c, polarity) and + c.getIntValue() = r and + rem = modExpr(v.getAUse(), mod) and + ( + testIsTrue = polarity and val = r + or + testIsTrue = polarity.booleanNot() and + mod = 2 and + val = 1 - r and + (r = 0 or r = 1) + ) + ) +} + +/** + * Holds if a guard ensures that `v` at `pos` is congruent with `val` modulo `mod`. + */ +private predicate moduloGuardedRead(SemSsaVariable v, SemSsaReadPosition pos, int val, int mod) { + exists(SemGuard guard, boolean testIsTrue | + pos.hasReadOfVar(v) and + guard = moduloCheck(v, val, mod, testIsTrue) and + semGuardControlsSsaRead(guard, pos, testIsTrue) + ) +} + +/** Holds if `factor` is a power of 2 that divides `mask`. */ +bindingset[mask] +private predicate andmaskFactor(int mask, int factor) { + mask % factor = 0 and + factor = 2.pow([1 .. 30]) +} + +/** Holds if `e` is evenly divisible by `factor`. */ +private predicate evenlyDivisibleExpr(SemExpr e, int factor) { + exists(SemConstantIntegerExpr c, int k | k = c.getIntValue() | + e.(SemMulExpr).getAnOperand() = c and factor = k.abs() and factor >= 2 + or + e.(SemShiftLeftExpr).getRightOperand() = c and factor = 2.pow(k) and k > 0 + or + e.(SemBitAndExpr).getAnOperand() = c and factor = max(int f | andmaskFactor(k, f)) + ) +} + +/** + * Holds if `rix` is the number of input edges to `phi`. + */ +private predicate maxPhiInputRank(SemSsaPhiNode phi, int rix) { + rix = max(int r | rankedPhiInput(phi, _, _, r)) +} + +/** + * Gets the remainder of `val` modulo `mod`. + * + * For `mod = 0` the result equals `val` and for `mod > 1` the result is within + * the range `[0 .. mod-1]`. + */ +bindingset[val, mod] +private int remainder(int val, int mod) { + mod = 0 and result = val + or + mod > 1 and result = ((val % mod) + mod) % mod +} + +/** + * Holds if `inp` is an input to `phi` and equals `phi` modulo `mod` along `edge`. + */ +private predicate phiSelfModulus( + SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge, int mod +) { + exists(SemSsaBound phibound, int v, int m | + edge.phiInput(phi, inp) and + phibound.getAVariable() = phi and + ssaModulus(inp, edge, phibound, v, m) and + mod = m.gcd(v) and + mod != 1 + ) +} + +/** + * Holds if `b + val` modulo `mod` is a candidate congruence class for `phi`. + */ +private predicate phiModulusInit(SemSsaPhiNode phi, SemBound b, int val, int mod) { + exists(SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge | + edge.phiInput(phi, inp) and + ssaModulus(inp, edge, b, val, mod) + ) +} + +/** + * Holds if all inputs to `phi` numbered `1` to `rix` are equal to `b + val` modulo `mod`. + */ +private predicate phiModulusRankStep(SemSsaPhiNode phi, SemBound b, int val, int mod, int rix) { + rix = 0 and + phiModulusInit(phi, b, val, mod) + or + exists(SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge, int v1, int m1 | + mod != 1 and + val = remainder(v1, mod) + | + exists(int v2, int m2 | + rankedPhiInput(phi, inp, edge, rix) and + phiModulusRankStep(phi, b, v1, m1, rix - 1) and + ssaModulus(inp, edge, b, v2, m2) and + mod = m1.gcd(m2).gcd(v1 - v2) + ) + or + exists(int m2 | + rankedPhiInput(phi, inp, edge, rix) and + phiModulusRankStep(phi, b, v1, m1, rix - 1) and + phiSelfModulus(phi, inp, edge, m2) and + mod = m1.gcd(m2) + ) + ) +} + +/** + * Holds if `phi` is equal to `b + val` modulo `mod`. + */ +private predicate phiModulus(SemSsaPhiNode phi, SemBound b, int val, int mod) { + exists(int r | + maxPhiInputRank(phi, r) and + phiModulusRankStep(phi, b, val, mod, r) + ) +} + +/** + * Holds if `v` at `pos` is equal to `b + val` modulo `mod`. + */ +private predicate ssaModulus(SemSsaVariable v, SemSsaReadPosition pos, SemBound b, int val, int mod) { + phiModulus(v, b, val, mod) and pos.hasReadOfVar(v) + or + b.(SemSsaBound).getAVariable() = v and pos.hasReadOfVar(v) and val = 0 and mod = 0 + or + exists(SemExpr e, int val0, int delta | + semExprModulus(e, b, val0, mod) and + valueFlowStepSsa(v, pos, e, delta) and + val = remainder(val0 + delta, mod) + ) + or + moduloGuardedRead(v, pos, val, mod) and b instanceof SemZeroBound +} + +/** + * Holds if `e` is equal to `b + val` modulo `mod`. + * + * There are two cases for the modulus: + * - `mod = 0`: The equality `e = b + val` is an ordinary equality. + * - `mod > 1`: `val` lies within the range `[0 .. mod-1]`. + */ +cached +predicate semExprModulus(SemExpr e, SemBound b, int val, int mod) { + not ignoreExprModulus(e) and + ( + e = b.getExpr(val) and mod = 0 + or + evenlyDivisibleExpr(e, mod) and + val = 0 and + b instanceof SemZeroBound + or + exists(SemSsaVariable v, SemSsaReadPositionBlock bb | + ssaModulus(v, bb, b, val, mod) and + e = v.getAUse() and + bb.getAnExpr() = e + ) + or + exists(SemExpr mid, int val0, int delta | + semExprModulus(mid, b, val0, mod) and + semValueFlowStep(e, mid, delta) and + val = remainder(val0 + delta, mod) + ) + or + exists(SemConditionalExpr cond, int v1, int v2, int m1, int m2 | + cond = e and + condExprBranchModulus(cond, true, b, v1, m1) and + condExprBranchModulus(cond, false, b, v2, m2) and + mod = m1.gcd(m2).gcd(v1 - v2) and + mod != 1 and + val = remainder(v1, mod) + ) + or + exists(SemBound b1, SemBound b2, int v1, int v2, int m1, int m2 | + addModulus(e, true, b1, v1, m1) and + addModulus(e, false, b2, v2, m2) and + mod = m1.gcd(m2) and + mod != 1 and + val = remainder(v1 + v2, mod) + | + b = b1 and b2 instanceof SemZeroBound + or + b = b2 and b1 instanceof SemZeroBound + ) + or + exists(int v1, int v2, int m1, int m2 | + subModulus(e, true, b, v1, m1) and + subModulus(e, false, any(SemZeroBound zb), v2, m2) and + mod = m1.gcd(m2) and + mod != 1 and + val = remainder(v1 - v2, mod) + ) + ) +} + +private predicate condExprBranchModulus( + SemConditionalExpr cond, boolean branch, SemBound b, int val, int mod +) { + semExprModulus(cond.getBranchExpr(branch), b, val, mod) +} + +private predicate addModulus(SemExpr add, boolean isLeft, SemBound b, int val, int mod) { + exists(SemExpr larg, SemExpr rarg | nonConstAddition(add, larg, rarg) | + semExprModulus(larg, b, val, mod) and isLeft = true + or + semExprModulus(rarg, b, val, mod) and isLeft = false + ) +} + +private predicate subModulus(SemExpr sub, boolean isLeft, SemBound b, int val, int mod) { + exists(SemExpr larg, SemExpr rarg | nonConstSubtraction(sub, larg, rarg) | + semExprModulus(larg, b, val, mod) and isLeft = true + or + semExprModulus(rarg, b, val, mod) and isLeft = false + ) +} + +/** + * Holds if `inp` is an input to `phi` along `edge` and this input has index `r` + * in an arbitrary 1-based numbering of the input edges to `phi`. + */ +private predicate rankedPhiInput( + SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge, int r +) { + edge.phiInput(phi, inp) and + edge = + rank[r](SemSsaReadPositionPhiInputEdge e | + e.phiInput(phi, _) + | + e order by e.getOrigBlock().getUniqueId() + ) +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysisSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysisSpecific.qll new file mode 100644 index 00000000000..a2fb5598e0e --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/ModulusAnalysisSpecific.qll @@ -0,0 +1,8 @@ +/** + * C++-specific implementation of modulus analysis. + */ +module Private { + private import experimental.semmle.code.cpp.semantic.Semantic + + predicate ignoreExprModulus(SemExpr e) { none() } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysis.qll new file mode 100644 index 00000000000..3d5bea8bca6 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysis.qll @@ -0,0 +1,807 @@ +/** + * Provides classes and predicates for range analysis. + * + * An inferred bound can either be a specific integer, the abstract value of an + * SSA variable, or the abstract value of an interesting expression. The latter + * category includes array lengths that are not SSA variables. + * + * If an inferred bound relies directly on a condition, then this condition is + * reported as the reason for the bound. + */ + +/* + * This library tackles range analysis as a flow problem. Consider e.g.: + * ``` + * len = arr.length; + * if (x < len) { ... y = x-1; ... y ... } + * ``` + * In this case we would like to infer `y <= arr.length - 2`, and this is + * accomplished by tracking the bound through a sequence of steps: + * ``` + * arr.length --> len = .. --> x < len --> x-1 --> y = .. --> y + * ``` + * + * In its simplest form the step relation `E1 --> E2` relates two expressions + * such that `E1 <= B` implies `E2 <= B` for any `B` (with a second separate + * step relation handling lower bounds). Examples of such steps include + * assignments `E2 = E1` and conditions `x <= E1` where `E2` is a use of `x` + * guarded by the condition. + * + * In order to handle subtractions and additions with constants, and strict + * comparisons, the step relation is augmented with an integer delta. With this + * generalization `E1 --(delta)--> E2` relates two expressions and an integer + * such that `E1 <= B` implies `E2 <= B + delta` for any `B`. This corresponds + * to the predicate `boundFlowStep`. + * + * The complete range analysis is then implemented as the transitive closure of + * the step relation summing the deltas along the way. If `E1` transitively + * steps to `E2`, `delta` is the sum of deltas along the path, and `B` is an + * interesting bound equal to the value of `E1` then `E2 <= B + delta`. This + * corresponds to the predicate `bounded`. + * + * Phi nodes need a little bit of extra handling. Consider `x0 = phi(x1, x2)`. + * There are essentially two cases: + * - If `x1 <= B + d1` and `x2 <= B + d2` then `x0 <= B + max(d1,d2)`. + * - If `x1 <= B + d1` and `x2 <= x0 + d2` with `d2 <= 0` then `x0 <= B + d1`. + * The first case is for whenever a bound can be proven without taking looping + * into account. The second case is relevant when `x2` comes from a back-edge + * where we can prove that the variable has been non-increasing through the + * loop-iteration as this means that any upper bound that holds prior to the + * loop also holds for the variable during the loop. + * This generalizes to a phi node with `n` inputs, so if + * `x0 = phi(x1, ..., xn)` and `xi <= B + delta` for one of the inputs, then we + * also have `x0 <= B + delta` if we can prove either: + * - `xj <= B + d` with `d <= delta` or + * - `xj <= x0 + d` with `d <= 0` + * for each input `xj`. + * + * As all inferred bounds can be related directly to a path in the source code + * the only source of non-termination is if successive redundant (and thereby + * increasingly worse) bounds are calculated along a loop in the source code. + * We prevent this by weakening the bound to a small finite set of bounds when + * a path follows a second back-edge (we postpone weakening till the second + * back-edge as a precise bound might require traversing a loop once). + */ + +private import RangeAnalysisSpecific as Specific +private import RangeUtils +private import SignAnalysisCommon +private import ModulusAnalysis +private import experimental.semmle.code.cpp.semantic.Semantic +private import ConstantAnalysis + +cached +private module RangeAnalysisCache { + cached + module RangeAnalysisPublic { + /** + * Holds if `b + delta` is a valid bound for `e`. + * - `upper = true` : `e <= b + delta` + * - `upper = false` : `e >= b + delta` + * + * The reason for the bound is given by `reason` and may be either a condition + * or `NoReason` if the bound was proven directly without the use of a bounding + * condition. + */ + cached + predicate semBounded(SemExpr e, SemBound b, int delta, boolean upper, SemReason reason) { + bounded(e, b, delta, upper, _, _, reason) and + bestBound(e, b, delta, upper) + } + } + + /** + * Holds if `guard = boundFlowCond(_, _, _, _, _) or guard = eqFlowCond(_, _, _, _, _)`. + */ + cached + predicate possibleReason(SemGuard guard) { + guard = boundFlowCond(_, _, _, _, _) or guard = semEqFlowCond(_, _, _, _, _) + } +} + +private import RangeAnalysisCache +import RangeAnalysisPublic + +/** + * Holds if `b + delta` is a valid bound for `e` and this is the best such delta. + * - `upper = true` : `e <= b + delta` + * - `upper = false` : `e >= b + delta` + */ +private predicate bestBound(SemExpr e, SemBound b, int delta, boolean upper) { + delta = min(int d | bounded(e, b, d, upper, _, _, _)) and upper = true + or + delta = max(int d | bounded(e, b, d, upper, _, _, _)) and upper = false +} + +/** + * Holds if `comp` corresponds to: + * - `upper = true` : `v <= e + delta` or `v < e + delta` + * - `upper = false` : `v >= e + delta` or `v > e + delta` + */ +private predicate boundCondition( + SemRelationalExpr comp, SemSsaVariable v, SemExpr e, int delta, boolean upper +) { + comp.getLesserOperand() = semSsaRead(v, delta) and e = comp.getGreaterOperand() and upper = true + or + comp.getGreaterOperand() = semSsaRead(v, delta) and e = comp.getLesserOperand() and upper = false + or + exists(SemSubExpr sub, SemConstantIntegerExpr c, int d | + // (v - d) - e < c + comp.getLesserOperand() = sub and + comp.getGreaterOperand() = c and + sub.getLeftOperand() = semSsaRead(v, d) and + sub.getRightOperand() = e and + upper = true and + delta = d + c.getIntValue() + or + // (v - d) - e > c + comp.getGreaterOperand() = sub and + comp.getLesserOperand() = c and + sub.getLeftOperand() = semSsaRead(v, d) and + sub.getRightOperand() = e and + upper = false and + delta = d + c.getIntValue() + or + // e - (v - d) < c + comp.getLesserOperand() = sub and + comp.getGreaterOperand() = c and + sub.getLeftOperand() = e and + sub.getRightOperand() = semSsaRead(v, d) and + upper = false and + delta = d - c.getIntValue() + or + // e - (v - d) > c + comp.getGreaterOperand() = sub and + comp.getLesserOperand() = c and + sub.getLeftOperand() = e and + sub.getRightOperand() = semSsaRead(v, d) and + upper = true and + delta = d - c.getIntValue() + ) +} + +/** + * Holds if `comp` is a comparison between `x` and `y` for which `y - x` has a + * fixed value modulo some `mod > 1`, such that the comparison can be + * strengthened by `strengthen` when evaluating to `testIsTrue`. + */ +private predicate modulusComparison(SemRelationalExpr comp, boolean testIsTrue, int strengthen) { + exists( + SemBound b, int v1, int v2, int mod1, int mod2, int mod, boolean resultIsStrict, int d, int k + | + // If `x <= y` and `x =(mod) b + v1` and `y =(mod) b + v2` then + // `0 <= y - x =(mod) v2 - v1`. By choosing `k =(mod) v2 - v1` with + // `0 <= k < mod` we get `k <= y - x`. If the resulting comparison is + // strict then the strengthening amount is instead `k - 1` modulo `mod`: + // `x < y` means `0 <= y - x - 1 =(mod) k - 1` so `k - 1 <= y - x - 1` and + // thus `k - 1 < y - x` with `0 <= k - 1 < mod`. + semExprModulus(comp.getLesserOperand(), b, v1, mod1) and + semExprModulus(comp.getGreaterOperand(), b, v2, mod2) and + mod = mod1.gcd(mod2) and + mod != 1 and + (testIsTrue = true or testIsTrue = false) and + ( + if comp.isStrict() + then resultIsStrict = testIsTrue + else resultIsStrict = testIsTrue.booleanNot() + ) and + ( + resultIsStrict = true and d = 1 + or + resultIsStrict = false and d = 0 + ) and + ( + testIsTrue = true and k = v2 - v1 + or + testIsTrue = false and k = v1 - v2 + ) and + strengthen = (((k - d) % mod) + mod) % mod + ) +} + +/** + * Gets a condition that tests whether `v` is bounded by `e + delta`. + * + * If the condition evaluates to `testIsTrue`: + * - `upper = true` : `v <= e + delta` + * - `upper = false` : `v >= e + delta` + */ +private SemGuard boundFlowCond( + SemSsaVariable v, SemExpr e, int delta, boolean upper, boolean testIsTrue +) { + exists( + SemRelationalExpr comp, int d1, int d2, int d3, int strengthen, boolean compIsUpper, + boolean resultIsStrict + | + comp = result.asExpr() and + boundCondition(comp, v, e, d1, compIsUpper) and + (testIsTrue = true or testIsTrue = false) and + upper = compIsUpper.booleanXor(testIsTrue.booleanNot()) and + ( + if comp.isStrict() + then resultIsStrict = testIsTrue + else resultIsStrict = testIsTrue.booleanNot() + ) and + ( + if getTrackedTypeForSsaVariable(v) instanceof SemIntegerType + then + upper = true and strengthen = -1 + or + upper = false and strengthen = 1 + else strengthen = 0 + ) and + ( + exists(int k | modulusComparison(comp, testIsTrue, k) and d2 = strengthen * k) + or + not modulusComparison(comp, testIsTrue, _) and d2 = 0 + ) and + // A strict inequality `x < y` can be strengthened to `x <= y - 1`. + ( + resultIsStrict = true and d3 = strengthen + or + resultIsStrict = false and d3 = 0 + ) and + delta = d1 + d2 + d3 + ) + or + exists(boolean testIsTrue0 | + semImplies_v2(result, testIsTrue, boundFlowCond(v, e, delta, upper, testIsTrue0), testIsTrue0) + ) + or + result = semEqFlowCond(v, e, delta, true, testIsTrue) and + (upper = true or upper = false) + or + // guard that tests whether `v2` is bounded by `e + delta + d1 - d2` and + // exists a guard `guardEq` such that `v = v2 - d1 + d2`. + exists(SemSsaVariable v2, SemGuard guardEq, boolean eqIsTrue, int d1, int d2 | + guardEq = semEqFlowCond(v, semSsaRead(v2, d1), d2, true, eqIsTrue) and + result = boundFlowCond(v2, e, delta + d1 - d2, upper, testIsTrue) and + // guardEq needs to control guard + guardEq.directlyControls(result.getBasicBlock(), eqIsTrue) + ) +} + +private newtype TSemReason = + TSemNoReason() or + TSemCondReason(SemGuard guard) { possibleReason(guard) } + +/** + * A reason for an inferred bound. This can either be `CondReason` if the bound + * is due to a specific condition, or `NoReason` if the bound is inferred + * without going through a bounding condition. + */ +abstract class SemReason extends TSemReason { + /** Gets a textual representation of this reason. */ + abstract string toString(); +} + +/** + * A reason for an inferred bound that indicates that the bound is inferred + * without going through a bounding condition. + */ +class SemNoReason extends SemReason, TSemNoReason { + override string toString() { result = "NoReason" } +} + +/** A reason for an inferred bound pointing to a condition. */ +class SemCondReason extends SemReason, TSemCondReason { + /** Gets the condition that is the reason for the bound. */ + SemGuard getCond() { this = TSemCondReason(result) } + + override string toString() { result = getCond().toString() } +} + +/** + * Holds if `e + delta` is a valid bound for `v` at `pos`. + * - `upper = true` : `v <= e + delta` + * - `upper = false` : `v >= e + delta` + */ +private predicate boundFlowStepSsa( + SemSsaVariable v, SemSsaReadPosition pos, SemExpr e, int delta, boolean upper, SemReason reason +) { + semSsaUpdateStep(v, e, delta) and + pos.hasReadOfVar(v) and + (upper = true or upper = false) and + reason = TSemNoReason() + or + exists(SemGuard guard, boolean testIsTrue | + pos.hasReadOfVar(v) and + guard = boundFlowCond(v, e, delta, upper, testIsTrue) and + semGuardDirectlyControlsSsaRead(guard, pos, testIsTrue) and + reason = TSemCondReason(guard) + ) +} + +/** Holds if `v != e + delta` at `pos` and `v` is of integral type. */ +private predicate unequalFlowStepIntegralSsa( + SemSsaVariable v, SemSsaReadPosition pos, SemExpr e, int delta, SemReason reason +) { + getTrackedTypeForSsaVariable(v) instanceof SemIntegerType and + exists(SemGuard guard, boolean testIsTrue | + pos.hasReadOfVar(v) and + guard = semEqFlowCond(v, e, delta, false, testIsTrue) and + semGuardDirectlyControlsSsaRead(guard, pos, testIsTrue) and + reason = TSemCondReason(guard) + ) +} + +/** + * An expression that does conversion, boxing, or unboxing + */ +private class ConvertOrBoxExpr extends SemUnaryExpr { + ConvertOrBoxExpr() { + this instanceof SemConvertExpr + or + this instanceof SemBoxExpr + or + this instanceof SemUnboxExpr + } +} + +/** + * A cast that can be ignored for the purpose of range analysis. + */ +private class SafeCastExpr extends ConvertOrBoxExpr { + SafeCastExpr() { conversionCannotOverflow(getTrackedType(getOperand()), getTrackedType(this)) } +} + +/** + * Holds if `typ` is a small integral type with the given lower and upper bounds. + */ +private predicate typeBound(SemIntegerType typ, int lowerbound, int upperbound) { + exists(int bitSize | bitSize = typ.getByteSize() * 8 | + bitSize < 32 and + ( + if typ.isSigned() + then ( + upperbound = 1.bitShiftLeft(bitSize - 1) - 1 and + lowerbound = -upperbound - 1 + ) else ( + lowerbound = 0 and + upperbound = 1.bitShiftLeft(bitSize) - 1 + ) + ) + ) +} + +/** + * A cast to a small integral type that may overflow or underflow. + */ +private class NarrowingCastExpr extends ConvertOrBoxExpr { + NarrowingCastExpr() { + not this instanceof SafeCastExpr and + typeBound(getTrackedType(this), _, _) + } + + /** Gets the lower bound of the resulting type. */ + int getLowerBound() { typeBound(getTrackedType(this), result, _) } + + /** Gets the upper bound of the resulting type. */ + int getUpperBound() { typeBound(getTrackedType(this), _, result) } +} + +/** Holds if `e >= 1` as determined by sign analysis. */ +private predicate strictlyPositiveIntegralExpr(SemExpr e) { + semStrictlyPositive(e) and getTrackedType(e) instanceof SemIntegerType +} + +/** Holds if `e <= -1` as determined by sign analysis. */ +private predicate strictlyNegativeIntegralExpr(SemExpr e) { + semStrictlyNegative(e) and getTrackedType(e) instanceof SemIntegerType +} + +/** + * Holds if `e1 + delta` is a valid bound for `e2`. + * - `upper = true` : `e2 <= e1 + delta` + * - `upper = false` : `e2 >= e1 + delta` + */ +private predicate boundFlowStep(SemExpr e2, SemExpr e1, int delta, boolean upper) { + semValueFlowStep(e2, e1, delta) and + (upper = true or upper = false) + or + e2.(SafeCastExpr).getOperand() = e1 and + delta = 0 and + (upper = true or upper = false) + or + exists(SemExpr x | e2.(SemAddExpr).hasOperands(e1, x) | + // `x instanceof ConstantIntegerExpr` is covered by valueFlowStep + not x instanceof SemConstantIntegerExpr and + not e1 instanceof SemConstantIntegerExpr and + if strictlyPositiveIntegralExpr(x) + then upper = false and delta = 1 + else + if semPositive(x) + then upper = false and delta = 0 + else + if strictlyNegativeIntegralExpr(x) + then upper = true and delta = -1 + else + if semNegative(x) + then upper = true and delta = 0 + else none() + ) + or + exists(SemExpr x, SemSubExpr sub | + e2 = sub and + sub.getLeftOperand() = e1 and + sub.getRightOperand() = x + | + // `x instanceof ConstantIntegerExpr` is covered by valueFlowStep + not x instanceof SemConstantIntegerExpr and + if strictlyPositiveIntegralExpr(x) + then upper = true and delta = -1 + else + if semPositive(x) + then upper = true and delta = 0 + else + if strictlyNegativeIntegralExpr(x) + then upper = false and delta = 1 + else + if semNegative(x) + then upper = false and delta = 0 + else none() + ) + or + e2.(SemRemExpr).getRightOperand() = e1 and + semPositive(e1) and + delta = -1 and + upper = true + or + e2.(SemRemExpr).getLeftOperand() = e1 and semPositive(e1) and delta = 0 and upper = true + or + e2.(SemBitAndExpr).getAnOperand() = e1 and + semPositive(e1) and + delta = 0 and + upper = true + or + e2.(SemBitOrExpr).getAnOperand() = e1 and + semPositive(e2) and + delta = 0 and + upper = false + or + Specific::hasBound(e2, e1, delta, upper) +} + +/** Holds if `e2 = e1 * factor` and `factor > 0`. */ +private predicate boundFlowStepMul(SemExpr e2, SemExpr e1, int factor) { + exists(SemConstantIntegerExpr c, int k | k = c.getIntValue() and k > 0 | + e2.(SemMulExpr).hasOperands(e1, c) and factor = k + or + exists(SemShiftLeftExpr e | + e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) + ) + ) +} + +/** + * Holds if `e2 = e1 / factor` and `factor > 0`. + * + * This conflates division, right shift, and unsigned right shift and is + * therefore only valid for non-negative numbers. + */ +private predicate boundFlowStepDiv(SemExpr e2, SemExpr e1, int factor) { + exists(SemConstantIntegerExpr c, int k | k = c.getIntValue() and k > 0 | + exists(SemDivExpr e | + e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = k + ) + or + exists(SemShiftRightExpr e | + e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) + ) + or + exists(SemShiftRightUnsignedExpr e | + e = e2 and e.getLeftOperand() = e1 and e.getRightOperand() = c and factor = 2.pow(k) + ) + ) +} + +/** + * Holds if `b + delta` is a valid bound for `v` at `pos`. + * - `upper = true` : `v <= b + delta` + * - `upper = false` : `v >= b + delta` + */ +private predicate boundedSsa( + SemSsaVariable v, SemSsaReadPosition pos, SemBound b, int delta, boolean upper, + boolean fromBackEdge, int origdelta, SemReason reason +) { + exists(SemExpr mid, int d1, int d2, SemReason r1, SemReason r2 | + boundFlowStepSsa(v, pos, mid, d1, upper, r1) and + bounded(mid, b, d2, upper, fromBackEdge, origdelta, r2) and + // upper = true: v <= mid + d1 <= b + d1 + d2 = b + delta + // upper = false: v >= mid + d1 >= b + d1 + d2 = b + delta + delta = d1 + d2 and + (if r1 instanceof SemNoReason then reason = r2 else reason = r1) + ) + or + exists(int d, SemReason r1, SemReason r2 | + boundedSsa(v, pos, b, d, upper, fromBackEdge, origdelta, r2) or + boundedPhi(v, b, d, upper, fromBackEdge, origdelta, r2) + | + unequalIntegralSsa(v, pos, b, d, r1) and + ( + upper = true and delta = d - 1 + or + upper = false and delta = d + 1 + ) and + ( + reason = r1 + or + reason = r2 and not r2 instanceof SemNoReason + ) + ) +} + +/** + * Holds if `v != b + delta` at `pos` and `v` is of integral type. + */ +private predicate unequalIntegralSsa( + SemSsaVariable v, SemSsaReadPosition pos, SemBound b, int delta, SemReason reason +) { + exists(SemExpr e, int d1, int d2 | + unequalFlowStepIntegralSsa(v, pos, e, d1, reason) and + bounded(e, b, d2, true, _, _, _) and + bounded(e, b, d2, false, _, _, _) and + delta = d2 + d1 + ) +} + +/** Weakens a delta to lie in the range `[-1..1]`. */ +bindingset[delta, upper] +private int weakenDelta(boolean upper, int delta) { + delta in [-1 .. 1] and result = delta + or + upper = true and result = -1 and delta < -1 + or + upper = false and result = 1 and delta > 1 +} + +/** + * Holds if `b + delta` is a valid bound for `inp` when used as an input to + * `phi` along `edge`. + * - `upper = true` : `inp <= b + delta` + * - `upper = false` : `inp >= b + delta` + */ +private predicate boundedPhiInp( + SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge, SemBound b, int delta, + boolean upper, boolean fromBackEdge, int origdelta, SemReason reason +) { + edge.phiInput(phi, inp) and + exists(int d, boolean fromBackEdge0 | + boundedSsa(inp, edge, b, d, upper, fromBackEdge0, origdelta, reason) + or + boundedPhi(inp, b, d, upper, fromBackEdge0, origdelta, reason) + or + b.(SemSsaBound).getAVariable() = inp and + d = 0 and + (upper = true or upper = false) and + fromBackEdge0 = false and + origdelta = 0 and + reason = TSemNoReason() + | + if semBackEdge(phi, inp, edge) + then + fromBackEdge = true and + ( + fromBackEdge0 = true and delta = weakenDelta(upper, d - origdelta) + origdelta + or + fromBackEdge0 = false and delta = d + ) + else ( + delta = d and fromBackEdge = fromBackEdge0 + ) + ) +} + +/** + * Holds if `b + delta` is a valid bound for `inp` when used as an input to + * `phi` along `edge`. + * - `upper = true` : `inp <= b + delta` + * - `upper = false` : `inp >= b + delta` + * + * Equivalent to `boundedPhiInp(phi, inp, edge, b, delta, upper, _, _, _)`. + */ +pragma[noinline] +private predicate boundedPhiInp1( + SemSsaPhiNode phi, SemBound b, boolean upper, SemSsaVariable inp, + SemSsaReadPositionPhiInputEdge edge, int delta +) { + boundedPhiInp(phi, inp, edge, b, delta, upper, _, _, _) +} + +/** + * Holds if `phi` is a valid bound for `inp` when used as an input to `phi` + * along `edge`. + * - `upper = true` : `inp <= phi` + * - `upper = false` : `inp >= phi` + */ +private predicate selfBoundedPhiInp( + SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge, boolean upper +) { + exists(int d, SemSsaBound phibound | + phibound.getAVariable() = phi and + boundedPhiInp(phi, inp, edge, phibound, d, upper, _, _, _) and + ( + upper = true and d <= 0 + or + upper = false and d >= 0 + ) + ) +} + +/** + * Holds if `b + delta` is a valid bound for some input, `inp`, to `phi`, and + * thus a candidate bound for `phi`. + * - `upper = true` : `inp <= b + delta` + * - `upper = false` : `inp >= b + delta` + */ +pragma[noinline] +private predicate boundedPhiCand( + SemSsaPhiNode phi, boolean upper, SemBound b, int delta, boolean fromBackEdge, int origdelta, + SemReason reason +) { + exists(SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge | + boundedPhiInp(phi, inp, edge, b, delta, upper, fromBackEdge, origdelta, reason) + ) +} + +/** + * Holds if the candidate bound `b + delta` for `phi` is valid for the phi input + * `inp` along `edge`. + */ +private predicate boundedPhiCandValidForEdge( + SemSsaPhiNode phi, SemBound b, int delta, boolean upper, boolean fromBackEdge, int origdelta, + SemReason reason, SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge +) { + boundedPhiCand(phi, upper, b, delta, fromBackEdge, origdelta, reason) and + ( + exists(int d | boundedPhiInp1(phi, b, upper, inp, edge, d) | upper = true and d <= delta) + or + exists(int d | boundedPhiInp1(phi, b, upper, inp, edge, d) | upper = false and d >= delta) + or + selfBoundedPhiInp(phi, inp, edge, upper) + ) +} + +/** + * Holds if `b + delta` is a valid bound for `phi`. + * - `upper = true` : `phi <= b + delta` + * - `upper = false` : `phi >= b + delta` + */ +private predicate boundedPhi( + SemSsaPhiNode phi, SemBound b, int delta, boolean upper, boolean fromBackEdge, int origdelta, + SemReason reason +) { + forex(SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge | edge.phiInput(phi, inp) | + boundedPhiCandValidForEdge(phi, b, delta, upper, fromBackEdge, origdelta, reason, inp, edge) + ) +} + +/** + * Holds if `e` has an upper (for `upper = true`) or lower + * (for `upper = false`) bound of `b`. + */ +private predicate baseBound(SemExpr e, int b, boolean upper) { + Specific::hasConstantBound(e, b, upper) + or + upper = false and + b = 0 and + semPositive(e.(SemBitAndExpr).getAnOperand()) and + // REVIEW: We let the language opt out here to preserve original results. + not Specific::ignoreZeroLowerBound(e) +} + +/** + * Holds if the value being cast has an upper (for `upper = true`) or lower + * (for `upper = false`) bound within the bounds of the resulting type. + * For `upper = true` this means that the cast will not overflow and for + * `upper = false` this means that the cast will not underflow. + */ +private predicate safeNarrowingCast(NarrowingCastExpr cast, boolean upper) { + exists(int bound | bounded(cast.getOperand(), any(SemZeroBound zb), bound, upper, _, _, _) | + upper = true and bound <= cast.getUpperBound() + or + upper = false and bound >= cast.getLowerBound() + ) +} + +pragma[noinline] +private predicate boundedCastExpr( + NarrowingCastExpr cast, SemBound b, int delta, boolean upper, boolean fromBackEdge, int origdelta, + SemReason reason +) { + bounded(cast.getOperand(), b, delta, upper, fromBackEdge, origdelta, reason) +} + +/** + * Holds if `b + delta` is a valid bound for `e`. + * - `upper = true` : `e <= b + delta` + * - `upper = false` : `e >= b + delta` + */ +private predicate bounded( + SemExpr e, SemBound b, int delta, boolean upper, boolean fromBackEdge, int origdelta, + SemReason reason +) { + not Specific::ignoreExprBound(e) and + ( + e = b.getExpr(delta) and + (upper = true or upper = false) and + fromBackEdge = false and + origdelta = delta and + reason = TSemNoReason() + or + baseBound(e, delta, upper) and + b instanceof SemZeroBound and + fromBackEdge = false and + origdelta = delta and + reason = TSemNoReason() + or + exists(SemSsaVariable v, SemSsaReadPositionBlock bb | + boundedSsa(v, bb, b, delta, upper, fromBackEdge, origdelta, reason) and + e = v.getAUse() and + bb.getBlock() = e.getBasicBlock() + ) + or + exists(SemExpr mid, int d1, int d2 | + boundFlowStep(e, mid, d1, upper) and + // Constants have easy, base-case bounds, so let's not infer any recursive bounds. + not e instanceof SemConstantIntegerExpr and + bounded(mid, b, d2, upper, fromBackEdge, origdelta, reason) and + // upper = true: e <= mid + d1 <= b + d1 + d2 = b + delta + // upper = false: e >= mid + d1 >= b + d1 + d2 = b + delta + delta = d1 + d2 + ) + or + exists(SemSsaPhiNode phi | + boundedPhi(phi, b, delta, upper, fromBackEdge, origdelta, reason) and + e = phi.getAUse() + ) + or + exists(SemExpr mid, int factor, int d | + boundFlowStepMul(e, mid, factor) and + not e instanceof SemConstantIntegerExpr and + bounded(mid, b, d, upper, fromBackEdge, origdelta, reason) and + b instanceof SemZeroBound and + delta = d * factor + ) + or + exists(SemExpr mid, int factor, int d | + boundFlowStepDiv(e, mid, factor) and + not e instanceof SemConstantIntegerExpr and + bounded(mid, b, d, upper, fromBackEdge, origdelta, reason) and + b instanceof SemZeroBound and + d >= 0 and + delta = d / factor + ) + or + exists(NarrowingCastExpr cast | + cast = e and + safeNarrowingCast(cast, upper.booleanNot()) and + boundedCastExpr(cast, b, delta, upper, fromBackEdge, origdelta, reason) + ) + or + exists( + SemConditionalExpr cond, int d1, int d2, boolean fbe1, boolean fbe2, int od1, int od2, + SemReason r1, SemReason r2 + | + cond = e and + boundedConditionalExpr(cond, b, upper, true, d1, fbe1, od1, r1) and + boundedConditionalExpr(cond, b, upper, false, d2, fbe2, od2, r2) and + ( + delta = d1 and fromBackEdge = fbe1 and origdelta = od1 and reason = r1 + or + delta = d2 and fromBackEdge = fbe2 and origdelta = od2 and reason = r2 + ) + | + upper = true and delta = d1.maximum(d2) + or + upper = false and delta = d1.minimum(d2) + ) + ) +} + +private predicate boundedConditionalExpr( + SemConditionalExpr cond, SemBound b, boolean upper, boolean branch, int delta, + boolean fromBackEdge, int origdelta, SemReason reason +) { + bounded(cond.getBranchExpr(branch), b, delta, upper, fromBackEdge, origdelta, reason) +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysisSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysisSpecific.qll new file mode 100644 index 00000000000..5918b56e50e --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeAnalysisSpecific.qll @@ -0,0 +1,88 @@ +/** + * C++-specific implementation of range analysis. + */ + +private import experimental.semmle.code.cpp.semantic.Semantic + +/** + * Holds if the specified expression should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ +predicate ignoreSsaReadCopy(SemExpr e) { none() } + +/** + * Ignore the bound on this expression. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ +predicate ignoreExprBound(SemExpr e) { none() } + +/** + * Ignore any inferred zero lower bound on this expression. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ +predicate ignoreZeroLowerBound(SemExpr e) { none() } + +/** + * Holds if the specified expression should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ +predicate ignoreSsaReadArithmeticExpr(SemExpr e) { none() } + +/** + * Holds if the specified variable should be excluded from the result of `ssaRead()`. + * + * This predicate is to keep the results identical to the original Java implementation. It should be + * removed once we have the new implementation matching the old results exactly. + */ +predicate ignoreSsaReadAssignment(SemSsaVariable v) { none() } + +/** + * Adds additional results to `ssaRead()` that are specific to Java. + * + * This predicate handles propagation of offsets for post-increment and post-decrement expressions + * in exactly the same way as the old Java implementation. Once the new implementation matches the + * old one, we should remove this predicate and propagate deltas for all similar patterns, whether + * or not they come from a post-increment/decrement expression. + */ +SemExpr specificSsaRead(SemSsaVariable v, int delta) { none() } + +/** + * Holds if `e >= bound` (if `upper = false`) or `e <= bound` (if `upper = true`). + */ +predicate hasConstantBound(SemExpr e, int bound, boolean upper) { none() } + +/** + * Holds if `e >= bound + delta` (if `upper = false`) or `e <= bound + delta` (if `upper = true`). + */ +predicate hasBound(SemExpr e, SemExpr bound, int delta, boolean upper) { none() } + +/** + * Holds if the value of `dest` is known to be `src + delta`. + */ +predicate additionalValueFlowStep(SemExpr dest, SemExpr src, int delta) { none() } + +/** + * Gets the type that range analysis should use to track the result of the specified expression, + * if a type other than the original type of the expression is to be used. + * + * This predicate is commonly used in languages that support immutable "boxed" types that are + * actually references but whose values can be tracked as the type contained in the box. + */ +SemType getAlternateType(SemExpr e) { none() } + +/** + * Gets the type that range analysis should use to track the result of the specified source + * variable, if a type other than the original type of the expression is to be used. + * + * This predicate is commonly used in languages that support immutable "boxed" types that are + * actually references but whose values can be tracked as the type contained in the box. + */ +SemType getAlternateTypeForSsaVariable(SemSsaVariable var) { none() } diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeUtils.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeUtils.qll new file mode 100644 index 00000000000..0bd7a407f1e --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/RangeUtils.qll @@ -0,0 +1,135 @@ +/** + * Provides utility predicates for range analysis. + */ + +private import experimental.semmle.code.cpp.semantic.Semantic +private import RangeAnalysisSpecific as Specific +private import ConstantAnalysis + +/** + * Gets an expression that equals `v - d`. + */ +SemExpr semSsaRead(SemSsaVariable v, int delta) { + // There are various language-specific extension points that can be removed once we no longer + // expect to match the original Java implementation's results exactly. + result = v.getAUse() and delta = 0 + or + exists(int d1, SemConstantIntegerExpr c | + result.(SemAddExpr).hasOperands(semSsaRead(v, d1), c) and + delta = d1 - c.getIntValue() and + not Specific::ignoreSsaReadArithmeticExpr(result) + ) + or + exists(SemSubExpr sub, int d1, SemConstantIntegerExpr c | + result = sub and + sub.getLeftOperand() = semSsaRead(v, d1) and + sub.getRightOperand() = c and + delta = d1 + c.getIntValue() and + not Specific::ignoreSsaReadArithmeticExpr(result) + ) + or + result = v.(SemSsaExplicitUpdate).getSourceExpr() and + delta = 0 and + not Specific::ignoreSsaReadAssignment(v) + or + result = Specific::specificSsaRead(v, delta) + or + result.(SemCopyValueExpr).getOperand() = semSsaRead(v, delta) and + not Specific::ignoreSsaReadCopy(result) + or + result.(SemStoreExpr).getOperand() = semSsaRead(v, delta) +} + +/** + * Gets a condition that tests whether `v` equals `e + delta`. + * + * If the condition evaluates to `testIsTrue`: + * - `isEq = true` : `v == e + delta` + * - `isEq = false` : `v != e + delta` + */ +SemGuard semEqFlowCond(SemSsaVariable v, SemExpr e, int delta, boolean isEq, boolean testIsTrue) { + exists(boolean eqpolarity | + result.isEquality(semSsaRead(v, delta), e, eqpolarity) and + (testIsTrue = true or testIsTrue = false) and + eqpolarity.booleanXor(testIsTrue).booleanNot() = isEq + ) + or + exists(boolean testIsTrue0 | + semImplies_v2(result, testIsTrue, semEqFlowCond(v, e, delta, isEq, testIsTrue0), testIsTrue0) + ) +} + +/** + * Holds if `v` is an `SsaExplicitUpdate` that equals `e + delta`. + */ +predicate semSsaUpdateStep(SemSsaExplicitUpdate v, SemExpr e, int delta) { + exists(SemExpr defExpr | defExpr = v.getSourceExpr() | + defExpr.(SemCopyValueExpr).getOperand() = e and delta = 0 + or + defExpr.(SemStoreExpr).getOperand() = e and delta = 0 + or + defExpr.(SemAddOneExpr).getOperand() = e and delta = 1 + or + defExpr.(SemSubOneExpr).getOperand() = e and delta = -1 + or + e = defExpr and + not ( + defExpr instanceof SemCopyValueExpr or + defExpr instanceof SemStoreExpr or + defExpr instanceof SemAddOneExpr or + defExpr instanceof SemSubOneExpr + ) and + delta = 0 + ) +} + +/** + * Holds if `e1 + delta` equals `e2`. + */ +predicate semValueFlowStep(SemExpr e2, SemExpr e1, int delta) { + e2.(SemCopyValueExpr).getOperand() = e1 and delta = 0 + or + e2.(SemStoreExpr).getOperand() = e1 and delta = 0 + or + e2.(SemAddOneExpr).getOperand() = e1 and delta = 1 + or + e2.(SemSubOneExpr).getOperand() = e1 and delta = -1 + or + Specific::additionalValueFlowStep(e2, e1, delta) + or + exists(SemExpr x | e2.(SemAddExpr).hasOperands(e1, x) | + x.(SemConstantIntegerExpr).getIntValue() = delta + ) + or + exists(SemExpr x, SemSubExpr sub | + e2 = sub and + sub.getLeftOperand() = e1 and + sub.getRightOperand() = x + | + x.(SemConstantIntegerExpr).getIntValue() = -delta + ) +} + +/** + * Gets the type used to track the specified expression's range information. + * + * Usually, this just `e.getSemType()`, but the language can override this to track immutable boxed + * primitive types as the underlying primitive type. + */ +SemType getTrackedType(SemExpr e) { + result = Specific::getAlternateType(e) + or + not exists(Specific::getAlternateType(e)) and result = e.getSemType() +} + +/** + * Gets the type used to track the specified source variable's range information. + * + * Usually, this just `e.getType()`, but the language can override this to track immutable boxed + * primitive types as the underlying primitive type. + */ +SemType getTrackedTypeForSsaVariable(SemSsaVariable var) { + result = Specific::getAlternateTypeForSsaVariable(var) + or + not exists(Specific::getAlternateTypeForSsaVariable(var)) and result = var.getType() +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/Sign.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/Sign.qll new file mode 100644 index 00000000000..692a812911c --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/Sign.qll @@ -0,0 +1,267 @@ +private import experimental.semmle.code.cpp.semantic.Semantic + +newtype TSign = + TNeg() or + TZero() or + TPos() + +/** Class representing expression signs (+, -, 0). */ +class Sign extends TSign { + /** Gets the string representation of this sign. */ + string toString() { + result = "-" and this = TNeg() + or + result = "0" and this = TZero() + or + result = "+" and this = TPos() + } + + /** Gets a possible sign after incrementing an expression that has this sign. */ + Sign inc() { + this = TNeg() and result = TNeg() + or + this = TNeg() and result = TZero() + or + this = TZero() and result = TPos() + or + this = TPos() and result = TPos() + } + + /** Gets a possible sign after decrementing an expression that has this sign. */ + Sign dec() { result.inc() = this } + + /** Gets a possible sign after negating an expression that has this sign. */ + Sign neg() { + this = TNeg() and result = TPos() + or + this = TZero() and result = TZero() + or + this = TPos() and result = TNeg() + } + + /** + * Gets a possible sign after bitwise complementing an expression that has this + * sign. + */ + Sign bitnot() { + this = TNeg() and result = TPos() + or + this = TNeg() and result = TZero() + or + this = TZero() and result = TNeg() + or + this = TPos() and result = TNeg() + } + + /** + * Gets a possible sign after adding an expression with sign `s` to an expression + * that has this sign. + */ + Sign add(Sign s) { + this = TZero() and result = s + or + s = TZero() and result = this + or + this = s and this = result + or + this = TPos() and s = TNeg() + or + this = TNeg() and s = TPos() + } + + /** + * Gets a possible sign after subtracting an expression with sign `s` from an expression + * that has this sign. + */ + Sign sub(Sign s) { result = add(s.neg()) } + + /** + * Gets a possible sign after multiplying an expression with sign `s` to an expression + * that has this sign. + */ + Sign mul(Sign s) { + result = TZero() and this = TZero() + or + result = TZero() and s = TZero() + or + result = TNeg() and this = TPos() and s = TNeg() + or + result = TNeg() and this = TNeg() and s = TPos() + or + result = TPos() and this = TPos() and s = TPos() + or + result = TPos() and this = TNeg() and s = TNeg() + } + + /** + * Gets a possible sign after integer dividing an expression that has this sign + * by an expression with sign `s`. + */ + Sign div(Sign s) { + result = TZero() and s = TNeg() // ex: 3 / -5 = 0 + or + result = TZero() and s = TPos() // ex: 3 / 5 = 0 + or + result = TNeg() and this = TPos() and s = TNeg() + or + result = TNeg() and this = TNeg() and s = TPos() + or + result = TPos() and this = TPos() and s = TPos() + or + result = TPos() and this = TNeg() and s = TNeg() + } + + /** + * Gets a possible sign after modulo dividing an expression that has this sign + * by an expression with sign `s`. + */ + Sign rem(Sign s) { + result = TZero() and s = TNeg() + or + result = TZero() and s = TPos() + or + result = this and s = TNeg() + or + result = this and s = TPos() + } + + /** + * Gets a possible sign after bitwise `and` of an expression that has this sign + * and an expression with sign `s`. + */ + Sign bitand(Sign s) { + result = TZero() and this = TZero() + or + result = TZero() and s = TZero() + or + result = TZero() and this = TPos() + or + result = TZero() and s = TPos() + or + result = TNeg() and this = TNeg() and s = TNeg() + or + result = TPos() and this = TNeg() and s = TPos() + or + result = TPos() and this = TPos() and s = TNeg() + or + result = TPos() and this = TPos() and s = TPos() + } + + /** + * Gets a possible sign after bitwise `or` of an expression that has this sign + * and an expression with sign `s`. + */ + Sign bitor(Sign s) { + result = TZero() and this = TZero() and s = TZero() + or + result = TNeg() and this = TNeg() + or + result = TNeg() and s = TNeg() + or + result = TPos() and this = TPos() and s = TZero() + or + result = TPos() and this = TZero() and s = TPos() + or + result = TPos() and this = TPos() and s = TPos() + } + + /** + * Gets a possible sign after bitwise `xor` of an expression that has this sign + * and an expression with sign `s`. + */ + Sign bitxor(Sign s) { + result = TZero() and this = s + or + result = this and s = TZero() + or + result = s and this = TZero() + or + result = TPos() and this = TPos() and s = TPos() + or + result = TNeg() and this = TNeg() and s = TPos() + or + result = TNeg() and this = TPos() and s = TNeg() + or + result = TPos() and this = TNeg() and s = TNeg() + } + + /** + * Gets a possible sign after left shift of an expression that has this sign + * by an expression with sign `s`. + */ + Sign lshift(Sign s) { + result = TZero() and this = TZero() + or + result = this and s = TZero() + or + this != TZero() and s != TZero() + } + + /** + * Gets a possible sign after right shift of an expression that has this sign + * by an expression with sign `s`. + */ + Sign rshift(Sign s) { + result = TZero() and this = TZero() + or + result = this and s = TZero() + or + result = TNeg() and this = TNeg() + or + result != TNeg() and this = TPos() and s != TZero() + } + + /** + * Gets a possible sign after unsigned right shift of an expression that has + * this sign by an expression with sign `s`. + */ + Sign urshift(Sign s) { + result = TZero() and this = TZero() + or + result = this and s = TZero() + or + result != TZero() and this = TNeg() and s != TZero() + or + result != TNeg() and this = TPos() and s != TZero() + } + + /** Perform `op` on this sign. */ + Sign applyUnaryOp(Opcode op) { + op instanceof Opcode::CopyValue and result = this + or + op instanceof Opcode::Store and result = this + or + op instanceof Opcode::AddOne and result = inc() + or + op instanceof Opcode::SubOne and result = dec() + or + op instanceof Opcode::Negate and result = neg() + or + op instanceof Opcode::BitComplement and result = bitnot() + } + + /** Perform `op` on this sign and sign `s`. */ + Sign applyBinaryOp(Sign s, Opcode op) { + op instanceof Opcode::Add and result = add(s) + or + op instanceof Opcode::Sub and result = sub(s) + or + op instanceof Opcode::Mul and result = mul(s) + or + op instanceof Opcode::Div and result = div(s) + or + op instanceof Opcode::Rem and result = rem(s) + or + op instanceof Opcode::BitAnd and result = bitand(s) + or + op instanceof Opcode::BitOr and result = bitor(s) + or + op instanceof Opcode::BitXor and result = bitxor(s) + or + op instanceof Opcode::ShiftLeft and result = lshift(s) + or + op instanceof Opcode::ShiftRight and result = rshift(s) + or + op instanceof Opcode::ShiftRightUnsigned and result = urshift(s) + } +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisCommon.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisCommon.qll new file mode 100644 index 00000000000..c7e05f1bd99 --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisCommon.qll @@ -0,0 +1,493 @@ +/** + * Provides sign analysis to determine whether expression are always positive + * or negative. + * + * The analysis is implemented as an abstract interpretation over the + * three-valued domain `{negative, zero, positive}`. + */ + +private import SignAnalysisSpecific as Specific +private import experimental.semmle.code.cpp.semantic.Semantic +private import ConstantAnalysis +private import RangeUtils +private import Sign + +/** + * An SSA definition for which the analysis can compute the sign. + * + * The actual computation of the sign is done in an override of the `getSign()` predicate. The + * charpred of any subclass must _not_ invoke `getSign()`, directly or indirectly. This ensures + * that the charpred does not introduce negative recursion. The `getSign()` predicate may be + * recursive. + */ +abstract private class SignDef instanceof SemSsaVariable { + final string toString() { result = super.toString() } + + /** Gets the possible signs of this SSA definition. */ + abstract Sign getSign(); +} + +/** An SSA definition whose sign is computed based on standard flow. */ +abstract private class FlowSignDef extends SignDef { + abstract override Sign getSign(); +} + +/** An SSA definition whose sign is determined by the sign of that definitions source expression. */ +private class ExplicitSignDef extends FlowSignDef { + SemSsaExplicitUpdate update; + + ExplicitSignDef() { update = this } + + final override Sign getSign() { result = semExprSign(update.getSourceExpr()) } +} + +/** An SSA Phi definition, whose sign is the union of the signs of its inputs. */ +private class PhiSignDef extends FlowSignDef { + SemSsaPhiNode phi; + + PhiSignDef() { phi = this } + + final override Sign getSign() { + exists(SemSsaVariable inp, SemSsaReadPositionPhiInputEdge edge | + edge.phiInput(phi, inp) and + result = semSsaSign(inp, edge) + ) + } +} + +/** An SSA definition whose sign is computed by a language-specific implementation. */ +abstract class CustomSignDef extends SignDef { + abstract override Sign getSign(); +} + +/** + * An expression for which the analysis can compute the sign. + * + * The actual computation of the sign is done in an override of the `getSign()` predicate. The + * charpred of any subclass must _not_ invoke `getSign()`, directly or indirectly. This ensures + * that the charpred does not introduce negative recursion. The `getSign()` predicate may be + * recursive. + * + * Concrete implementations extend one of the following subclasses: + * - `ConstantSignExpr`, for expressions with a compile-time constant value. + * - `FlowSignExpr`, for expressions whose sign can be computed from the signs of their operands. + * - `CustomsignExpr`, for expressions shose sign can be computed by a language-specific + * implementation. + * + * If the same expression matches more than one of the above subclasses, the sign is computed as + * follows: + * - The sign of a `ConstantSignExpr` is computed solely from `ConstantSignExpr.getSign()`, + * regardless of any other subclasses. + * - If a non-`ConstantSignExpr` expression matches exactly one of `FlowSignExpr` or + * `CustomSignExpr`, the sign is computed by that class' `getSign()` predicate. + * - If a non-`ConstantSignExpr` expression matches both `FlowSignExpr` and `CustomSignExpr`, the + * sign is the _intersection_ of the signs of those two classes' `getSign()` predicates. Thus, + * both classes have the opportunity to _restrict_ the set of possible signs, not to generate new + * possible signs. + * - If an expression does not match any of the three subclasses, then it can have any sign. + * + * Note that the `getSign()` predicate is introduced only in subclasses of `SignExpr`. + */ +abstract class SignExpr instanceof SemExpr { + SignExpr() { not Specific::ignoreExprSign(this) } + + final string toString() { result = super.toString() } + + abstract Sign getSign(); +} + +/** An expression whose sign is determined by its constant numeric value. */ +private class ConstantSignExpr extends SignExpr { + ConstantSignExpr() { + this instanceof SemConstantIntegerExpr or + exists(this.(SemNumericLiteralExpr).getApproximateFloatValue()) + } + + final override Sign getSign() { + exists(int i | this.(SemConstantIntegerExpr).getIntValue() = i | + i < 0 and result = TNeg() + or + i = 0 and result = TZero() + or + i > 0 and result = TPos() + ) + or + not exists(this.(SemConstantIntegerExpr).getIntValue()) and + exists(float f | f = this.(SemNumericLiteralExpr).getApproximateFloatValue() | + f < 0 and result = TNeg() + or + f = 0 and result = TZero() + or + f > 0 and result = TPos() + ) + } +} + +abstract private class NonConstantSignExpr extends SignExpr { + NonConstantSignExpr() { not this instanceof ConstantSignExpr } + + final override Sign getSign() { + // The result is the _intersection_ of the signs computed from flow and by the language. + (result = this.(FlowSignExpr).getSignRestriction() or not this instanceof FlowSignExpr) and + (result = this.(CustomSignExpr).getSignRestriction() or not this instanceof CustomSignExpr) + } +} + +/** An expression whose sign is computed from the signs of its operands. */ +abstract private class FlowSignExpr extends NonConstantSignExpr { + abstract Sign getSignRestriction(); +} + +/** An expression whose sign is computed by a language-specific implementation. */ +abstract class CustomSignExpr extends NonConstantSignExpr { + abstract Sign getSignRestriction(); +} + +/** An expression whose sign is unknown. */ +private class UnknownSignExpr extends SignExpr { + UnknownSignExpr() { + not this instanceof FlowSignExpr and + not this instanceof CustomSignExpr and + not this instanceof ConstantSignExpr and + ( + // Only track numeric types. + getTrackedType(this) instanceof SemNumericType + or + // Unless the language says to track this expression anyway. + Specific::trackUnknownNonNumericExpr(this) + ) + } + + final override Sign getSign() { semAnySign(result) } +} + +/** + * A `Load` expression whose sign is computed from the sign of its SSA definition, restricted by + * inference from any intervening guards. + */ +class UseSignExpr extends FlowSignExpr { + SemSsaVariable v; + + UseSignExpr() { v.getAUse() = this } + + override Sign getSignRestriction() { + // Propagate via SSA + // Propagate the sign from the def of `v`, incorporating any inference from guards. + result = semSsaSign(v, any(SemSsaReadPositionBlock bb | bb.getAnExpr() = this)) + or + // No block for this read. Just use the sign of the def. + // REVIEW: How can this happen? + not exists(SemSsaReadPositionBlock bb | bb.getAnExpr() = this) and + result = semSsaDefSign(v) + } +} + +/** A binary expression whose sign is computed from the signs of its operands. */ +private class BinarySignExpr extends FlowSignExpr { + SemBinaryExpr binary; + + BinarySignExpr() { binary = this } + + override Sign getSignRestriction() { + result = + semExprSign(binary.getLeftOperand()) + .applyBinaryOp(semExprSign(binary.getRightOperand()), binary.getOpcode()) + or + exists(SemDivExpr div | div = binary | + result = semExprSign(div.getLeftOperand()) and + result != TZero() and + div.getRightOperand().(SemFloatingPointLiteralExpr).getFloatValue() = 0 + ) + } +} + +/** + * A `Convert`, `Box`, or `Unbox` expression. + */ +private class SemCastExpr extends SemUnaryExpr { + SemCastExpr() { + this instanceof SemConvertExpr + or + this instanceof SemBoxExpr + or + this instanceof SemUnboxExpr + } +} + +/** A unary expression whose sign is computed from the sign of its operand. */ +private class UnarySignExpr extends FlowSignExpr { + SemUnaryExpr unary; + + UnarySignExpr() { unary = this and not this instanceof SemCastExpr } + + override Sign getSignRestriction() { + result = semExprSign(unary.getOperand()).applyUnaryOp(unary.getOpcode()) + } +} + +/** + * A `Convert`, `Box`, or `Unbox` expression, whose sign is computed based on + * the sign of its operand and the source and destination types. + */ +abstract private class CastSignExpr extends FlowSignExpr { + SemUnaryExpr cast; + + CastSignExpr() { cast = this and cast instanceof SemCastExpr } + + override Sign getSignRestriction() { result = semExprSign(cast.getOperand()) } +} + +/** + * A `Convert` expression. + */ +private class ConvertSignExpr extends CastSignExpr { + override SemConvertExpr cast; +} + +/** + * A `Box` expression. + */ +private class BoxSignExpr extends CastSignExpr { + override SemBoxExpr cast; +} + +/** + * An `Unbox` expression. + */ +private class UnboxSignExpr extends CastSignExpr { + override SemUnboxExpr cast; + + UnboxSignExpr() { + exists(SemType fromType | fromType = getTrackedType(cast.getOperand()) | + // Only numeric source types are handled here. + fromType instanceof SemNumericType + ) + } +} + +private predicate unknownSign(SemExpr e) { e instanceof UnknownSignExpr } + +/** + * Holds if `lowerbound` is a lower bound for `v` at `pos`. This is restricted + * to only include bounds for which we might determine a sign. + */ +private predicate lowerBound( + SemExpr lowerbound, SemSsaVariable v, SemSsaReadPosition pos, boolean isStrict +) { + exists(boolean testIsTrue, SemRelationalExpr comp | + pos.hasReadOfVar(v) and + semGuardControlsSsaRead(semGetComparisonGuard(comp), pos, testIsTrue) and + not unknownSign(lowerbound) + | + testIsTrue = true and + comp.getLesserOperand() = lowerbound and + comp.getGreaterOperand() = semSsaRead(v, 0) and + (if comp.isStrict() then isStrict = true else isStrict = false) + or + testIsTrue = false and + comp.getGreaterOperand() = lowerbound and + comp.getLesserOperand() = semSsaRead(v, 0) and + (if comp.isStrict() then isStrict = false else isStrict = true) + ) +} + +/** + * Holds if `upperbound` is an upper bound for `v` at `pos`. This is restricted + * to only include bounds for which we might determine a sign. + */ +private predicate upperBound( + SemExpr upperbound, SemSsaVariable v, SemSsaReadPosition pos, boolean isStrict +) { + exists(boolean testIsTrue, SemRelationalExpr comp | + pos.hasReadOfVar(v) and + semGuardControlsSsaRead(semGetComparisonGuard(comp), pos, testIsTrue) and + not unknownSign(upperbound) + | + testIsTrue = true and + comp.getGreaterOperand() = upperbound and + comp.getLesserOperand() = semSsaRead(v, 0) and + (if comp.isStrict() then isStrict = true else isStrict = false) + or + testIsTrue = false and + comp.getLesserOperand() = upperbound and + comp.getGreaterOperand() = semSsaRead(v, 0) and + (if comp.isStrict() then isStrict = false else isStrict = true) + ) +} + +/** + * Holds if `eqbound` is an equality/inequality for `v` at `pos`. This is + * restricted to only include bounds for which we might determine a sign. The + * boolean `isEq` gives the polarity: + * - `isEq = true` : `v = eqbound` + * - `isEq = false` : `v != eqbound` + */ +private predicate eqBound(SemExpr eqbound, SemSsaVariable v, SemSsaReadPosition pos, boolean isEq) { + exists(SemGuard guard, boolean testIsTrue, boolean polarity | + pos.hasReadOfVar(v) and + semGuardControlsSsaRead(guard, pos, testIsTrue) and + guard.isEquality(eqbound, semSsaRead(v, 0), polarity) and + isEq = polarity.booleanXor(testIsTrue).booleanNot() and + not unknownSign(eqbound) + ) +} + +/** + * Holds if `bound` is a bound for `v` at `pos` that needs to be positive in + * order for `v` to be positive. + */ +private predicate posBound(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + upperBound(bound, v, pos, _) or + eqBound(bound, v, pos, true) +} + +/** + * Holds if `bound` is a bound for `v` at `pos` that needs to be negative in + * order for `v` to be negative. + */ +private predicate negBound(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + lowerBound(bound, v, pos, _) or + eqBound(bound, v, pos, true) +} + +/** + * Holds if `bound` is a bound for `v` at `pos` that can restrict whether `v` + * can be zero. + */ +private predicate zeroBound(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + lowerBound(bound, v, pos, _) or + upperBound(bound, v, pos, _) or + eqBound(bound, v, pos, _) +} + +/** Holds if `bound` allows `v` to be positive at `pos`. */ +private predicate posBoundOk(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + posBound(bound, v, pos) and TPos() = semExprSign(bound) +} + +/** Holds if `bound` allows `v` to be negative at `pos`. */ +private predicate negBoundOk(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + negBound(bound, v, pos) and TNeg() = semExprSign(bound) +} + +/** Holds if `bound` allows `v` to be zero at `pos`. */ +private predicate zeroBoundOk(SemExpr bound, SemSsaVariable v, SemSsaReadPosition pos) { + lowerBound(bound, v, pos, _) and TNeg() = semExprSign(bound) + or + lowerBound(bound, v, pos, false) and TZero() = semExprSign(bound) + or + upperBound(bound, v, pos, _) and TPos() = semExprSign(bound) + or + upperBound(bound, v, pos, false) and TZero() = semExprSign(bound) + or + eqBound(bound, v, pos, true) and TZero() = semExprSign(bound) + or + eqBound(bound, v, pos, false) and TZero() != semExprSign(bound) +} + +/** + * Holds if there is a bound that might restrict whether `v` has the sign `s` + * at `pos`. + */ +private predicate hasGuard(SemSsaVariable v, SemSsaReadPosition pos, Sign s) { + s = TPos() and posBound(_, v, pos) + or + s = TNeg() and negBound(_, v, pos) + or + s = TZero() and zeroBound(_, v, pos) +} + +/** + * Gets a possible sign of `v` at `pos` based on its definition, where the sign + * might be ruled out by a guard. + */ +pragma[noinline] +private Sign guardedSsaSign(SemSsaVariable v, SemSsaReadPosition pos) { + result = semSsaDefSign(v) and + pos.hasReadOfVar(v) and + hasGuard(v, pos, result) +} + +/** + * Gets a possible sign of `v` at `pos` based on its definition, where no guard + * can rule it out. + */ +pragma[noinline] +private Sign unguardedSsaSign(SemSsaVariable v, SemSsaReadPosition pos) { + result = semSsaDefSign(v) and + pos.hasReadOfVar(v) and + not hasGuard(v, pos, result) +} + +/** + * Gets a possible sign of `v` at read position `pos`, where a guard could have + * ruled out the sign but does not. + * This does not check that the definition of `v` also allows the sign. + */ +private Sign guardedSsaSignOk(SemSsaVariable v, SemSsaReadPosition pos) { + result = TPos() and + forex(SemExpr bound | posBound(bound, v, pos) | posBoundOk(bound, v, pos)) + or + result = TNeg() and + forex(SemExpr bound | negBound(bound, v, pos) | negBoundOk(bound, v, pos)) + or + result = TZero() and + forex(SemExpr bound | zeroBound(bound, v, pos) | zeroBoundOk(bound, v, pos)) +} + +/** Gets a possible sign for `v` at `pos`. */ +private Sign semSsaSign(SemSsaVariable v, SemSsaReadPosition pos) { + result = unguardedSsaSign(v, pos) + or + result = guardedSsaSign(v, pos) and + result = guardedSsaSignOk(v, pos) +} + +/** Gets a possible sign for `v`. */ +pragma[nomagic] +Sign semSsaDefSign(SemSsaVariable v) { result = v.(SignDef).getSign() } + +/** Gets a possible sign for `e`. */ +cached +Sign semExprSign(SemExpr e) { + exists(Sign s | s = e.(SignExpr).getSign() | + if + getTrackedType(e) instanceof SemUnsignedIntegerType and + s = TNeg() and + not Specific::ignoreTypeRestrictions(e) + then result = TPos() + else result = s + ) +} + +/** + * Dummy predicate that holds for any sign. This is added to improve readability + * of cases where the sign is unrestricted. + */ +predicate semAnySign(Sign s) { any() } + +/** Holds if `e` can be positive and cannot be negative. */ +predicate semPositive(SemExpr e) { + semExprSign(e) = TPos() and + not semExprSign(e) = TNeg() +} + +/** Holds if `e` can be negative and cannot be positive. */ +predicate semNegative(SemExpr e) { + semExprSign(e) = TNeg() and + not semExprSign(e) = TPos() +} + +/** Holds if `e` is strictly positive. */ +predicate semStrictlyPositive(SemExpr e) { + semExprSign(e) = TPos() and + not semExprSign(e) = TNeg() and + not semExprSign(e) = TZero() +} + +/** Holds if `e` is strictly negative. */ +predicate semStrictlyNegative(SemExpr e) { + semExprSign(e) = TNeg() and + not semExprSign(e) = TPos() and + not semExprSign(e) = TZero() +} diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisSpecific.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisSpecific.qll new file mode 100644 index 00000000000..e44281af85b --- /dev/null +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/analysis/SignAnalysisSpecific.qll @@ -0,0 +1,23 @@ +/** + * Provides C++-specific definitions for use in sign analysis. + */ + +private import experimental.semmle.code.cpp.semantic.Semantic + +/** + * Workaround to allow certain expressions to have a negative sign, even if the type of the + * expression is unsigned. + */ +predicate ignoreTypeRestrictions(SemExpr e) { none() } + +/** + * Workaround to track the sign of cetain expressions even if the type of the expression is not + * numeric. + */ +predicate trackUnknownNonNumericExpr(SemExpr e) { none() } + +/** + * Workaround to ignore tracking of certain expressions even if the type of the expression is + * numeric. + */ +predicate ignoreExprSign(SemExpr e) { none() } diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 4424055e172..b8488e9ce82 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.0.10-dev +version: 0.2.2-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll b/cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll index 829249e7ded..fe5cb80a14b 100644 --- a/cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll +++ b/cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll @@ -84,6 +84,7 @@ private int fileHeaderLimit(File f) { fc = fileFirstComment(f) and result = min(int line | + // code ending the initial comments exists(DeclarationEntry de, Location l | l = de.getLocation() and l.getFile() = f and @@ -105,7 +106,13 @@ private int fileHeaderLimit(File f) { line > fc ) or + // end of the file line = f.getMetrics().getNumberOfLines() + or + // rarely, we've seen extremely long sequences of initial comments + // (and/or limitations in the above constraints) cause an overflow of + // the maximum string length. So don't look past 1000 lines regardless. + line = 1000 ) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/Class.qll b/cpp/ql/lib/semmle/code/cpp/Class.qll index 64819a5e945..a91cedb9a0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Class.qll +++ b/cpp/ql/lib/semmle/code/cpp/Class.qll @@ -111,24 +111,6 @@ class Class extends UserType { result = this.getCanonicalMember(index).(TemplateVariable).getAnInstantiation() } - /** - * DEPRECATED: Use `getCanonicalMember(int)` or `getAMember(int)` instead. - * Gets the `index`th member of this class. - */ - deprecated Declaration getMember(int index) { - member(underlyingElement(this), index, unresolveElement(result)) - } - - /** - * DEPRECATED: As this includes a somewhat arbitrary number of - * template instantiations, it is unlikely to do what - * you need. - * Gets the number of members that this class has. This includes both - * templates that are in this class, and instantiations of those - * templates. - */ - deprecated int getNumMember() { result = count(this.getAMember()) } - /** * Gets a private member declared in this class, struct or union. * For template members, this may be either the template or an @@ -208,23 +190,6 @@ class Class extends UserType { */ deprecated predicate hasCopyConstructor() { this.getAMemberFunction() instanceof CopyConstructor } - /** - * Holds if this class has a copy assignment operator that is either - * explicitly declared (though possibly `= delete`) or is auto-generated, - * non-trivial and called from somewhere. - * - * DEPRECATED: There is more than one reasonable definition of what it means - * to have a copy assignment operator, and we do not want to promote one - * particular definition by naming it with this predicate. Having a copy - * assignment operator could mean that such a member is declared or defined - * in the source or that it is callable by a particular caller. For C++11, - * there's also a question of whether to include members that are defaulted - * or deleted. - */ - deprecated predicate hasCopyAssignmentOperator() { - this.getAMemberFunction() instanceof CopyAssignmentOperator - } - /** * Like accessOfBaseMember but returns multiple results if there are multiple * paths to `base` through the inheritance graph. @@ -286,6 +251,16 @@ class Class extends UserType { not this.implicitCopyConstructorDeleted() and forall(CopyConstructor cc | cc = this.getAMemberFunction() | cc.isCompilerGenerated() and not cc.isDeleted() + ) and + ( + not this instanceof ClassTemplateInstantiation + or + this.(ClassTemplateInstantiation).getTemplate().hasImplicitCopyConstructor() + ) and + ( + not this instanceof PartialClassTemplateSpecialization + or + this.(PartialClassTemplateSpecialization).getPrimaryTemplate().hasImplicitCopyConstructor() ) } @@ -301,6 +276,18 @@ class Class extends UserType { not this.implicitCopyAssignmentOperatorDeleted() and forall(CopyAssignmentOperator ca | ca = this.getAMemberFunction() | ca.isCompilerGenerated() and not ca.isDeleted() + ) and + ( + not this instanceof ClassTemplateInstantiation + or + this.(ClassTemplateInstantiation).getTemplate().hasImplicitCopyAssignmentOperator() + ) and + ( + not this instanceof PartialClassTemplateSpecialization + or + this.(PartialClassTemplateSpecialization) + .getPrimaryTemplate() + .hasImplicitCopyAssignmentOperator() ) } @@ -1070,31 +1057,6 @@ class PartialClassTemplateSpecialization extends ClassTemplateSpecialization { override string getAPrimaryQlClass() { result = "PartialClassTemplateSpecialization" } } -/** - * An "interface" is a class that only contains pure virtual functions (and contains - * at least one such function). For example: - * ``` - * class MyInterfaceClass { - * public: - * virtual void myMethod1() = 0; - * virtual void myMethod2() = 0; - * }; - * ``` - * - * DEPRECATED: This class is considered to be too specific for general usage. - */ -deprecated class Interface extends Class { - Interface() { - forex(Declaration m | - m.getDeclaringType() = this.getABaseClass*() and not compgenerated(unresolveElement(m)) - | - m instanceof PureVirtualFunction - ) - } - - override string getAPrimaryQlClass() { result = "Interface" } -} - /** * A class/struct derivation that is virtual. For example the derivation in * the following code is a `VirtualClassDerivation`: diff --git a/cpp/ql/lib/semmle/code/cpp/Element.qll b/cpp/ql/lib/semmle/code/cpp/Element.qll index 9273d1b31bf..9e4ef7f5f8d 100644 --- a/cpp/ql/lib/semmle/code/cpp/Element.qll +++ b/cpp/ql/lib/semmle/code/cpp/Element.qll @@ -55,9 +55,6 @@ class ElementBase extends @element { cached string toString() { none() } - /** DEPRECATED: use `getAPrimaryQlClass` instead. */ - deprecated string getCanonicalQLClass() { result = this.getAPrimaryQlClass() } - /** * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. */ @@ -91,13 +88,6 @@ class Element extends ElementBase { */ predicate fromSource() { this.getFile().fromSource() } - /** - * Holds if this element may be from a library. - * - * DEPRECATED: always true. - */ - deprecated predicate fromLibrary() { this.getFile().fromLibrary() } - /** Gets the primary location of this element. */ Location getLocation() { none() } @@ -119,10 +109,7 @@ class Element extends ElementBase { then exists(MacroInvocation mi | this = mi.getAGeneratedElement() and - not exists(MacroInvocation closer | - this = closer.getAGeneratedElement() and - mi = closer.getParentInvocation+() - ) and + not hasCloserMacroInvocation(this, mi) and result = mi.getMacro() ) else result = this @@ -246,6 +233,14 @@ class Element extends ElementBase { } } +pragma[noinline] +private predicate hasCloserMacroInvocation(Element elem, MacroInvocation mi) { + exists(MacroInvocation closer | + elem = closer.getAGeneratedElement() and + mi = closer.getParentInvocation() + ) +} + private predicate isFromTemplateInstantiationRec(Element e, Element instantiation) { instantiation.(Function).isConstructedFrom(_) and e = instantiation diff --git a/cpp/ql/lib/semmle/code/cpp/Field.qll b/cpp/ql/lib/semmle/code/cpp/Field.qll index 5ed5e8e4b4b..95e55568c4b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Field.qll +++ b/cpp/ql/lib/semmle/code/cpp/Field.qll @@ -4,7 +4,6 @@ import semmle.code.cpp.Variable import semmle.code.cpp.Enum -import semmle.code.cpp.exprs.Access /** * A C structure member or C++ non-static member variable. For example the @@ -32,7 +31,7 @@ class Field extends MemberVariable { int getByteOffset() { fieldoffsets(underlyingElement(this), result, _) } /** - * Gets the byte offset within `mostDerivedClass` of each occurence of this + * Gets the byte offset within `mostDerivedClass` of each occurrence of this * field within `mostDerivedClass` itself or a base class subobject of * `mostDerivedClass`. * Note that for fields of virtual base classes, and non-virtual base classes diff --git a/cpp/ql/lib/semmle/code/cpp/File.qll b/cpp/ql/lib/semmle/code/cpp/File.qll index 3b72533b4f4..398633edbd8 100644 --- a/cpp/ql/lib/semmle/code/cpp/File.qll +++ b/cpp/ql/lib/semmle/code/cpp/File.qll @@ -196,31 +196,11 @@ class Folder extends Container, @folder { */ deprecated string getName() { folders(underlyingElement(this), result) } - /** - * DEPRECATED: use `getAbsolutePath` instead. - * Holds if this element is named `name`. - */ - deprecated predicate hasName(string name) { name = this.getName() } - - /** - * DEPRECATED: use `getAbsolutePath` instead. - * Gets the full name of this folder. - */ - deprecated string getFullName() { result = this.getName() } - /** * DEPRECATED: use `getBaseName` instead. * Gets the last part of the folder name. */ deprecated string getShortName() { result = this.getBaseName() } - - /** - * DEPRECATED: use `getParentContainer` instead. - * Gets the parent folder. - */ - deprecated Folder getParent() { - containerparent(unresolveElement(result), underlyingElement(this)) - } } /** @@ -308,13 +288,6 @@ class File extends Container, @file { */ override predicate fromSource() { numlines(underlyingElement(this), _, _, _) } - /** - * Holds if this file may be from a library. - * - * DEPRECATED: For historical reasons this is true for any file. - */ - deprecated override predicate fromLibrary() { any() } - /** Gets the metric file. */ MetricFile getMetrics() { result = this } @@ -428,25 +401,3 @@ class CppFile extends File { override string getAPrimaryQlClass() { result = "CppFile" } } - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C source file, as determined by file extension. - * - * For the related notion of whether a file is compiled as Objective C - * code, use `File.compiledAsObjC`. - */ -deprecated class ObjCFile extends File { - ObjCFile() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C++ source file, as determined by file extension. - * - * For the related notion of whether a file is compiled as Objective C++ - * code, use `File.compiledAsObjCpp`. - */ -deprecated class ObjCppFile extends File { - ObjCppFile() { none() } -} diff --git a/cpp/ql/lib/semmle/code/cpp/Function.qll b/cpp/ql/lib/semmle/code/cpp/Function.qll index 0f1de2b512c..bf69c33f6cb 100644 --- a/cpp/ql/lib/semmle/code/cpp/Function.qll +++ b/cpp/ql/lib/semmle/code/cpp/Function.qll @@ -38,8 +38,8 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function { * int z = min(5, 7); * ``` * The full signature of the function called on the last line would be - * "min(int, int) -> int", and the full signature of the uninstantiated - * template on the first line would be "min(T, T) -> T". + * `min(int, int) -> int`, and the full signature of the uninstantiated + * template on the first line would be `min(T, T) -> T`. */ string getFullSignature() { exists(string name, string templateArgs, string args | diff --git a/cpp/ql/lib/semmle/code/cpp/Location.qll b/cpp/ql/lib/semmle/code/cpp/Location.qll index 92b358d474c..2b2a06ac474 100644 --- a/cpp/ql/lib/semmle/code/cpp/Location.qll +++ b/cpp/ql/lib/semmle/code/cpp/Location.qll @@ -73,8 +73,24 @@ class Location extends @location { /** Holds if `this` comes on a line strictly before `l`. */ pragma[inline] - predicate isBefore(Location l) { - this.getFile() = l.getFile() and this.getEndLine() < l.getStartLine() + predicate isBefore(Location l) { this.isBefore(l, false) } + + /** + * Holds if `this` comes strictly before `l`. The boolean `sameLine` is + * true if `l` is on the same line as `this`, but starts at a later column. + * Otherwise, `sameLine` is false. + */ + pragma[inline] + predicate isBefore(Location l, boolean sameLine) { + this.getFile() = l.getFile() and + ( + sameLine = false and + this.getEndLine() < l.getStartLine() + or + sameLine = true and + this.getEndLine() = l.getStartLine() and + this.getEndColumn() < l.getStartColumn() + ) } /** Holds if location `l` is completely contained within this one. */ @@ -105,25 +121,6 @@ class Location extends @location { } } -/** - * DEPRECATED: Use `Location` instead. - * A location of an element. Not used for expressions or statements, which - * instead use LocationExpr and LocationStmt respectively. - */ -deprecated library class LocationDefault extends Location, @location_default { } - -/** - * DEPRECATED: Use `Location` instead. - * A location of a statement. - */ -deprecated library class LocationStmt extends Location, @location_stmt { } - -/** - * DEPRECATED: Use `Location` instead. - * A location of an expression. - */ -deprecated library class LocationExpr extends Location, @location_expr { } - /** * Gets the length of the longest line in file `f`. */ diff --git a/cpp/ql/lib/semmle/code/cpp/Macro.qll b/cpp/ql/lib/semmle/code/cpp/Macro.qll index 6d61ae7be7c..4378cec4857 100644 --- a/cpp/ql/lib/semmle/code/cpp/Macro.qll +++ b/cpp/ql/lib/semmle/code/cpp/Macro.qll @@ -30,16 +30,6 @@ class Macro extends PreprocessorDirective, @ppd_define { else result = "#define " + this.getHead() + " " + this.getBody() } - /** - * Holds if the body of the macro starts with an unmatched closing - * parenthesis. For example: - * - * #define RPAREN() ) - * - * DEPRECATED: This predicate has a misleading name. - */ - deprecated predicate isFunctionLike() { this.getBody().regexpMatch("[^(]*\\).*") } - /** * Gets the name of the macro. For example, `MAX` in * `#define MAX(x,y) (((x)>(y))?(x):(y))`. @@ -261,46 +251,6 @@ class MacroInvocation extends MacroAccess { string getExpandedArgument(int i) { macro_argument_expanded(underlyingElement(this), i, result) } } -/** - * A top-level expression generated by a macro invocation. - * - * DEPRECATED: Use `MacroInvocation.getExpr()` directly to get an - * expression generated at the top-level of a macro invocation. Use - * `MacroInvocation.getAnAffectedElement()` to get any element generated - * by a macro invocation. - */ -deprecated class MacroInvocationExpr extends Expr { - MacroInvocationExpr() { exists(MacroInvocation i | this = i.getExpr()) } - - /** - * Gets the macro invocation of which this is the top-level expression. - */ - MacroInvocation getInvocation() { result.getExpr() = this } - - /** Gets the name of the invoked macro. */ - string getMacroName() { result = this.getInvocation().getMacroName() } -} - -/** - * A top-level statement generated by a macro invocation. - * - * DEPRECATED: Use `MacroInvocation.getStmt()` directly to get a - * statement generated at the top-level of a macro invocation. Use - * `MacroInvocation.getAnAffectedElement()` to get any element generated - * by a macro invocation. - */ -deprecated class MacroInvocationStmt extends Stmt { - MacroInvocationStmt() { exists(MacroInvocation i | this = i.getStmt()) } - - /** - * Gets the macro invocation of which this is the top-level statement. - */ - MacroInvocation getInvocation() { result.getStmt() = this } - - /** Gets the name of the invoked macro. */ - string getMacroName() { result = this.getInvocation().getMacroName() } -} - /** Holds if `l` is the location of a macro. */ predicate macroLocation(Location l) { macrolocationbind(_, l) } diff --git a/cpp/ql/lib/semmle/code/cpp/MemberFunction.qll b/cpp/ql/lib/semmle/code/cpp/MemberFunction.qll index 03b1704549f..6243104c2a3 100644 --- a/cpp/ql/lib/semmle/code/cpp/MemberFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/MemberFunction.qll @@ -233,40 +233,6 @@ class ImplicitConversionFunction extends MemberFunction { Type getDestType() { none() } // overridden in subclasses } -/** - * DEPRECATED: as of C++11 this class does not correspond perfectly with the - * language definition of a converting constructor. - * - * A C++ constructor that also defines an implicit conversion. For example the - * function `MyClass` in the following code is a `ConversionConstructor`: - * ``` - * class MyClass { - * public: - * MyClass(const MyOtherClass &from) { - * ... - * } - * }; - * ``` - */ -deprecated class ConversionConstructor extends Constructor, ImplicitConversionFunction { - ConversionConstructor() { - strictcount(Parameter p | p = this.getAParameter() and not p.hasInitializer()) = 1 and - not this.hasSpecifier("explicit") - } - - override string getAPrimaryQlClass() { - not this instanceof CopyConstructor and - not this instanceof MoveConstructor and - result = "ConversionConstructor" - } - - /** Gets the type this `ConversionConstructor` takes as input. */ - override Type getSourceType() { result = this.getParameter(0).getType() } - - /** Gets the type this `ConversionConstructor` is a constructor of. */ - override Type getDestType() { result = this.getDeclaringType() } -} - private predicate hasCopySignature(MemberFunction f) { f.getParameter(0).getUnspecifiedType().(LValueReferenceType).getBaseType() = f.getDeclaringType() } diff --git a/cpp/ql/lib/semmle/code/cpp/Namespace.qll b/cpp/ql/lib/semmle/code/cpp/Namespace.qll index 47ebc9d35c5..129e1449c32 100644 --- a/cpp/ql/lib/semmle/code/cpp/Namespace.qll +++ b/cpp/ql/lib/semmle/code/cpp/Namespace.qll @@ -86,13 +86,6 @@ class Namespace extends NameQualifyingElement, @namespace { /** Holds if this namespace may be from source. */ override predicate fromSource() { this.getADeclaration().fromSource() } - /** - * Holds if this namespace is in a library. - * - * DEPRECATED: never holds. - */ - deprecated override predicate fromLibrary() { not this.fromSource() } - /** Gets the metric namespace. */ MetricNamespace getMetrics() { result = this } @@ -233,11 +226,6 @@ class GlobalNamespace extends Namespace { override Namespace getParentNamespace() { none() } - /** - * DEPRECATED: use `getName()`. - */ - deprecated string getFullName() { result = this.getName() } - override string getFriendlyName() { result = "(global namespace)" } } diff --git a/cpp/ql/lib/semmle/code/cpp/ObjectiveC.qll b/cpp/ql/lib/semmle/code/cpp/ObjectiveC.qll deleted file mode 100644 index 17da273d5a7..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ObjectiveC.qll +++ /dev/null @@ -1,196 +0,0 @@ -/** - * DEPRECATED: Objective-C is no longer supported. - */ - -import semmle.code.cpp.Class -private import semmle.code.cpp.internal.ResolveClass - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C class. - */ -deprecated class ObjectiveClass extends Class { - ObjectiveClass() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C protocol. - */ -deprecated class Protocol extends Class { - Protocol() { none() } - - /** - * Holds if the type implements the protocol, either because the type - * itself does, or because it is a type conforming to the protocol. - */ - predicate isImplementedBy(Type t) { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * A type which conforms to a protocol. Use `getAProtocol` to get a - * protocol that this type conforms to. - */ -deprecated class TypeConformingToProtocol extends DerivedType { - TypeConformingToProtocol() { none() } - - /** Gets a protocol that this type conforms to. */ - Protocol getAProtocol() { none() } - - /** Gets the size of this type. */ - override int getSize() { none() } - - override int getAlignment() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@autoreleasepool` statement, for example - * `@autoreleasepool { int x; int y; }`. - */ -deprecated class AutoReleasePoolStmt extends Stmt { - AutoReleasePoolStmt() { none() } - - override string toString() { none() } - - /** Gets the body statement of this `@autoreleasepool` statement. */ - Stmt getStmt() { none() } - - override predicate mayBeImpure() { none() } - - override predicate mayBeGloballyImpure() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@synchronized statement`, for example - * `@synchronized (x) { [x complicationOperation]; }`. - */ -deprecated class SynchronizedStmt extends Stmt { - SynchronizedStmt() { none() } - - override string toString() { none() } - - /** Gets the expression which gives the object to be locked. */ - Expr getLockedObject() { none() } - - /** Gets the body statement of this `@synchronized` statement. */ - Stmt getStmt() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C for-in statement. - */ -deprecated class ForInStmt extends Loop { - ForInStmt() { none() } - - /** - * Gets the condition expression of the `while` statement that the - * `for...in` statement desugars into. - */ - override Expr getCondition() { none() } - - override Expr getControllingExpr() { none() } - - /** Gets the collection that the loop iterates over. */ - Expr getCollection() { none() } - - /** Gets the body of the loop. */ - override Stmt getStmt() { none() } - - override string toString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C category or class extension. - */ -deprecated class Category extends Class { - Category() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C class extension. - */ -deprecated class ClassExtension extends Category { - ClassExtension() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C try statement. - */ -deprecated class ObjcTryStmt extends TryStmt { - ObjcTryStmt() { none() } - - override string toString() { none() } - - /** Gets the finally clause of this try statement, if any. */ - FinallyBlock getFinallyClause() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@finally` block. - */ -deprecated class FinallyBlock extends BlockStmt { - FinallyBlock() { none() } - - /** Gets the try statement corresponding to this finally block. */ - ObjcTryStmt getTryStmt() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@property`. - */ -deprecated class Property extends Declaration { - Property() { none() } - - /** Gets the name of this property. */ - override string getName() { none() } - - /** - * Gets nothing (provided for compatibility with Declaration). - * - * For the attribute list following the `@property` keyword, use - * `getAnAttribute()`. - */ - override Specifier getASpecifier() { none() } - - /** - * Gets an attribute of this property (such as `readonly`, `nonatomic`, - * or `getter=isEnabled`). - */ - Attribute getAnAttribute() { none() } - - override Location getADeclarationLocation() { result = getLocation() } - - override Location getDefinitionLocation() { result = getLocation() } - - override Location getLocation() { none() } - - /** Gets the type of this property. */ - Type getType() { none() } - - /** - * Gets the instance method which is called to get the value of this - * property. - */ - MemberFunction getGetter() { none() } - - /** - * Gets the instance method which is called to set the value of this - * property (if it is a writable property). - */ - MemberFunction getSetter() { none() } - - /** - * Gets the instance variable which stores the property value (if this - * property was explicitly or automatically `@synthesize`d). - */ - MemberVariable getInstanceVariable() { none() } -} diff --git a/cpp/ql/lib/semmle/code/cpp/Parameter.qll b/cpp/ql/lib/semmle/code/cpp/Parameter.qll index 47b77b542c1..814fa734408 100644 --- a/cpp/ql/lib/semmle/code/cpp/Parameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/Parameter.qll @@ -95,22 +95,6 @@ class Parameter extends LocalScopeVariable, @parameter { else result = this.getADeclarationEntry() } - /** - * Gets the name of this parameter in the given block (which should be - * the body of a function with which the parameter is associated). - * - * DEPRECATED: this method was used in a previous implementation of - * getName, but is no longer in use. - */ - deprecated string getNameInBlock(BlockStmt b) { - exists(ParameterDeclarationEntry pde | - pde.getFunctionDeclarationEntry().getBlock() = b and - this.getFunction().getBlock() = b and - pde.getVariable() = this and - result = pde.getName() - ) - } - /** * Holds if this parameter has a name. * diff --git a/cpp/ql/lib/semmle/code/cpp/Print.qll b/cpp/ql/lib/semmle/code/cpp/Print.qll index 64ae5b960d1..5df8f087689 100644 --- a/cpp/ql/lib/semmle/code/cpp/Print.qll +++ b/cpp/ql/lib/semmle/code/cpp/Print.qll @@ -8,9 +8,9 @@ private import PrintAST private predicate shouldPrintDeclaration(Declaration decl) { not decl instanceof Function or - not exists(PrintASTConfiguration c) + not exists(PrintAstConfiguration c) or - exists(PrintASTConfiguration config | config.shouldPrintFunction(decl)) + exists(PrintAstConfiguration config | config.shouldPrintFunction(decl)) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/PrintAST.ql b/cpp/ql/lib/semmle/code/cpp/PrintAST.ql index e4c53030da5..bf7e345132c 100644 --- a/cpp/ql/lib/semmle/code/cpp/PrintAST.ql +++ b/cpp/ql/lib/semmle/code/cpp/PrintAST.ql @@ -12,7 +12,7 @@ import PrintAST * Temporarily tweak this class or make a copy to control which functions are * printed. */ -class Cfg extends PrintASTConfiguration { +class Cfg extends PrintAstConfiguration { /** * TWEAK THIS PREDICATE AS NEEDED. * Holds if the AST for `func` should be printed. diff --git a/cpp/ql/lib/semmle/code/cpp/PrintAST.qll b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll index 86b39a285b0..106e49aff74 100644 --- a/cpp/ql/lib/semmle/code/cpp/PrintAST.qll +++ b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll @@ -9,12 +9,12 @@ import cpp private import semmle.code.cpp.Print -private newtype TPrintASTConfiguration = MkPrintASTConfiguration() +private newtype TPrintAstConfiguration = MkPrintAstConfiguration() /** * The query can extend this class to control which functions are printed. */ -class PrintASTConfiguration extends TPrintASTConfiguration { +class PrintAstConfiguration extends TPrintAstConfiguration { /** * Gets a textual representation of this `PrintASTConfiguration`. */ @@ -27,8 +27,11 @@ class PrintASTConfiguration extends TPrintASTConfiguration { predicate shouldPrintFunction(Function func) { any() } } +/** DEPRECATED: Alias for PrintAstConfiguration */ +deprecated class PrintASTConfiguration = PrintAstConfiguration; + private predicate shouldPrintFunction(Function func) { - exists(PrintASTConfiguration config | config.shouldPrintFunction(func)) + exists(PrintAstConfiguration config | config.shouldPrintFunction(func)) } bindingset[s] @@ -85,8 +88,8 @@ private Function getEnclosingFunction(Locatable ast) { * Most nodes are just a wrapper around `Locatable`, but we do synthesize new * nodes for things like parameter lists and constructor init lists. */ -private newtype TPrintASTNode = - TASTNode(Locatable ast) { shouldPrintFunction(getEnclosingFunction(ast)) } or +private newtype TPrintAstNode = + TAstNode(Locatable ast) { shouldPrintFunction(getEnclosingFunction(ast)) } or TDeclarationEntryNode(DeclStmt stmt, DeclarationEntry entry) { // We create a unique node for each pair of (stmt, entry), to avoid having one node with // multiple parents due to extractor bug CPP-413. @@ -106,7 +109,7 @@ private newtype TPrintASTNode = /** * A node in the output tree. */ -class PrintASTNode extends TPrintASTNode { +class PrintAstNode extends TPrintAstNode { /** * Gets a textual representation of this node in the PrintAST output tree. */ @@ -116,17 +119,17 @@ class PrintASTNode extends TPrintASTNode { * Gets the child node at index `childIndex`. Child indices must be unique, * but need not be contiguous. */ - abstract PrintASTNode getChildInternal(int childIndex); + abstract PrintAstNode getChildInternal(int childIndex); /** * Gets the child node at index `childIndex`. * Adds edges to fully converted expressions, that are not part of the * regular parent/child relation traversal. */ - final PrintASTNode getChild(int childIndex) { + final PrintAstNode getChild(int childIndex) { // The exact value of `childIndex` doesn't matter, as long as we preserve the correct order. result = - rank[childIndex](PrintASTNode child, int nonConvertedIndex, boolean isConverted | + rank[childIndex](PrintAstNode child, int nonConvertedIndex, boolean isConverted | childAndAccessorPredicate(child, _, nonConvertedIndex, isConverted) | // Unconverted children come first, then sort by original child index within each group. @@ -138,11 +141,11 @@ class PrintASTNode extends TPrintASTNode { * Gets the node for the `.getFullyConverted()` version of the child originally at index * `childIndex`, if that node has any conversions. */ - private PrintASTNode getConvertedChild(int childIndex) { + private PrintAstNode getConvertedChild(int childIndex) { exists(Expr expr | - expr = getChildInternal(childIndex).(ASTNode).getAST() and + expr = getChildInternal(childIndex).(AstNode).getAst() and expr.getFullyConverted() instanceof Conversion and - result.(ASTNode).getAST() = expr.getFullyConverted() and + result.(AstNode).getAst() = expr.getFullyConverted() and not expr instanceof Conversion ) } @@ -166,12 +169,12 @@ class PrintASTNode extends TPrintASTNode { /** * Gets the children of this node. */ - final PrintASTNode getAChild() { result = getChild(_) } + final PrintAstNode getAChild() { result = getChild(_) } /** * Gets the parent of this node, if any. */ - final PrintASTNode getParent() { result.getAChild() = this } + final PrintAstNode getParent() { result.getAChild() = this } /** * Gets the location of this node in the source code. @@ -196,7 +199,7 @@ class PrintASTNode extends TPrintASTNode { * one result tuple, with `isConverted = false`. */ private predicate childAndAccessorPredicate( - PrintASTNode child, string childPredicate, int nonConvertedIndex, boolean isConverted + PrintAstNode child, string childPredicate, int nonConvertedIndex, boolean isConverted ) { child = getChildInternal(nonConvertedIndex) and childPredicate = getChildAccessorPredicateInternal(nonConvertedIndex) and @@ -234,12 +237,15 @@ class PrintASTNode extends TPrintASTNode { private Function getEnclosingFunction() { result = getParent*().(FunctionNode).getFunction() } } +/** DEPRECATED: Alias for PrintAstNode */ +deprecated class PrintASTNode = PrintAstNode; + /** * Class that restricts the elements that we compute `qlClass` for. */ private class PrintableElement extends Element { PrintableElement() { - exists(TASTNode(this)) + exists(TAstNode(this)) or exists(TDeclarationEntryNode(_, this)) or @@ -262,7 +268,7 @@ private string qlClass(PrintableElement el) { /** * A node representing an AST node. */ -abstract class BaseASTNode extends PrintASTNode { +abstract class BaseAstNode extends PrintAstNode { Locatable ast; override string toString() { result = qlClass(ast) + ast.toString() } @@ -272,25 +278,34 @@ abstract class BaseASTNode extends PrintASTNode { /** * Gets the AST represented by this node. */ - final Locatable getAST() { result = ast } + final Locatable getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated Locatable getAST() { result = getAst() } } +/** DEPRECATED: Alias for BaseAstNode */ +deprecated class BaseASTNode = BaseAstNode; + /** * A node representing an AST node other than a `DeclarationEntry`. */ -abstract class ASTNode extends BaseASTNode, TASTNode { - ASTNode() { this = TASTNode(ast) } +abstract class AstNode extends BaseAstNode, TAstNode { + AstNode() { this = TAstNode(ast) } } +/** DEPRECATED: Alias for AstNode */ +deprecated class ASTNode = AstNode; + /** * A node representing an `Expr`. */ -class ExprNode extends ASTNode { +class ExprNode extends AstNode { Expr expr; ExprNode() { expr = ast } - override ASTNode getChildInternal(int childIndex) { result.getAST() = expr.getChild(childIndex) } + override AstNode getChildInternal(int childIndex) { result.getAst() = expr.getChild(childIndex) } override string getProperty(string key) { result = super.getProperty(key) @@ -306,7 +321,7 @@ class ExprNode extends ASTNode { } override string getChildAccessorPredicateInternal(int childIndex) { - result = getChildAccessorWithoutConversions(ast, getChildInternal(childIndex).getAST()) + result = getChildAccessorWithoutConversions(ast, getChildInternal(childIndex).getAst()) } /** @@ -334,9 +349,9 @@ class ConversionNode extends ExprNode { ConversionNode() { conv = expr } - override ASTNode getChildInternal(int childIndex) { + override AstNode getChildInternal(int childIndex) { childIndex = 0 and - result.getAST() = conv.getExpr() and + result.getAst() = conv.getExpr() and conv.getExpr() instanceof Conversion } } @@ -363,27 +378,27 @@ class CastNode extends ConversionNode { class StmtExprNode extends ExprNode { override StmtExpr expr; - override ASTNode getChildInternal(int childIndex) { + override AstNode getChildInternal(int childIndex) { childIndex = 0 and - result.getAST() = expr.getStmt() + result.getAst() = expr.getStmt() } } /** * A node representing a `DeclarationEntry`. */ -class DeclarationEntryNode extends BaseASTNode, TDeclarationEntryNode { +class DeclarationEntryNode extends BaseAstNode, TDeclarationEntryNode { override DeclarationEntry ast; DeclStmt declStmt; DeclarationEntryNode() { this = TDeclarationEntryNode(declStmt, ast) } - override PrintASTNode getChildInternal(int childIndex) { none() } + override PrintAstNode getChildInternal(int childIndex) { none() } override string getChildAccessorPredicateInternal(int childIndex) { none() } override string getProperty(string key) { - result = BaseASTNode.super.getProperty(key) + result = BaseAstNode.super.getProperty(key) or key = "Type" and result = qlClass(ast.getType()) + ast.getType().toString() @@ -396,9 +411,9 @@ class DeclarationEntryNode extends BaseASTNode, TDeclarationEntryNode { class VariableDeclarationEntryNode extends DeclarationEntryNode { override VariableDeclarationEntry ast; - override ASTNode getChildInternal(int childIndex) { + override AstNode getChildInternal(int childIndex) { childIndex = 0 and - result.getAST() = ast.getVariable().getInitializer() + result.getAst() = ast.getVariable().getInitializer() } override string getChildAccessorPredicateInternal(int childIndex) { @@ -410,23 +425,23 @@ class VariableDeclarationEntryNode extends DeclarationEntryNode { /** * A node representing a `Stmt`. */ -class StmtNode extends ASTNode { +class StmtNode extends AstNode { Stmt stmt; StmtNode() { stmt = ast } - override BaseASTNode getChildInternal(int childIndex) { + override BaseAstNode getChildInternal(int childIndex) { exists(Locatable child | child = stmt.getChild(childIndex) and ( - result.getAST() = child.(Expr) or - result.getAST() = child.(Stmt) + result.getAst() = child.(Expr) or + result.getAst() = child.(Stmt) ) ) } override string getChildAccessorPredicateInternal(int childIndex) { - result = getChildAccessorWithoutConversions(ast, getChildInternal(childIndex).getAST()) + result = getChildAccessorWithoutConversions(ast, getChildInternal(childIndex).getAst()) } } @@ -449,12 +464,12 @@ class DeclStmtNode extends StmtNode { /** * A node representing a `Parameter`. */ -class ParameterNode extends ASTNode { +class ParameterNode extends AstNode { Parameter param; ParameterNode() { param = ast } - final override PrintASTNode getChildInternal(int childIndex) { none() } + final override PrintAstNode getChildInternal(int childIndex) { none() } final override string getChildAccessorPredicateInternal(int childIndex) { none() } @@ -469,14 +484,14 @@ class ParameterNode extends ASTNode { /** * A node representing an `Initializer`. */ -class InitializerNode extends ASTNode { +class InitializerNode extends AstNode { Initializer init; InitializerNode() { init = ast } - override ASTNode getChildInternal(int childIndex) { + override AstNode getChildInternal(int childIndex) { childIndex = 0 and - result.getAST() = init.getExpr() + result.getAst() = init.getExpr() } override string getChildAccessorPredicateInternal(int childIndex) { @@ -488,7 +503,7 @@ class InitializerNode extends ASTNode { /** * A node representing the parameters of a `Function`. */ -class ParametersNode extends PrintASTNode, TParametersNode { +class ParametersNode extends PrintAstNode, TParametersNode { Function func; ParametersNode() { this = TParametersNode(func) } @@ -497,8 +512,8 @@ class ParametersNode extends PrintASTNode, TParametersNode { final override Location getLocation() { result = getRepresentativeLocation(func) } - override ASTNode getChildInternal(int childIndex) { - result.getAST() = func.getParameter(childIndex) + override AstNode getChildInternal(int childIndex) { + result.getAst() = func.getParameter(childIndex) } override string getChildAccessorPredicateInternal(int childIndex) { @@ -515,7 +530,7 @@ class ParametersNode extends PrintASTNode, TParametersNode { /** * A node representing the initializer list of a `Constructor`. */ -class ConstructorInitializersNode extends PrintASTNode, TConstructorInitializersNode { +class ConstructorInitializersNode extends PrintAstNode, TConstructorInitializersNode { Constructor ctor; ConstructorInitializersNode() { this = TConstructorInitializersNode(ctor) } @@ -524,8 +539,8 @@ class ConstructorInitializersNode extends PrintASTNode, TConstructorInitializers final override Location getLocation() { result = getRepresentativeLocation(ctor) } - final override ASTNode getChildInternal(int childIndex) { - result.getAST() = ctor.getInitializer(childIndex) + final override AstNode getChildInternal(int childIndex) { + result.getAst() = ctor.getInitializer(childIndex) } final override string getChildAccessorPredicateInternal(int childIndex) { @@ -542,7 +557,7 @@ class ConstructorInitializersNode extends PrintASTNode, TConstructorInitializers /** * A node representing the destruction list of a `Destructor`. */ -class DestructorDestructionsNode extends PrintASTNode, TDestructorDestructionsNode { +class DestructorDestructionsNode extends PrintAstNode, TDestructorDestructionsNode { Destructor dtor; DestructorDestructionsNode() { this = TDestructorDestructionsNode(dtor) } @@ -551,8 +566,8 @@ class DestructorDestructionsNode extends PrintASTNode, TDestructorDestructionsNo final override Location getLocation() { result = getRepresentativeLocation(dtor) } - final override ASTNode getChildInternal(int childIndex) { - result.getAST() = dtor.getDestruction(childIndex) + final override AstNode getChildInternal(int childIndex) { + result.getAst() = dtor.getDestruction(childIndex) } final override string getChildAccessorPredicateInternal(int childIndex) { @@ -569,14 +584,14 @@ class DestructorDestructionsNode extends PrintASTNode, TDestructorDestructionsNo /** * A node representing a `Function`. */ -class FunctionNode extends ASTNode { +class FunctionNode extends AstNode { Function func; FunctionNode() { func = ast } override string toString() { result = qlClass(func) + getIdentityString(func) } - override PrintASTNode getChildInternal(int childIndex) { + override PrintAstNode getChildInternal(int childIndex) { childIndex = 0 and result.(ParametersNode).getFunction() = func or @@ -584,7 +599,7 @@ class FunctionNode extends ASTNode { result.(ConstructorInitializersNode).getConstructor() = func or childIndex = 2 and - result.(ASTNode).getAST() = func.getEntryPoint() + result.(AstNode).getAst() = func.getEntryPoint() or childIndex = 3 and result.(DestructorDestructionsNode).getDestructor() = func @@ -603,7 +618,7 @@ class FunctionNode extends ASTNode { private int getOrder() { this = rank[result](FunctionNode node, Function function, string file, int line, int column | - node.getAST() = function and + node.getAst() = function and locationSortKeys(function, file, line, column) | node order by file, line, column, getIdentityString(function) @@ -648,18 +663,24 @@ private predicate namedStmtChildPredicates(Locatable s, Element e, string pred) or s.(ComputedGotoStmt).getExpr() = e and pred = "getExpr()" or + s.(ConstexprIfStmt).getInitialization() = e and pred = "getInitialization()" + or s.(ConstexprIfStmt).getCondition() = e and pred = "getCondition()" or s.(ConstexprIfStmt).getThen() = e and pred = "getThen()" or s.(ConstexprIfStmt).getElse() = e and pred = "getElse()" or + s.(IfStmt).getInitialization() = e and pred = "getInitialization()" + or s.(IfStmt).getCondition() = e and pred = "getCondition()" or s.(IfStmt).getThen() = e and pred = "getThen()" or s.(IfStmt).getElse() = e and pred = "getElse()" or + s.(SwitchStmt).getInitialization() = e and pred = "getInitialization()" + or s.(SwitchStmt).getExpr() = e and pred = "getExpr()" or s.(SwitchStmt).getStmt() = e and pred = "getStmt()" @@ -856,7 +877,7 @@ private predicate namedExprChildPredicates(Expr expr, Element ele, string pred) } /** Holds if `node` belongs to the output tree, and its property `key` has the given `value`. */ -query predicate nodes(PrintASTNode node, string key, string value) { +query predicate nodes(PrintAstNode node, string key, string value) { node.shouldPrint() and value = node.getProperty(key) } @@ -865,7 +886,7 @@ query predicate nodes(PrintASTNode node, string key, string value) { * Holds if `target` is a child of `source` in the AST, and property `key` of the edge has the * given `value`. */ -query predicate edges(PrintASTNode source, PrintASTNode target, string key, string value) { +query predicate edges(PrintAstNode source, PrintAstNode target, string key, string value) { exists(int childIndex | source.shouldPrint() and target.shouldPrint() and diff --git a/cpp/ql/lib/semmle/code/cpp/Specifier.qll b/cpp/ql/lib/semmle/code/cpp/Specifier.qll index 69cccf06ffb..7a13b13e8c2 100644 --- a/cpp/ql/lib/semmle/code/cpp/Specifier.qll +++ b/cpp/ql/lib/semmle/code/cpp/Specifier.qll @@ -38,7 +38,7 @@ class FunctionSpecifier extends Specifier { /** * A C/C++ storage class specifier: `auto`, `register`, `static`, `extern`, - * or `mutable". + * or `mutable`. */ class StorageClassSpecifier extends Specifier { StorageClassSpecifier() { this.hasName(["auto", "register", "static", "extern", "mutable"]) } diff --git a/cpp/ql/lib/semmle/code/cpp/Type.qll b/cpp/ql/lib/semmle/code/cpp/Type.qll index f8552144ea8..7e8cebe3c16 100644 --- a/cpp/ql/lib/semmle/code/cpp/Type.qll +++ b/cpp/ql/lib/semmle/code/cpp/Type.qll @@ -94,6 +94,7 @@ class Type extends Locatable, @type { * The result of this predicate will be the type itself, except in the case of a TypedefType or a Decltype, * in which case the result will be type which results from (possibly recursively) resolving typedefs. */ + pragma[nomagic] Type getUnderlyingType() { result = this } /** @@ -1085,50 +1086,6 @@ class DerivedType extends Type, @derivedtype { override predicate involvesTemplateParameter() { this.getBaseType().involvesTemplateParameter() } override Type stripType() { result = this.getBaseType().stripType() } - - /** - * Holds if this type has the `__autoreleasing` specifier or if it points to - * a type with the `__autoreleasing` specifier. - * - * DEPRECATED: use `hasSpecifier` directly instead. - */ - deprecated predicate isAutoReleasing() { - this.hasSpecifier("__autoreleasing") or - this.(PointerType).getBaseType().hasSpecifier("__autoreleasing") - } - - /** - * Holds if this type has the `__strong` specifier or if it points to - * a type with the `__strong` specifier. - * - * DEPRECATED: use `hasSpecifier` directly instead. - */ - deprecated predicate isStrong() { - this.hasSpecifier("__strong") or - this.(PointerType).getBaseType().hasSpecifier("__strong") - } - - /** - * Holds if this type has the `__unsafe_unretained` specifier or if it points - * to a type with the `__unsafe_unretained` specifier. - * - * DEPRECATED: use `hasSpecifier` directly instead. - */ - deprecated predicate isUnsafeRetained() { - this.hasSpecifier("__unsafe_unretained") or - this.(PointerType).getBaseType().hasSpecifier("__unsafe_unretained") - } - - /** - * Holds if this type has the `__weak` specifier or if it points to - * a type with the `__weak` specifier. - * - * DEPRECATED: use `hasSpecifier` directly instead. - */ - deprecated predicate isWeak() { - this.hasSpecifier("__weak") or - this.(PointerType).getBaseType().hasSpecifier("__weak") - } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/TypedefType.qll b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll index 51bcf6f6127..4721ecc2612 100644 --- a/cpp/ql/lib/semmle/code/cpp/TypedefType.qll +++ b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll @@ -106,25 +106,4 @@ class NestedTypedefType extends TypedefType { NestedTypedefType() { this.isMember() } override string getAPrimaryQlClass() { result = "NestedTypedefType" } - - /** - * DEPRECATED: use `.hasSpecifier("private")` instead. - * - * Holds if this member is private. - */ - deprecated predicate isPrivate() { this.hasSpecifier("private") } - - /** - * DEPRECATED: `.hasSpecifier("protected")` instead. - * - * Holds if this member is protected. - */ - deprecated predicate isProtected() { this.hasSpecifier("protected") } - - /** - * DEPRECATED: use `.hasSpecifier("public")` instead. - * - * Holds if this member is public. - */ - deprecated predicate isPublic() { this.hasSpecifier("public") } } diff --git a/cpp/ql/lib/semmle/code/cpp/Variable.qll b/cpp/ql/lib/semmle/code/cpp/Variable.qll index 2c7d85f9cc8..2e3d6bf3ca2 100644 --- a/cpp/ql/lib/semmle/code/cpp/Variable.qll +++ b/cpp/ql/lib/semmle/code/cpp/Variable.qll @@ -556,24 +556,6 @@ class MemberVariable extends Variable, @membervariable { private Type getAType() { membervariables(underlyingElement(this), unresolveElement(result), _) } } -/** - * A C/C++ function pointer variable. - * - * DEPRECATED: use `Variable.getType() instanceof FunctionPointerType` instead. - */ -deprecated class FunctionPointerVariable extends Variable { - FunctionPointerVariable() { this.getType() instanceof FunctionPointerType } -} - -/** - * A C/C++ function pointer member variable. - * - * DEPRECATED: use `MemberVariable.getType() instanceof FunctionPointerType` instead. - */ -deprecated class FunctionPointerMemberVariable extends MemberVariable { - FunctionPointerMemberVariable() { this instanceof FunctionPointerVariable } -} - /** * A C++14 variable template. For example, in the following code the variable * template `v` defines a family of variables: diff --git a/cpp/ql/lib/semmle/code/cpp/XML.qll b/cpp/ql/lib/semmle/code/cpp/XML.qll index dc76884b73c..fb781a4683f 100755 --- a/cpp/ql/lib/semmle/code/cpp/XML.qll +++ b/cpp/ql/lib/semmle/code/cpp/XML.qll @@ -4,21 +4,14 @@ import semmle.files.FileSystem -private class TXMLLocatable = +private class TXmlLocatable = @xmldtd or @xmlelement or @xmlattribute or @xmlnamespace or @xmlcomment or @xmlcharacters; /** An XML element that has a location. */ -class XMLLocatable extends @xmllocatable, TXMLLocatable { +class XMLLocatable extends @xmllocatable, TXmlLocatable { /** Gets the source location for this element. */ Location getLocation() { xmllocations(this, result) } - /** - * DEPRECATED: Use `getLocation()` instead. - * - * Gets the source location for this element. - */ - deprecated Location getALocation() { result = this.getLocation() } - /** * Holds if this element is at the specified location. * The location spans column `startcolumn` of line `startline` to @@ -83,21 +76,6 @@ class XMLParent extends @xmlparent { /** Gets the number of places in the body of this XML parent where text occurs. */ int getNumberOfCharacterSets() { result = count(int pos | xmlChars(_, _, this, pos, _, _)) } - /** - * DEPRECATED: Internal. - * - * Append the character sequences of this XML parent from left to right, separated by a space, - * up to a specified (zero-based) index. - */ - deprecated string charsSetUpTo(int n) { - n = 0 and xmlChars(_, result, this, 0, _, _) - or - n > 0 and - exists(string chars | xmlChars(_, chars, this, n, _, _) | - result = this.charsSetUpTo(n - 1) + " " + chars - ) - } - /** * Gets the result of appending all the character sequences of this XML parent from * left to right, separated by a space. diff --git a/cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll b/cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll index a9597fc72b5..ce3f6993525 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll @@ -2,20 +2,6 @@ import cpp import semmle.code.cpp.models.interfaces.Allocation import semmle.code.cpp.models.interfaces.Deallocation -/** - * A library routine that allocates memory. - * - * DEPRECATED: Use the `AllocationFunction` class instead of this predicate. - */ -deprecated predicate allocationFunction(Function f) { f instanceof AllocationFunction } - -/** - * A call to a library routine that allocates memory. - * - * DEPRECATED: Use `AllocationExpr` instead (this also includes `new` expressions). - */ -deprecated predicate allocationCall(FunctionCall fc) { fc instanceof AllocationExpr } - /** * A library routine that frees memory. */ @@ -33,13 +19,6 @@ predicate freeCall(FunctionCall fc, Expr arg) { arg = fc.(DeallocationExpr).getF */ predicate isMemoryManagementExpr(Expr e) { isAllocationExpr(e) or e instanceof DeallocationExpr } -/** - * Is e an allocation from stdlib.h (`malloc`, `realloc` etc)? - * - * DEPRECATED: Use `AllocationExpr` instead (this also includes `new` expressions). - */ -deprecated predicate isStdLibAllocationExpr(Expr e) { allocationCall(e) } - /** * Is e some kind of allocation (`new`, `alloc`, `realloc` etc)? */ @@ -48,19 +27,3 @@ predicate isAllocationExpr(Expr e) { or e = any(NewOrNewArrayExpr new | not exists(new.getPlacementPointer())) } - -/** - * Is e some kind of allocation (`new`, `alloc`, `realloc` etc) with a fixed size? - * - * DEPRECATED: Use `AllocationExpr.getSizeBytes()` instead. - */ -deprecated predicate isFixedSizeAllocationExpr(Expr allocExpr, int size) { - size = allocExpr.(AllocationExpr).getSizeBytes() -} - -/** - * Is e some kind of deallocation (`delete`, `free`, `realloc` etc)? - * - * DEPRECATED: Use `DeallocationExpr` instead. - */ -deprecated predicate isDeallocationExpr(Expr e) { e instanceof DeallocationExpr } diff --git a/cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll b/cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll index 2328476d525..06dcdfb9d85 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll @@ -10,11 +10,18 @@ import semmle.code.cpp.dataflow.DataFlow * char data[1]; // v * }; * ``` - * This requires that `v` is an array of size 0 or 1. + * or + * ``` + * struct myStruct { // c + * int amount; + * char data[]; // v + * }; + * ``` + * This requires that `v` is an array of size 0 or 1, or that the array has no size. */ predicate memberMayBeVarSize(Class c, MemberVariable v) { c = v.getDeclaringType() and - v.getUnspecifiedType().(ArrayType).getArraySize() <= 1 + exists(ArrayType t | t = v.getUnspecifiedType() | not t.getArraySize() > 1) } /** @@ -27,11 +34,11 @@ int getBufferSize(Expr bufferExpr, Element why) { result = bufferVar.getUnspecifiedType().(ArrayType).getSize() and why = bufferVar and not memberMayBeVarSize(_, bufferVar) and - not result = 0 // zero sized arrays are likely to have special usage, for example - or + // zero sized arrays are likely to have special usage, for example // behaving a bit like a 'union' overlapping other fields. - // buffer is an initialized array - // e.g. int buffer[] = {1, 2, 3}; + not result = 0 + or + // buffer is an initialized array, e.g., int buffer[] = {1, 2, 3}; why = bufferVar.getInitializer().getExpr() and ( why instanceof AggregateLiteral or @@ -40,13 +47,18 @@ int getBufferSize(Expr bufferExpr, Element why) { result = why.(Expr).getType().(ArrayType).getSize() and not exists(bufferVar.getUnspecifiedType().(ArrayType).getSize()) or - exists(Class parentClass, VariableAccess parentPtr | + exists(Class parentClass, VariableAccess parentPtr, int bufferSize | // buffer is the parentPtr->bufferVar of a 'variable size struct' memberMayBeVarSize(parentClass, bufferVar) and why = bufferVar and parentPtr = bufferExpr.(VariableAccess).getQualifier() and parentPtr.getTarget().getUnspecifiedType().(PointerType).getBaseType() = parentClass and - result = getBufferSize(parentPtr, _) + bufferVar.getType().getSize() - parentClass.getSize() + ( + if exists(bufferVar.getType().getSize()) + then bufferSize = bufferVar.getType().getSize() + else bufferSize = 0 + ) and + result = getBufferSize(parentPtr, _) + bufferSize - parentClass.getSize() ) ) or diff --git a/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll b/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll index 4a6566da45d..71a31d03aac 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll @@ -207,26 +207,6 @@ predicate variadicFormatter(Function f, string type, int formatParamIndex, int o callsVariadicFormatter(f, type, formatParamIndex, outputParamIndex) } -/** - * A standard function such as `vprintf` that has a format parameter - * and a variable argument list of type `va_arg`. - * - * DEPRECATED: Use the four argument version instead. - */ -deprecated predicate primitiveVariadicFormatter(TopLevelFunction f, int formatParamIndex) { - primitiveVariadicFormatter(f, _, formatParamIndex, _) -} - -/** - * Holds if `f` is a function such as `vprintf` that has a format parameter - * (at `formatParamIndex`) and a variable argument list of type `va_arg`. - * - * DEPRECATED: Use the four argument version instead. - */ -deprecated predicate variadicFormatter(Function f, int formatParamIndex) { - variadicFormatter(f, _, formatParamIndex, _) -} - /** * A function not in the standard library which takes a `printf`-like formatting * string and a variable number of arguments. @@ -428,13 +408,6 @@ class FormatLiteral extends Literal { */ FormattingFunctionCall getUse() { result.getFormat() = this } - /** - * Holds if the default meaning of `%s` is a `wchar_t *`, rather than - * a `char *` (either way, `%S` will have the opposite meaning). - * DEPRECATED: Use getDefaultCharType() instead. - */ - deprecated predicate isWideCharDefault() { this.getUse().getTarget().isWideCharDefault() } - /** * Gets the default character type expected for `%s` by this format literal. Typically * `char` or `wchar_t`. @@ -899,7 +872,7 @@ class FormatLiteral extends Literal { private Type getConversionType1(int n) { exists(string cnv | cnv = this.getConversionChar(n) | - cnv.regexpMatch("d|i") and + cnv = ["d", "i"] and result = this.getIntegralConversion(n) and not result.getUnderlyingType().(IntegralType).isExplicitlySigned() and not result.getUnderlyingType().(IntegralType).isExplicitlyUnsigned() @@ -939,7 +912,7 @@ class FormatLiteral extends Literal { private Type getConversionType2(int n) { exists(string cnv | cnv = this.getConversionChar(n) | - cnv.regexpMatch("o|u|x|X") and + cnv = ["o", "u", "x", "X"] and result = this.getIntegralConversion(n) and result.getUnderlyingType().(IntegralType).isUnsigned() ) @@ -947,7 +920,7 @@ class FormatLiteral extends Literal { private Type getConversionType3(int n) { exists(string cnv | cnv = this.getConversionChar(n) | - cnv.regexpMatch("a|A|e|E|f|F|g|G") and result = this.getFloatingPointConversion(n) + cnv = ["a", "A", "e", "E", "f", "F", "g", "G"] and result = this.getFloatingPointConversion(n) ) } @@ -1339,7 +1312,7 @@ class FormatLiteral extends Literal { len = min(int v | v = this.getPrecision(n) or - v = this.getUse().getFormatArgument(n).(AnalysedString).getMaxLength() - 1 // (don't count null terminator) + v = this.getUse().getFormatArgument(n).(AnalyzedString).getMaxLength() - 1 // (don't count null terminator) ) and reason = TValueFlowAnalysis() ) diff --git a/cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll index b54ff6d66e3..40689adda30 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll @@ -27,11 +27,14 @@ predicate canValueFlow(Expr fromExpr, Expr toExpr) { fromExpr = toExpr.(ConditionalExpr).getElse() } +/** DEPRECATED: Alias for AnalyzedString */ +deprecated class AnalysedString = AnalyzedString; + /** - * An analysed null terminated string. + * An analyzed null terminated string. */ -class AnalysedString extends Expr { - AnalysedString() { +class AnalyzedString extends Expr { + AnalyzedString() { this.getUnspecifiedType() instanceof ArrayType or this.getUnspecifiedType() instanceof PointerType } @@ -41,15 +44,15 @@ class AnalysedString extends Expr { * can be calculated. */ int getMaxLength() { - // take the longest AnalysedString it's value could 'flow' from; however if even one doesn't + // take the longest AnalyzedString its value could 'flow' from; however if even one doesn't // return a value (this essentially means 'infinity') we can't return a value either. result = - max(AnalysedString expr, int toMax | + max(AnalyzedString expr, int toMax | canValueFlow*(expr, this) and toMax = expr.(StringLiteral).getOriginalLength() | toMax ) and // maximum length - forall(AnalysedString expr | canValueFlow(expr, this) | exists(expr.getMaxLength())) // all sources return a value (recursive) + forall(AnalyzedString expr | canValueFlow(expr, this) | exists(expr.getMaxLength())) // all sources return a value (recursive) } } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll index 34373d943af..11a7e8f9e64 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll @@ -223,20 +223,6 @@ class BasicBlock extends ControlFlowNodeBase { */ predicate inLoop() { this.getASuccessor+() = this } - /** - * DEPRECATED since version 1.11: this predicate does not match the standard - * definition of _loop header_. - * - * Holds if this basic block is in a loop of the control-flow graph and - * additionally has an incoming edge that is not part of any loop containing - * this basic block. A typical example would be the basic block that computes - * `x > 0` in an outermost loop `while (x > 0) { ... }`. - */ - deprecated predicate isLoopHeader() { - this.inLoop() and - exists(BasicBlock pred | pred = this.getAPredecessor() and not pred = this.getASuccessor+()) - } - /** * Holds if control flow may reach this basic block from a function entry * point or any handler of a reachable `try` statement. diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll index c7b3d1dc16f..846d8047982 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll @@ -65,7 +65,7 @@ class ControlFlowNode extends Locatable, ControlFlowNodeBase { * taken when this expression is true. */ ControlFlowNode getATrueSuccessor() { - qlCFGTrueSuccessor(this, result) and + qlCfgTrueSuccessor(this, result) and result = this.getASuccessor() } @@ -74,7 +74,7 @@ class ControlFlowNode extends Locatable, ControlFlowNodeBase { * taken when this expression is false. */ ControlFlowNode getAFalseSuccessor() { - qlCFGFalseSuccessor(this, result) and + qlCfgFalseSuccessor(this, result) and result = this.getASuccessor() } @@ -94,24 +94,6 @@ import ControlFlowGraphPublic */ class ControlFlowNodeBase extends ElementBase, @cfgnode { } -/** - * DEPRECATED: Use `ControlFlowNode.getATrueSuccessor()` instead. - * Holds when `n2` is a control-flow node such that the control-flow - * edge `(n1, n2)` may be taken when `n1` is an expression that is true. - */ -deprecated predicate truecond_base(ControlFlowNodeBase n1, ControlFlowNodeBase n2) { - qlCFGTrueSuccessor(n1, n2) -} - -/** - * DEPRECATED: Use `ControlFlowNode.getAFalseSuccessor()` instead. - * Holds when `n2` is a control-flow node such that the control-flow - * edge `(n1, n2)` may be taken when `n1` is an expression that is false. - */ -deprecated predicate falsecond_base(ControlFlowNodeBase n1, ControlFlowNodeBase n2) { - qlCFGFalseSuccessor(n1, n2) -} - /** * An abstract class that can be extended to add additional edges to the * control-flow graph. Instances of this class correspond to the source nodes @@ -139,7 +121,7 @@ abstract class AdditionalControlFlowEdge extends ControlFlowNodeBase { * `AdditionalControlFlowEdge`. Use this relation instead of `qlCFGSuccessor`. */ predicate successors_extended(ControlFlowNodeBase source, ControlFlowNodeBase target) { - qlCFGSuccessor(source, target) + qlCfgSuccessor(source, target) or source.(AdditionalControlFlowEdge).getAnEdgeTarget() = target } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll index 2b222376a0b..d12eaa4e238 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll @@ -33,8 +33,8 @@ class GuardCondition extends Expr { or // the IR short-circuits if(!x) // don't produce a guard condition for `y = !x` and other non-short-circuited cases - not exists(Instruction inst | this.getFullyConverted() = inst.getAST()) and - exists(IRGuardCondition ir | this.(NotExpr).getOperand() = ir.getAST()) + not exists(Instruction inst | this.getFullyConverted() = inst.getAst()) and + exists(IRGuardCondition ir | this.(NotExpr).getOperand() = ir.getAst()) } /** @@ -146,8 +146,8 @@ private class GuardConditionFromBinaryLogicalOperator extends GuardCondition { */ private class GuardConditionFromShortCircuitNot extends GuardCondition, NotExpr { GuardConditionFromShortCircuitNot() { - not exists(Instruction inst | this.getFullyConverted() = inst.getAST()) and - exists(IRGuardCondition ir | this.getOperand() = ir.getAST()) + not exists(Instruction inst | this.getFullyConverted() = inst.getAst()) and + exists(IRGuardCondition ir | this.getOperand() = ir.getAst()) } override predicate controls(BasicBlock controlled, boolean testIsTrue) { @@ -241,7 +241,7 @@ private class GuardConditionFromIR extends GuardCondition { private predicate controlsBlock(BasicBlock controlled, boolean testIsTrue) { exists(IRBlock irb | forex(IRGuardCondition inst | inst = ir | inst.controls(irb, testIsTrue)) and - irb.getAnInstruction().getAST().(ControlFlowNode).getBasicBlock() = controlled and + irb.getAnInstruction().getAst().(ControlFlowNode).getBasicBlock() = controlled and not isUnreachedBlock(irb) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll deleted file mode 100644 index f6685865830..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll +++ /dev/null @@ -1,393 +0,0 @@ -/** - * DEPRECATED: Use `StackVariableReachability` instead. - */ - -import cpp - -/** - * DEPRECATED: Use `StackVariableReachability` instead. - * - * A reachability analysis for control-flow nodes involving stack variables. - * This defines sources, sinks, and any other configurable aspect of the - * analysis. Multiple analyses can coexist. To create an analysis, extend this - * class with a subclass whose characteristic predicate is a unique singleton - * string. For example, write - * - * ``` - * class MyAnalysisConfiguration extends LocalScopeVariableReachability { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Override `isBarrier`. - * } - * ``` - * - * Then, to query whether there is flow between some source and sink, call the - * `reaches` predicate on an instance of `MyAnalysisConfiguration`. - */ -abstract deprecated class LocalScopeVariableReachability extends string { - bindingset[this] - LocalScopeVariableReachability() { length() >= 0 } - - /** Holds if `node` is a source for the reachability analysis using variable `v`. */ - abstract predicate isSource(ControlFlowNode node, LocalScopeVariable v); - - /** Holds if `sink` is a (potential) sink for the reachability analysis using variable `v`. */ - abstract predicate isSink(ControlFlowNode node, LocalScopeVariable v); - - /** Holds if `node` is a barrier for the reachability analysis using variable `v`. */ - abstract predicate isBarrier(ControlFlowNode node, LocalScopeVariable v); - - /** - * Holds if the source node `source` can reach the sink `sink` without crossing - * a barrier. This is (almost) equivalent to the following QL predicate but - * uses basic blocks internally for better performance: - * - * ``` - * predicate reaches(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - * reachesImpl(source, v, sink) - * and - * isSink(sink, v) - * } - * - * predicate reachesImpl(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - * sink = source.getASuccessor() and isSource(source, v) - * or - * exists(ControlFlowNode mid | reachesImpl(source, v, mid) | - * not isBarrier(mid, v) - * and - * sink = mid.getASuccessor() - * ) - * } - * ``` - * - * In addition to using a better performing implementation, this analysis - * accounts for loops where the condition is provably true upon entry. - */ - predicate reaches(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - /* - * Implementation detail: the predicates in this class are a generalization of - * those in DefinitionsAndUses.qll, and should be kept in sync. - * - * Unfortunately, caching of abstract predicates does not work well, so the - * predicates in DefinitionsAndUses.qll cannot use this library. - */ - - exists(BasicBlock bb, int i | - this.isSource(source, v) and - bb.getNode(i) = source and - not bb.isUnreachable() - | - exists(int j | - j > i and - sink = bb.getNode(j) and - this.isSink(sink, v) and - not exists(int k | this.isBarrier(bb.getNode(k), v) | k in [i + 1 .. j - 1]) - ) - or - not exists(int k | this.isBarrier(bb.getNode(k), v) | k > i) and - this.bbSuccessorEntryReaches(bb, v, sink, _) - ) - } - - private predicate bbSuccessorEntryReaches( - BasicBlock bb, SemanticStackVariable v, ControlFlowNode node, - boolean skipsFirstLoopAlwaysTrueUponEntry - ) { - exists(BasicBlock succ, boolean succSkipsFirstLoopAlwaysTrueUponEntry | - bbSuccessorEntryReachesLoopInvariant(bb, succ, skipsFirstLoopAlwaysTrueUponEntry, - succSkipsFirstLoopAlwaysTrueUponEntry) - | - this.bbEntryReachesLocally(succ, v, node) and - succSkipsFirstLoopAlwaysTrueUponEntry = false - or - not this.isBarrier(succ.getNode(_), v) and - this.bbSuccessorEntryReaches(succ, v, node, succSkipsFirstLoopAlwaysTrueUponEntry) - ) - } - - private predicate bbEntryReachesLocally( - BasicBlock bb, SemanticStackVariable v, ControlFlowNode node - ) { - exists(int n | - node = bb.getNode(n) and - this.isSink(node, v) - | - not exists(this.firstBarrierIndexIn(bb, v)) - or - n <= this.firstBarrierIndexIn(bb, v) - ) - } - - private int firstBarrierIndexIn(BasicBlock bb, SemanticStackVariable v) { - result = min(int m | this.isBarrier(bb.getNode(m), v)) - } -} - -/** - * Holds if `bb` contains the entry point `loop` for a loop at position `i`. - * The condition of that loop is provably true upon entry but not provably - * true in general (if it were, the false-successor had already been removed - * from the CFG). - * - * Examples: - * ``` - * for (int i = 0; i < 2; i++) { } // always true upon entry - * for (int i = 0; true; i++) { } // always true - * ``` - */ -private predicate bbLoopEntryConditionAlwaysTrueAt(BasicBlock bb, int i, ControlFlowNode loop) { - exists(Expr condition | - loopConditionAlwaysTrueUponEntry(loop, condition) and - not conditionAlwaysTrue(condition) and - bb.getNode(i) = loop - ) -} - -/** - * Basic block `pred` contains all or part of the condition belonging to a loop, - * and there is an edge from `pred` to `succ` that concludes the condition. - * If the edge corrseponds with the loop condition being found to be `true`, then - * `skipsLoop` is `false`. Otherwise the edge corresponds with the loop condition - * being found to be `false` and `skipsLoop` is `true`. Non-concluding edges - * within a complex loop condition are not matched by this predicate. - */ -private predicate bbLoopConditionAlwaysTrueUponEntrySuccessor( - BasicBlock pred, BasicBlock succ, boolean skipsLoop -) { - exists(Expr cond | - loopConditionAlwaysTrueUponEntry(_, cond) and - cond.getAChild*() = pred.getEnd() and - succ = pred.getASuccessor() and - not cond.getAChild*() = succ.getStart() and - ( - succ = pred.getAFalseSuccessor() and - skipsLoop = true - or - succ = pred.getATrueSuccessor() and - skipsLoop = false - ) - ) -} - -/** - * Loop invariant for `bbSuccessorEntryReaches`: - * - * - `succ` is a successor of `pred`. - * - `predSkipsFirstLoopAlwaysTrueUponEntry`: whether the path from - * `pred` (via `succ`) skips the first loop where the condition is - * provably true upon entry. - * - `succSkipsFirstLoopAlwaysTrueUponEntry`: whether the path from - * `succ` skips the first loop where the condition is provably true - * upon entry. - * - If `pred` contains the entry point of a loop where the condition - * is provably true upon entry, then `succ` is not allowed to skip - * that loop (`succSkipsFirstLoopAlwaysTrueUponEntry = false`). - */ -predicate bbSuccessorEntryReachesLoopInvariant( - BasicBlock pred, BasicBlock succ, boolean predSkipsFirstLoopAlwaysTrueUponEntry, - boolean succSkipsFirstLoopAlwaysTrueUponEntry -) { - succ = pred.getASuccessor() and - (succSkipsFirstLoopAlwaysTrueUponEntry = true or succSkipsFirstLoopAlwaysTrueUponEntry = false) and - ( - // The edge from `pred` to `succ` is from a loop condition provably - // true upon entry, so the value of `predSkipsFirstLoopAlwaysTrueUponEntry` - // is determined by whether the true edge or the false edge is chosen, - // regardless of the value of `succSkipsFirstLoopAlwaysTrueUponEntry`. - bbLoopConditionAlwaysTrueUponEntrySuccessor(pred, succ, predSkipsFirstLoopAlwaysTrueUponEntry) - or - // The edge from `pred` to `succ` is _not_ from a loop condition provably - // true upon entry, so the values of `predSkipsFirstLoopAlwaysTrueUponEntry` - // and `succSkipsFirstLoopAlwaysTrueUponEntry` must be the same. - not bbLoopConditionAlwaysTrueUponEntrySuccessor(pred, succ, _) and - succSkipsFirstLoopAlwaysTrueUponEntry = predSkipsFirstLoopAlwaysTrueUponEntry and - // Moreover, if `pred` contains the entry point of a loop where the - // condition is provably true upon entry, then `succ` is not allowed - // to skip that loop, and hence `succSkipsFirstLoopAlwaysTrueUponEntry = false`. - ( - bbLoopEntryConditionAlwaysTrueAt(pred, _, _) - implies - succSkipsFirstLoopAlwaysTrueUponEntry = false - ) - ) -} - -/** - * DEPRECATED: Use `StackVariableReachabilityWithReassignment` instead. - * - * Reachability analysis for control-flow nodes involving stack variables. - * Unlike `LocalScopeVariableReachability`, this analysis takes variable - * reassignments into account. - * - * This class is used like `LocalScopeVariableReachability`, except that - * subclasses should override `isSourceActual` and `isSinkActual` instead of - * `isSource` and `isSink`, and that there is a `reachesTo` predicate in - * addition to `reaches`. - */ -abstract deprecated class LocalScopeVariableReachabilityWithReassignment extends LocalScopeVariableReachability { - bindingset[this] - LocalScopeVariableReachabilityWithReassignment() { length() >= 0 } - - /** Override this predicate rather than `isSource` (`isSource` is used internally). */ - abstract predicate isSourceActual(ControlFlowNode node, LocalScopeVariable v); - - /** Override this predicate rather than `isSink` (`isSink` is used internally). */ - abstract predicate isSinkActual(ControlFlowNode node, LocalScopeVariable v); - - /** - * Holds if the source node `source` can reach the sink `sink` without crossing - * a barrier, taking reassignments into account. This is (almost) equivalent - * to the following QL predicate, but uses basic blocks internally for better - * performance: - * - * ``` - * predicate reaches(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - * reachesImpl(source, v, sink) - * and - * isSinkActual(sink, v) - * } - * - * predicate reachesImpl(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - * isSourceActual(source, v) - * and - * ( - * sink = source.getASuccessor() - * or - * exists(ControlFlowNode mid, SemanticStackVariable v0 | reachesImpl(source, v0, mid) | - * // ordinary successor - * not isBarrier(mid, v) and - * sink = mid.getASuccessor() and - * v = v0 - * or - * // reassigned from v0 to v - * exprDefinition(v, mid, v0.getAnAccess()) and - * sink = mid.getASuccessor() - * ) - * ) - * } - * ``` - * - * In addition to using a better performing implementation, this analysis - * accounts for loops where the condition is provably true upon entry. - */ - override predicate reaches(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - this.reachesTo(source, v, sink, _) - } - - /** - * As `reaches`, but also specifies the last variable it was reassigned to (`v0`). - */ - predicate reachesTo( - ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink, SemanticStackVariable v0 - ) { - exists(ControlFlowNode def | - this.actualSourceReaches(source, v, def, v0) and - LocalScopeVariableReachability.super.reaches(def, v0, sink) and - this.isSinkActual(sink, v0) - ) - } - - private predicate actualSourceReaches( - ControlFlowNode source, SemanticStackVariable v, ControlFlowNode def, SemanticStackVariable v0 - ) { - this.isSourceActual(source, v) and def = source and v0 = v - or - exists(ControlFlowNode source1, SemanticStackVariable v1 | - this.actualSourceReaches(source, v, source1, v1) - | - this.reassignment(source1, v1, def, v0) - ) - } - - private predicate reassignment( - ControlFlowNode source, SemanticStackVariable v, ControlFlowNode def, SemanticStackVariable v0 - ) { - LocalScopeVariableReachability.super.reaches(source, v, def) and - exprDefinition(v0, def, v.getAnAccess()) - } - - final override predicate isSource(ControlFlowNode node, LocalScopeVariable v) { - this.isSourceActual(node, v) - or - // Reassignment generates a new (non-actual) source - this.reassignment(_, _, node, v) - } - - final override predicate isSink(ControlFlowNode node, LocalScopeVariable v) { - this.isSinkActual(node, v) - or - // Reassignment generates a new (non-actual) sink - exprDefinition(_, node, v.getAnAccess()) - } -} - -/** - * DEPRECATED: Use `StackVariableReachabilityExt` instead. - * - * Same as `LocalScopeVariableReachability`, but `isBarrier` works on control-flow - * edges rather than nodes and is therefore parameterized by the original - * source node as well. Otherwise, this class is used like - * `LocalScopeVariableReachability`. - */ -abstract deprecated class LocalScopeVariableReachabilityExt extends string { - bindingset[this] - LocalScopeVariableReachabilityExt() { length() >= 0 } - - /** `node` is a source for the reachability analysis using variable `v`. */ - abstract predicate isSource(ControlFlowNode node, LocalScopeVariable v); - - /** `sink` is a (potential) sink for the reachability analysis using variable `v`. */ - abstract predicate isSink(ControlFlowNode node, LocalScopeVariable v); - - /** `node` is a barrier for the reachability analysis using variable `v` and starting from `source`. */ - abstract predicate isBarrier( - ControlFlowNode source, ControlFlowNode node, ControlFlowNode next, LocalScopeVariable v - ); - - /** See `LocalScopeVariableReachability.reaches`. */ - predicate reaches(ControlFlowNode source, SemanticStackVariable v, ControlFlowNode sink) { - exists(BasicBlock bb, int i | - this.isSource(source, v) and - bb.getNode(i) = source and - not bb.isUnreachable() - | - exists(int j | - j > i and - sink = bb.getNode(j) and - this.isSink(sink, v) and - not exists(int k | this.isBarrier(source, bb.getNode(k), bb.getNode(k + 1), v) | - k in [i .. j - 1] - ) - ) - or - not exists(int k | this.isBarrier(source, bb.getNode(k), bb.getNode(k + 1), v) | k >= i) and - this.bbSuccessorEntryReaches(source, bb, v, sink, _) - ) - } - - private predicate bbSuccessorEntryReaches( - ControlFlowNode source, BasicBlock bb, SemanticStackVariable v, ControlFlowNode node, - boolean skipsFirstLoopAlwaysTrueUponEntry - ) { - exists(BasicBlock succ, boolean succSkipsFirstLoopAlwaysTrueUponEntry | - bbSuccessorEntryReachesLoopInvariant(bb, succ, skipsFirstLoopAlwaysTrueUponEntry, - succSkipsFirstLoopAlwaysTrueUponEntry) and - not this.isBarrier(source, bb.getEnd(), succ.getStart(), v) - | - this.bbEntryReachesLocally(source, succ, v, node) and - succSkipsFirstLoopAlwaysTrueUponEntry = false - or - not exists(int k | this.isBarrier(source, succ.getNode(k), succ.getNode(k + 1), v)) and - this.bbSuccessorEntryReaches(source, succ, v, node, succSkipsFirstLoopAlwaysTrueUponEntry) - ) - } - - private predicate bbEntryReachesLocally( - ControlFlowNode source, BasicBlock bb, SemanticStackVariable v, ControlFlowNode node - ) { - this.isSource(source, v) and - exists(int n | node = bb.getNode(n) and this.isSink(node, v) | - not exists(int m | m < n | this.isBarrier(source, bb.getNode(m), bb.getNode(m + 1), v)) - ) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll index 69d2166a1d2..40c975873b4 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll @@ -156,15 +156,6 @@ class AnalysedExpr extends Expr { this.isValidCheck(v) and result = this.getATrueSuccessor() } - /** - * DEPRECATED: Use `getNonNullSuccessor` instead, which does the same. - */ - deprecated ControlFlowNode getValidSuccessor(LocalScopeVariable v) { - this.isValidCheck(v) and result = this.getATrueSuccessor() - or - this.isNullCheck(v) and result = this.getAFalseSuccessor() - } - /** * Holds if this is a `VariableAccess` of `v` nested inside a condition. */ diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll index c7af3fe4326..4732cd06184 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll @@ -10,10 +10,13 @@ import SSAUtils * The SSA logic comes in two versions: the standard SSA and range-analysis RangeSSA. * This class provides the standard SSA logic. */ -library class StandardSSA extends SSAHelper { - StandardSSA() { this = 0 } +library class StandardSsa extends SsaHelper { + StandardSsa() { this = 0 } } +/** DEPRECATED: Alias for StandardSsa */ +deprecated class StandardSSA = StandardSsa; + /** * A definition of one or more SSA variables, including phi node definitions. * An _SSA variable_, as defined in the literature, is effectively the pair of @@ -27,22 +30,22 @@ library class StandardSSA extends SSAHelper { * statically seen to be unreachable. */ class SsaDefinition extends ControlFlowNodeBase { - SsaDefinition() { exists(StandardSSA x | x.ssa_defn(_, this, _, _)) } + SsaDefinition() { exists(StandardSsa x | x.ssa_defn(_, this, _, _)) } /** * Gets a variable corresponding to an SSA StackVariable defined by * this definition. */ - StackVariable getAVariable() { exists(StandardSSA x | x.ssa_defn(result, this, _, _)) } + StackVariable getAVariable() { exists(StandardSsa x | x.ssa_defn(result, this, _, _)) } /** * Gets a string representation of the SSA variable represented by the pair * `(this, v)`. */ - string toString(StackVariable v) { exists(StandardSSA x | result = x.toString(this, v)) } + string toString(StackVariable v) { exists(StandardSsa x | result = x.toString(this, v)) } /** Gets a use of the SSA variable represented by the pair `(this, v)`. */ - VariableAccess getAUse(StackVariable v) { exists(StandardSSA x | result = x.getAUse(this, v)) } + VariableAccess getAUse(StackVariable v) { exists(StandardSsa x | result = x.getAUse(this, v)) } /** * Gets the control-flow node for this definition. This will usually be the @@ -62,7 +65,7 @@ class SsaDefinition extends ControlFlowNodeBase { BasicBlock getBasicBlock() { result.contains(this.getDefinition()) } /** Holds if this definition is a phi node for variable `v`. */ - predicate isPhiNode(StackVariable v) { exists(StandardSSA x | x.phi_node(v, this)) } + predicate isPhiNode(StackVariable v) { exists(StandardSsa x | x.phi_node(v, this)) } /** Gets the location of this definition. */ Location getLocation() { result = this.(ControlFlowNode).getLocation() } @@ -124,7 +127,7 @@ class SsaDefinition extends ControlFlowNodeBase { /** Holds if `(this, v)` reaches the end of basic block `b`. */ predicate reachesEndOfBB(StackVariable v, BasicBlock b) { - exists(StandardSSA x | x.ssaDefinitionReachesEndOfBB(v, this, b)) + exists(StandardSsa x | x.ssaDefinitionReachesEndOfBB(v, this, b)) } /** @@ -147,15 +150,4 @@ class SsaDefinition extends ControlFlowNodeBase { Expr getAnUltimateDefiningValue(StackVariable v) { result = this.getAnUltimateSsaDefinition(v).getDefiningValue(v) } - - /** - * DEPRECATED: this is the old name for `getAnUltimateDefiningValue`. The - * name was confusing as it seemed analogous to `getDefinition` rather than - * `getDefiningValue`. The SSA libraries for other languages use the name - * `getAnUltimateSsaDefinition` to refer to a predicate named - * `getAnUltimateSsaDefinition` in this class. - */ - deprecated Expr getAnUltimateDefinition(StackVariable v) { - result = this.getAnUltimateDefiningValue(v) - } } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll index b7d0742fac6..2252864c249 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll @@ -114,10 +114,10 @@ private predicate live_at_exit_of_bb(StackVariable v, BasicBlock b) { /** Common SSA logic for standard SSA and range-analysis SSA. */ cached -library class SSAHelper extends int { +library class SsaHelper extends int { /* 0 = StandardSSA, 1 = RangeSSA */ cached - SSAHelper() { this in [0 .. 1] } + SsaHelper() { this in [0 .. 1] } /** * Override to insert a custom phi node for variable `v` at the start of @@ -311,3 +311,6 @@ library class SSAHelper extends int { ssa_use(v, result, _, _) } } + +/** DEPRECATED: Alias for SsaHelper */ +deprecated class SSAHelper = SsaHelper; diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll index 7b5fcd504b1..373ab8b79e2 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll @@ -80,7 +80,11 @@ abstract class StackVariableReachability extends string { j > i and sink = bb.getNode(j) and this.isSink(sink, v) and - not exists(int k | this.isBarrier(bb.getNode(k), v) | k in [i + 1 .. j - 1]) + not exists(int k, ControlFlowNode node | + node = bb.getNode(k) and this.isBarrier(pragma[only_bind_into](node), v) + | + k in [i + 1 .. j - 1] + ) ) or not exists(int k | this.isBarrier(bb.getNode(k), v) | k > i) and 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 ca1964a43c3..25fdba90d52 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll @@ -447,26 +447,6 @@ private predicate skipInitializer(Initializer init) { ) } -/** - * Holds if `e` is an expression in a static initializer that must be evaluated - * at run time. This predicate computes "is non-const" instead of "is const" in - * order to avoid recursion through forall. - */ -private predicate runtimeExprInStaticInitializer(Expr e) { - inStaticInitializer(e) and - if e instanceof AggregateLiteral - then runtimeExprInStaticInitializer(e.getAChild()) - else not e.getFullyConverted().isConstant() -} - -/** Holds if `e` is part of the initializer of a local static variable. */ -private predicate inStaticInitializer(Expr e) { - exists(LocalVariable local | - local.isStatic() and - e.getParent+() = local.getInitializer() - ) -} - /** * Gets the `i`th child of `n` in control-flow order, where the `i`-indexes are * contiguous, and the first index is 0. @@ -728,30 +708,33 @@ private predicate straightLineSparse(Node scope, int i, Node ni, Spec spec) { or scope = any(SwitchStmt s | + // SwitchStmt [-> init] -> expr i = -1 and ni = s and spec.isAt() or - i = 0 and ni = s.getExpr() and spec.isAround() + i = 0 and ni = s.getInitialization() and spec.isAround() + or + i = 1 and ni = s.getExpr() and spec.isAround() or // If the switch body is not a block then this step is skipped, and the // expression jumps directly to the cases. - i = 1 and ni = s.getStmt().(BlockStmt) and spec.isAt() + i = 2 and ni = s.getStmt().(BlockStmt) and spec.isAt() or - i = 2 and ni = s.getASwitchCase() and spec.isBefore() + i = 3 and ni = s.getASwitchCase() and spec.isBefore() or // If there is no default case, we can jump to after the block. Note: `i` // is same value as above. not s.getASwitchCase() instanceof DefaultCase and - i = 2 and + i = 3 and ni = s.getStmt() and spec.isAfter() or - i = 3 and /* BARRIER */ ni = s and spec.isBarrier() + i = 4 and /* BARRIER */ ni = s and spec.isBarrier() or - i = 4 and ni = s.getStmt() and spec.isAfter() + i = 5 and ni = s.getStmt() and spec.isAfter() or - i = 5 and ni = s and spec.isAroundDestructors() + i = 6 and ni = s and spec.isAroundDestructors() or - i = 6 and ni = s and spec.isAfter() + i = 7 and ni = s and spec.isAfter() ) or scope = @@ -856,8 +839,15 @@ private predicate subEdge(Pos p1, Node n1, Node n2, Pos p2) { p2.nodeAt(n2, f) ) or - // IfStmt -> condition ; { then, else } -> + // IfStmt -> [ init -> ] condition ; { then, else } -> exists(IfStmt s | + p1.nodeAt(n1, s) and + p2.nodeBefore(n2, s.getInitialization()) + or + p1.nodeAfter(n1, s.getInitialization()) and + p2.nodeBefore(n2, s.getCondition()) + or + not exists(s.getInitialization()) and p1.nodeAt(n1, s) and p2.nodeBefore(n2, s.getCondition()) or @@ -871,8 +861,15 @@ private predicate subEdge(Pos p1, Node n1, Node n2, Pos p2) { p2.nodeAfter(n2, s) ) or - // ConstexprIfStmt -> condition ; { then, else } -> // same as IfStmt + // ConstexprIfStmt -> [ init -> ] condition ; { then, else } -> // same as IfStmt exists(ConstexprIfStmt s | + p1.nodeAt(n1, s) and + p2.nodeBefore(n2, s.getInitialization()) + or + p1.nodeAfter(n1, s.getInitialization()) and + p2.nodeBefore(n2, s.getCondition()) + or + not exists(s.getInitialization()) and p1.nodeAt(n1, s) and p2.nodeBefore(n2, s.getCondition()) or @@ -973,7 +970,7 @@ private predicate subEdge(Pos p1, Node n1, Node n2, Pos p2) { private predicate subEdgeIncludingDestructors(Pos p1, Node n1, Node n2, Pos p2) { subEdge(p1, n1, n2, p2) or - // If `n1` has sub-nodes to accomodate destructors, but there are none to be + // If `n1` has sub-nodes to accommodate destructors, but there are none to be // called, connect the "before destructors" node directly to the "after // destructors" node. For performance, only do this when the nodes exist. exists(Pos afterDtors | afterDtors.isAfterDestructors() | subEdge(afterDtors, n1, _, _)) and @@ -1379,7 +1376,7 @@ private module Cached { * true-successors and false-successors. */ cached - predicate qlCFGSuccessor(Node n1, Node n2) { + predicate qlCfgSuccessor(Node n1, Node n2) { exists(Node memberNode, Pos memberPos | subEdgeIncludingDestructors(any(Pos at | at.isAt()), n1, memberNode, memberPos) and normalGroupMember(memberNode, memberPos, n2) @@ -1388,23 +1385,32 @@ private module Cached { conditionalSuccessor(n1, _, n2) } + /** DEPRECATED: Alias for qlCfgSuccessor */ + deprecated predicate qlCFGSuccessor = qlCfgSuccessor/2; + /** * Holds if `n2` is a control-flow node such that the control-flow * edge `(n1, n2)` may be taken when `n1` is an expression that is true. */ cached - predicate qlCFGTrueSuccessor(Node n1, Node n2) { + predicate qlCfgTrueSuccessor(Node n1, Node n2) { conditionalSuccessor(n1, true, n2) and not conditionalSuccessor(n1, false, n2) } + /** DEPRECATED: Alias for qlCfgTrueSuccessor */ + deprecated predicate qlCFGTrueSuccessor = qlCfgTrueSuccessor/2; + /** * Holds if `n2` is a control-flow node such that the control-flow * edge `(n1, n2)` may be taken when `n1` is an expression that is false. */ cached - predicate qlCFGFalseSuccessor(Node n1, Node n2) { + predicate qlCfgFalseSuccessor(Node n1, Node n2) { conditionalSuccessor(n1, false, n2) and not conditionalSuccessor(n1, true, n2) } + + /** DEPRECATED: Alias for qlCfgFalseSuccessor */ + deprecated predicate qlCFGFalseSuccessor = qlCfgFalseSuccessor/2; } diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll index a561771fe01..923533ee2fd 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll @@ -188,8 +188,8 @@ private predicate nonAnalyzableFunction(Function f) { */ private predicate impossibleFalseEdge(Expr condition, Node succ) { conditionAlwaysTrue(condition) and - qlCFGFalseSuccessor(condition, succ) and - not qlCFGTrueSuccessor(condition, succ) + qlCfgFalseSuccessor(condition, succ) and + not qlCfgTrueSuccessor(condition, succ) } /** @@ -197,8 +197,8 @@ private predicate impossibleFalseEdge(Expr condition, Node succ) { */ private predicate impossibleTrueEdge(Expr condition, Node succ) { conditionAlwaysFalse(condition) and - qlCFGTrueSuccessor(condition, succ) and - not qlCFGFalseSuccessor(condition, succ) + qlCfgTrueSuccessor(condition, succ) and + not qlCfgFalseSuccessor(condition, succ) } /** @@ -960,9 +960,9 @@ library class ConditionEvaluator extends ExprEvaluator { ConditionEvaluator() { this = 0 } override predicate interesting(Expr e) { - qlCFGFalseSuccessor(e, _) + qlCfgFalseSuccessor(e, _) or - qlCFGTrueSuccessor(e, _) + qlCfgTrueSuccessor(e, _) } } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll index 895bbdc7e22..e10eb8e15a5 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll @@ -20,10 +20,4 @@ import semmle.code.cpp.dataflow.DataFlow2 module TaintTracking { import semmle.code.cpp.dataflow.internal.tainttracking1.TaintTrackingImpl - private import semmle.code.cpp.dataflow.TaintTracking2 - - /** - * DEPRECATED: Use TaintTracking2::Configuration instead. - */ - deprecated class Configuration2 = TaintTracking2::Configuration; } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll index 50dcb8901ea..95b34f15dad 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll @@ -216,10 +216,9 @@ private module LambdaFlow { or // jump step exists(Node mid, DataFlowType t0 | - revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and + revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and toReturn = false and - toJump = true and - lastCall = TDataFlowCallNone() + toJump = true | jumpStepCached(node, mid) and t = t0 @@ -305,7 +304,7 @@ cached private module Cached { /** * If needed, call this predicate from `DataFlowImplSpecific.qll` in order to - * force a stage-dependency on the `DataFlowImplCommon.qll` stage and therby + * force a stage-dependency on the `DataFlowImplCommon.qll` stage and thereby * collapsing the two stages. */ cached @@ -326,7 +325,10 @@ private module Cached { predicate jumpStepCached(Node node1, Node node2) { jumpStep(node1, node2) } cached - predicate clearsContentCached(Node n, Content c) { clearsContent(n, c) } + predicate clearsContentCached(Node n, ContentSet c) { clearsContent(n, c) } + + cached + predicate expectsContentCached(Node n, ContentSet c) { expectsContent(n, c) } cached predicate isUnreachableInCallCached(Node n, DataFlowCall call) { isUnreachableInCall(n, call) } @@ -373,7 +375,7 @@ private module Cached { // For reads, `x.f`, we want to check that the tracked type after the read (which // is obtained by popping the head of the access path stack) is compatible with // the type of `x.f`. - read(_, _, n) + readSet(_, _, n) } cached @@ -469,7 +471,7 @@ private module Cached { // read exists(Node mid | parameterValueFlowCand(p, mid, false) and - read(mid, _, node) and + readSet(mid, _, node) and read = true ) or @@ -657,8 +659,10 @@ private module Cached { * Holds if `arg` flows to `out` through a call using only * value-preserving steps and a single read step, not taking call * contexts into account, thus representing a getter-step. + * + * This predicate is exposed for testing only. */ - predicate getterStep(ArgNode arg, Content c, Node out) { + predicate getterStep(ArgNode arg, ContentSet c, Node out) { argumentValueFlowsThrough(arg, TReadStepTypesSome(_, c, _), out) } @@ -781,8 +785,12 @@ private module Cached { parameterValueFlow(p, n.getPreUpdateNode(), TReadStepTypesNone()) } - private predicate store( - Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + cached + predicate readSet(Node node1, ContentSet c, Node node2) { readStep(node1, c, node2) } + + cached + predicate storeSet( + Node node1, ContentSet c, Node node2, DataFlowType contentType, DataFlowType containerType ) { storeStep(node1, c, node2) and contentType = getNodeDataFlowType(node1) and @@ -794,14 +802,19 @@ private module Cached { | argumentValueFlowsThrough(n2, TReadStepTypesSome(containerType, c, contentType), n1) or - read(n2, c, n1) and + readSet(n2, c, n1) and contentType = getNodeDataFlowType(n1) and containerType = getNodeDataFlowType(n2) ) } - cached - predicate read(Node node1, Content c, Node node2) { readStep(node1, c, node2) } + private predicate store( + Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + ) { + exists(ContentSet cs | + c = cs.getAStoreContent() and storeSet(node1, cs, node2, contentType, containerType) + ) + } /** * Holds if data can flow from `node1` to `node2` via a direct assignment to @@ -932,16 +945,16 @@ class CastingNode extends Node { } private predicate readStepWithTypes( - Node n1, DataFlowType container, Content c, Node n2, DataFlowType content + Node n1, DataFlowType container, ContentSet c, Node n2, DataFlowType content ) { - read(n1, c, n2) and + readSet(n1, c, n2) and container = getNodeDataFlowType(n1) and content = getNodeDataFlowType(n2) } private newtype TReadStepTypesOption = TReadStepTypesNone() or - TReadStepTypesSome(DataFlowType container, Content c, DataFlowType content) { + TReadStepTypesSome(DataFlowType container, ContentSet c, DataFlowType content) { readStepWithTypes(_, container, c, _, content) } @@ -950,7 +963,7 @@ private class ReadStepTypesOption extends TReadStepTypesOption { DataFlowType getContainerType() { this = TReadStepTypesSome(result, _, _) } - Content getContent() { this = TReadStepTypesSome(_, result, _) } + ContentSet getContent() { this = TReadStepTypesSome(_, result, _) } DataFlowType getContentType() { this = TReadStepTypesSome(_, _, result) } @@ -1325,8 +1338,6 @@ abstract class AccessPathFront extends TAccessPathFront { abstract boolean toBoolNonEmpty(); TypedContent getHead() { this = TFrontHead(result) } - - predicate isClearedAt(Node n) { clearsContentCached(n, this.getHead().getContent()) } } class AccessPathFrontNil extends AccessPathFront, TFrontNil { diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll index 0a44ec3336b..9ad3e835c38 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll @@ -198,6 +198,12 @@ predicate clearsContent(Node n, Content c) { none() // stub implementation } +/** + * Holds if the value that is being tracked is expected to be stored inside content `c` + * at node `n`. + */ +predicate expectsContent(Node n, ContentSet c) { none() } + /** Gets the type of `n` used for type pruning. */ Type getNodeType(Node n) { suppressUnusedNode(n) and 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 ed3eadca08f..af74d307cca 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll @@ -821,6 +821,34 @@ private class CollectionContent extends Content, TCollectionContent { override string toString() { result = "" } } +/** + * An entity that represents a set of `Content`s. + * + * The set may be interpreted differently depending on whether it is + * stored into (`getAStoreContent`) or read from (`getAReadContent`). + */ +class ContentSet instanceof Content { + /** Gets a content that may be stored into when storing into this set. */ + Content getAStoreContent() { result = this } + + /** Gets a content that may be read from when reading from this set. */ + Content getAReadContent() { result = this } + + /** Gets a textual representation of this content set. */ + string toString() { result = super.toString() } + + /** + * 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`. + * 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) + } +} + /** * A guard that validates some expression. * diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll index c2fe9815836..34b2ef5aaf9 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll @@ -113,10 +113,6 @@ private module PartialDefinitions { abstract class PartialDefinition extends Expr { ControlFlowNode node; - abstract deprecated predicate partiallyDefines(Variable v); - - abstract deprecated predicate partiallyDefinesThis(ThisExpr e); - /** * Gets the subBasicBlock where this `PartialDefinition` is defined. */ @@ -189,10 +185,6 @@ private module PartialDefinitions { ) } - deprecated override predicate partiallyDefines(Variable v) { v = collection } - - deprecated override predicate partiallyDefinesThis(ThisExpr e) { none() } - override predicate definesExpressions(Expr inner, Expr outer) { inner = innerDefinedExpr and outer = this @@ -217,12 +209,6 @@ private module PartialDefinitions { VariablePartialDefinition() { innerDefinedExpr = getInnerDefinedExpr(this, node) } - deprecated override predicate partiallyDefines(Variable v) { - innerDefinedExpr = v.getAnAccess() - } - - deprecated override predicate partiallyDefinesThis(ThisExpr e) { innerDefinedExpr = e } - /** * Holds if this partial definition may modify `inner` (or what it points * to) through `outer`. These expressions will never be `Conversion`s. @@ -563,7 +549,7 @@ module FlowVar_internal { bb = this.(Loop).getStmt() and v = this.getARelevantVariable() or - this.reachesWithoutAssignment(bb.getAPredecessor(), v) and + this.reachesWithoutAssignment(pragma[only_bind_out](bb.getAPredecessor()), v) and this.bbInLoop(bb) ) and not assignsToVar(bb, v) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll index 065fae8aa70..fd03220c183 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll @@ -226,13 +226,6 @@ class AssignPointerSubExpr extends AssignOperation, @assignpsubexpr { * ``` */ class ConditionDeclExpr extends Expr, @condition_decl { - /** - * DEPRECATED: Use `getVariableAccess()` or `getInitializingExpr()` instead. - * - * Gets the access using the condition for this declaration. - */ - deprecated Expr getExpr() { result = this.getChild(0) } - override string getAPrimaryQlClass() { result = "ConditionDeclExpr" } /** diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll index dcbedde4475..309d98cd694 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll @@ -118,11 +118,6 @@ class BuiltInNoOp extends BuiltInOperation, @noopexpr { override string getAPrimaryQlClass() { result = "BuiltInNoOp" } } -/** - * DEPRECATED: Use `BuiltInOperationBuiltInOffsetOf` instead. - */ -deprecated class BuiltInOperationOffsetOf = BuiltInOperationBuiltInOffsetOf; - /** * A C/C++ `__builtin_offsetof` built-in operation (used by some implementations * of `offsetof`). The operation retains its semantics even in the presence @@ -465,11 +460,6 @@ class BuiltInOperationIsUnion extends BuiltInOperation, @isunionexpr { override string getAPrimaryQlClass() { result = "BuiltInOperationIsUnion" } } -/** - * DEPRECATED: Use `BuiltInOperationBuiltInTypesCompatibleP` instead. - */ -deprecated class BuiltInOperationBuiltInTypes = BuiltInOperationBuiltInTypesCompatibleP; - /** * A C++ `__builtin_types_compatible_p` built-in operation (used by some * implementations of the `` header). diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll index 701cfbfd636..3cb8946c198 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll @@ -666,13 +666,6 @@ class TypeidOperator extends Expr, @type_id { */ Type getResultType() { typeid_bind(underlyingElement(this), unresolveElement(result)) } - /** - * DEPRECATED: Use `getResultType()` instead. - * - * Gets the type that is returned by this typeid expression. - */ - deprecated Type getSpecifiedType() { result = this.getResultType() } - override string getAPrimaryQlClass() { result = "TypeidOperator" } /** @@ -731,13 +724,6 @@ class SizeofExprOperator extends SizeofOperator { /** Gets the contained expression. */ Expr getExprOperand() { result = this.getChild(0) } - /** - * DEPRECATED: Use `getExprOperand()` instead - * - * Gets the contained expression. - */ - deprecated Expr getExpr() { result = this.getExprOperand() } - override string toString() { result = "sizeof()" } override predicate mayBeImpure() { this.getExprOperand().mayBeImpure() } @@ -759,13 +745,6 @@ class SizeofTypeOperator extends SizeofOperator { /** Gets the contained type. */ Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } - /** - * DEPRECATED: Use `getTypeOperand()` instead - * - * Gets the contained type. - */ - deprecated Type getSpecifiedType() { result = this.getTypeOperand() } - override string toString() { result = "sizeof(" + this.getTypeOperand().getName() + ")" } override predicate mayBeImpure() { none() } @@ -794,11 +773,6 @@ class AlignofExprOperator extends AlignofOperator { */ Expr getExprOperand() { result = this.getChild(0) } - /** - * DEPRECATED: Use `getExprOperand()` instead. - */ - deprecated Expr getExpr() { result = this.getExprOperand() } - override string toString() { result = "alignof()" } } @@ -814,11 +788,6 @@ class AlignofTypeOperator extends AlignofOperator { /** Gets the contained type. */ Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } - /** - * DEPRECATED: Use `getTypeOperand()` instead. - */ - deprecated Type getSpecifiedType() { result = this.getTypeOperand() } - override string toString() { result = "alignof(" + this.getTypeOperand().getName() + ")" } } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll b/cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll index 5ae0155fdb3..2c6387f1844 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll @@ -48,16 +48,6 @@ class NEExpr extends EqualityOperation, @neexpr { class RelationalOperation extends ComparisonOperation, @rel_op_expr { override int getPrecedence() { result = 10 } - /** - * DEPRECATED: Use `getGreaterOperand()` instead. - */ - deprecated Expr getLarge() { result = getGreaterOperand() } - - /** - * DEPRECATED: Use `getLesserOperand()` instead. - */ - deprecated Expr getSmall() { result = getLesserOperand() } - /** * Gets the operand on the "greater" (or "greater-or-equal") side * of this relational expression, that is, the side that is larger diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll index a10a94f357d..14399078231 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll @@ -114,13 +114,6 @@ class Expr extends StmtParent, @expr { */ Type getUnspecifiedType() { result = this.getType().getUnspecifiedType() } - /** - * Gets an integer indicating the type of expression that this represents. - * - * DEPRECATED: use the subclasses of `Expr` rather than relying on this predicate. - */ - deprecated int getKind() { exprs(underlyingElement(this), result, _) } - /** Gets a textual representation of this expression. */ override string toString() { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll index 18ca03740ac..93609763ec3 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll @@ -164,16 +164,6 @@ class HexLiteral extends Literal { class AggregateLiteral extends Expr, @aggregateliteral { override string getAPrimaryQlClass() { result = "AggregateLiteral" } - /** - * DEPRECATED: Use ClassAggregateLiteral.getFieldExpr() instead. - * - * Gets the expression within the aggregate literal that is used to initialise field `f`, - * if this literal is being used to initialise a class/struct instance. - */ - deprecated Expr getCorrespondingExpr(Field f) { - result = this.(ClassAggregateLiteral).getFieldExpr(f) - } - override predicate mayBeImpure() { this.getAChild().mayBeImpure() } override predicate mayBeGloballyImpure() { this.getAChild().mayBeGloballyImpure() } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/ObjectiveC.qll b/cpp/ql/lib/semmle/code/cpp/exprs/ObjectiveC.qll deleted file mode 100644 index c651ae9b153..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/exprs/ObjectiveC.qll +++ /dev/null @@ -1,297 +0,0 @@ -/** - * DEPRECATED: Objective-C is no longer supported. - */ - -import semmle.code.cpp.exprs.Expr -import semmle.code.cpp.Class -import semmle.code.cpp.ObjectiveC -private import semmle.code.cpp.internal.ResolveClass - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C message expression, for example `[myColor changeColorToRed:5.0 green:2.0 blue:6.0]`. - */ -deprecated class MessageExpr extends Expr, Call { - MessageExpr() { none() } - - override string toString() { none() } - - /** - * Gets the selector of this message expression, for example `-changeColorToRed:green:blue:`. - */ - string getSelector() { none() } - - /** - * Gets the function invoked by this message expression, as inferred by the compiler. - * - * If the compiler could infer the type of the receiver, and that type had a method - * whose name matched the selector, then the result of this predicate is said method. - * Otherwise this predicate has no result. - * - * In all cases, actual function dispatch isn't performed until runtime, but the - * lack of a static target is often cause for concern. - */ - MemberFunction getStaticTarget() { none() } - - /** - * Provided for compatibility with Call. It is the same as the static target. - */ - override MemberFunction getTarget() { none() } - - /** - * Holds if the compiler could infer a function as the target of this message. - * - * In all cases, actual function dispatch isn't performed until runtime, but the - * lack of a static target is often cause for concern. - */ - predicate hasStaticTarget() { none() } - - /** - * Gets the number of arguments passed by this message expression. - * - * In most cases, this equals the number of colons in the selector, but this needn't be the - * case for variadic methods like "-initWithFormat:", which can have more than one argument. - */ - override int getNumberOfArguments() { none() } - - /** - * Gets an argument passed by this message expression. - */ - override Expr getAnArgument() { none() } - - /** - * Gets the nth argument passed by this message expression. - * - * The range of `n` is [`0` .. `getNumberOfArguments()`]. - */ - override Expr getArgument(int n) { none() } - - override int getPrecedence() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C message expression whose receiver is `super`, for example `[super init]`. - */ -deprecated class SuperMessageExpr extends MessageExpr { - SuperMessageExpr() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C message expression whose receiver is the name of a class, and - * is therefore calling a class method rather than an instance method. This occurs - * most commonly for the "+alloc", "+new", and "+class" selectors. - */ -deprecated class ClassMessageExpr extends MessageExpr { - ClassMessageExpr() { none() } - - /** - * Gets the class which is the receiver of this message. - */ - Type getReceiver() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C message expression whose receiver is an expression (which includes the - * common case of the receiver being "self"). - */ -deprecated class ExprMessageExpr extends MessageExpr { - ExprMessageExpr() { none() } - - /** - * Gets the expression which gives the receiver of this message. - */ - Expr getReceiver() { none() } - - /** - * Gets the Objective C class of which the receiving expression is an instance. - * - * If the receiving expression has type `id` or type `id

` for some protocol `P`, - * then there will be no result. If the receiving expression has type `C*` or type - * `C

*` for some protocol `P`, then the result will be the type `C`. - */ - ObjectiveClass getReceiverClass() { none() } - - /** - * Gets the Objective C classes and/or protocols which are statically implemented - * by the receiving expression. - * - * If the receiving expression has type `id`, then there will be no result. - * If the receiving expression has type `id

`, then `P` will be the sole result. - * If the receiving expression has type `C*`, then `C` will be the sole result. - * If the receiving expression has type `C

*`, then `C` and `P` will both be results. - */ - Class getAReceiverClassOrProtocol() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An access to an Objective C property using dot syntax. - * - * Such accesses are de-sugared into a message expression to the property's getter or setter. - */ -deprecated class PropertyAccess extends ExprMessageExpr { - PropertyAccess() { none() } - - /** - * Gets the property being accessed by this expression. - */ - Property getProperty() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@selector` expression, for example `@selector(driveForDistance:)`. - */ -deprecated class AtSelectorExpr extends Expr { - AtSelectorExpr() { none() } - - override string toString() { none() } - - /** - * Gets the selector of this `@selector` expression, for example `driveForDistance:`. - */ - string getSelector() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@protocol` expression, for example `@protocol(SomeProtocol)`. - */ -deprecated class AtProtocolExpr extends Expr { - AtProtocolExpr() { none() } - - override string toString() { none() } - - /** - * Gets the protocol of this `@protocol` expression, for example `SomeProtocol`. - */ - Protocol getProtocol() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C `@encode` expression, for example `@encode(int *)`. - */ -deprecated class AtEncodeExpr extends Expr { - AtEncodeExpr() { none() } - - override string toString() { none() } - - /** - * Gets the type this `@encode` expression encodes, for example `int *`. - */ - Type getEncodedType() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C throw expression. - */ -deprecated class ObjcThrowExpr extends ThrowExpr { - ObjcThrowExpr() { none() } - - override string toString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C throw expression with no argument (which causes the - * current exception to be re-thrown). - */ -deprecated class ObjcReThrowExpr extends ReThrowExpr, ObjcThrowExpr { - ObjcReThrowExpr() { none() } - - override string toString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C @ expression which boxes a single value, such as @(22). - */ -deprecated class AtExpr extends UnaryOperation { - AtExpr() { none() } - - override string toString() { none() } - - override string getOperator() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C @[...] literal. - */ -deprecated class ArrayLiteral extends Expr { - ArrayLiteral() { none() } - - /** Gets a textual representation of this array literal. */ - override string toString() { none() } - - /** An element of the array */ - Expr getElement(int i) { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C @{...} literal. - */ -deprecated class DictionaryLiteral extends Expr { - DictionaryLiteral() { none() } - - /** Gets a textual representation of this dictionary literal. */ - override string toString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C @"..." string literal. - */ -deprecated class ObjCLiteralString extends TextLiteral { - ObjCLiteralString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C/C++ overloaded subscripting access expression. - * - * Either - * obj[idx] - * or - * obj[idx] = expr - */ -deprecated class SubscriptExpr extends Expr { - SubscriptExpr() { none() } - - /** - * Gets the object expression being subscripted. - */ - Expr getSubscriptBase() { none() } - - /** - * Gets the expression giving the index into the object. - */ - Expr getSubscriptIndex() { none() } - - /** - * Gets the expression being assigned (if this is an assignment). - */ - Expr getAssignedExpr() { none() } - - override string toString() { none() } -} - -/** - * DEPRECATED: Objective-C is no longer supported. - * An Objective C _cmd expression. - */ -deprecated class CmdExpr extends Expr { - CmdExpr() { none() } - - override string toString() { none() } - - override predicate mayBeImpure() { none() } - - override predicate mayBeGloballyImpure() { none() } -} diff --git a/cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll b/cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll index 5a12af29694..8698b47ff63 100644 --- a/cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll +++ b/cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll @@ -39,19 +39,6 @@ class CorrectIncludeGuard extends IncludeGuardedHeader { PreprocessorEndif getEndif() { correctIncludeGuard(this, _, _, result, _) } } -/** - * DEPRECATED: no longer useful. - */ -deprecated class NotIncludedGuard extends IncludeGuardedHeader { - NotIncludedGuard() { none() } - - /** Gets the `#ifndef` directive used to prevent multiple inclusion of this file. */ - PreprocessorIfndef getIfndef() { result.getFile() = this } - - /** Gets the `#endif` directive closing this file. */ - PreprocessorEndif getEndif() { result.getFile() = this } -} - /** * A file with no code in it. */ diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll index 6b6b2e02c80..be5403734ce 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll @@ -129,11 +129,11 @@ private class FromGlobalVarTaintTrackingCfg extends TaintTracking2::Configuratio } private predicate readsVariable(LoadInstruction load, Variable var) { - load.getSourceAddress().(VariableAddressInstruction).getASTVariable() = var + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var } private predicate writesVariable(StoreInstruction store, Variable var) { - store.getDestinationAddress().(VariableAddressInstruction).getASTVariable() = var + store.getDestinationAddress().(VariableAddressInstruction).getAstVariable() = var } /** @@ -241,8 +241,8 @@ private module Cached { // For compatibility, send flow from arguments to parameters, even for // functions with no body. exists(FunctionCall call, int i | - sink.asExpr() = call.getArgument(i) and - result = resolveCall(call).getParameter(i) + sink.asExpr() = call.getArgument(pragma[only_bind_into](i)) and + result = resolveCall(call).getParameter(pragma[only_bind_into](i)) ) or // For compatibility, send flow into a `Variable` if there is flow to any @@ -489,9 +489,9 @@ module TaintedWithPath { /** Gets the element that `pathNode` wraps, if any. */ Element getElementFromPathNode(PathNode pathNode) { exists(DataFlow::Node node | node = pathNode.(WrapPathNode).inner().getNode() | - result = node.asInstruction().getAST() + result = node.asInstruction().getAst() or - result = node.asOperand().getDef().getAST() + result = node.asOperand().getDef().getAst() ) or result = pathNode.(EndpointPathNode).inner() diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/MustFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/MustFlow.qll new file mode 100644 index 00000000000..1f3ea2a4d3d --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/MustFlow.qll @@ -0,0 +1,270 @@ +/** + * This file provides a library for inter-procedural must-flow data flow analysis. + * Unlike `DataFlow.qll`, the analysis provided by this file checks whether data _must_ flow + * from a source to a _sink_. + */ + +private import cpp +import semmle.code.cpp.ir.dataflow.DataFlow +private import semmle.code.cpp.ir.IR + +/** + * A configuration of a data flow analysis that performs must-flow analysis. This is different + * from `DataFlow.qll` which performs may-flow analysis (i.e., it finds paths where the source _may_ + * flow to the sink). + * + * Like in `DataFlow.qll`, each use of the `MustFlow.qll` library must define its own unique extension + * of this abstract class. To create a configuration, extend this class with a subclass whose + * characteristic predicate is a unique singleton string and override `isSource`, `isSink` (and + * `isAdditionalFlowStep` if additional steps are required). + */ +abstract class MustFlowConfiguration extends string { + bindingset[this] + MustFlowConfiguration() { any() } + + /** + * Holds if `source` is a relevant data flow source. + */ + abstract predicate isSource(DataFlow::Node source); + + /** + * Holds if `sink` is a relevant data flow sink. + */ + abstract predicate isSink(DataFlow::Node sink); + + /** + * Holds if the additional flow step from `node1` to `node2` must be taken + * into account in the analysis. + */ + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { none() } + + /** + * Holds if data must flow from `source` to `sink` for this configuration. + * + * The corresponding paths are generated from the end-points and the graph + * included in the module `PathGraph`. + */ + final predicate hasFlowPath(MustFlowPathNode source, MustFlowPathSink sink) { + this.isSource(source.getNode()) and + source.getASuccessor+() = sink + } +} + +/** Holds if `node` flows from a source. */ +pragma[nomagic] +private predicate flowsFromSource(DataFlow::Node node, MustFlowConfiguration config) { + config.isSource(node) + or + exists(DataFlow::Node mid | + step(mid, node, config) and + flowsFromSource(mid, pragma[only_bind_into](config)) + ) +} + +/** Holds if `node` flows to a sink. */ +pragma[nomagic] +private predicate flowsToSink(DataFlow::Node node, MustFlowConfiguration config) { + flowsFromSource(node, pragma[only_bind_into](config)) and + ( + config.isSink(node) + or + exists(DataFlow::Node mid | + step(node, mid, config) and + flowsToSink(mid, pragma[only_bind_into](config)) + ) + ) +} + +cached +private module Cached { + /** Holds if `p` is the `n`'th parameter of the non-virtual function `f`. */ + private predicate parameterOf(Parameter p, Function f, int n) { + not f.isVirtual() and f.getParameter(n) = p + } + + /** + * Holds if `instr` is the `n`'th argument to a call to the non-virtual function `f`, and + * `init` is the corresponding initialization instruction that receives the value of `instr` in `f`. + */ + private predicate flowIntoParameter( + Function f, int n, CallInstruction call, Instruction instr, InitializeParameterInstruction init + ) { + not f.isVirtual() and + call.getPositionalArgument(n) = instr and + f = call.getStaticCallTarget() and + getEnclosingNonVirtualFunctionInitializeParameter(init, f) and + init.getParameter().getIndex() = pragma[only_bind_into](pragma[only_bind_out](n)) + } + + /** + * Holds if `instr` is an argument to a call to the function `f`, and `init` is the + * corresponding initialization instruction that receives the value of `instr` in `f`. + */ + pragma[noinline] + private predicate getPositionalArgumentInitParam( + CallInstruction call, Instruction instr, InitializeParameterInstruction init, Function f + ) { + exists(int n | + parameterOf(_, f, n) and + flowIntoParameter(f, pragma[only_bind_into](pragma[only_bind_out](n)), call, instr, init) + ) + } + + /** + * Holds if `instr` is the qualifier to a call to the non-virtual function `f`, and + * `init` is the corresponding initialization instruction that receives the value of + * `instr` in `f`. + */ + pragma[noinline] + private predicate getThisArgumentInitParam( + CallInstruction call, Instruction instr, InitializeParameterInstruction init, Function f + ) { + not f.isVirtual() and + call.getStaticCallTarget() = f and + getEnclosingNonVirtualFunctionInitializeParameter(init, f) and + call.getThisArgument() = instr and + init.getIRVariable() instanceof IRThisVariable + } + + /** Holds if `f` is the enclosing non-virtual function of `init`. */ + private predicate getEnclosingNonVirtualFunctionInitializeParameter( + InitializeParameterInstruction init, Function f + ) { + not f.isVirtual() and + init.getEnclosingFunction() = f + } + + /** Holds if `f` is the enclosing non-virtual function of `init`. */ + private predicate getEnclosingNonVirtualFunctionInitializeIndirection( + InitializeIndirectionInstruction init, Function f + ) { + not f.isVirtual() and + init.getEnclosingFunction() = f + } + + /** + * Holds if `instr` is an argument (or argument indirection) to a call, and + * `succ` is the corresponding initialization instruction in the call target. + */ + private predicate flowThroughCallable(Instruction argument, Instruction parameter) { + // Flow from an argument to a parameter + exists(CallInstruction call, InitializeParameterInstruction init | init = parameter | + getPositionalArgumentInitParam(call, argument, init, call.getStaticCallTarget()) + or + getThisArgumentInitParam(call, argument, init, call.getStaticCallTarget()) + ) + or + // Flow from argument indirection to parameter indirection + exists( + CallInstruction call, ReadSideEffectInstruction read, InitializeIndirectionInstruction init + | + init = parameter and + read.getPrimaryInstruction() = call and + getEnclosingNonVirtualFunctionInitializeIndirection(init, call.getStaticCallTarget()) + | + exists(int n | + read.getSideEffectOperand().getAnyDef() = argument and + read.getIndex() = pragma[only_bind_into](n) and + init.getParameter().getIndex() = pragma[only_bind_into](n) + ) + or + call.getThisArgument() = argument and + init.getIRVariable() instanceof IRThisVariable + ) + } + + private predicate instructionToOperandStep(Instruction instr, Operand operand) { + operand.getDef() = instr + } + + /** + * Holds if data flows from `operand` to `instr`. + * + * This predicate ignores flow through `PhiInstruction`s to create a 'must flow' relation. + */ + private predicate operandToInstructionStep(Operand operand, Instruction instr) { + instr.(CopyInstruction).getSourceValueOperand() = operand + or + instr.(ConvertInstruction).getUnaryOperand() = operand + or + instr.(CheckedConvertOrNullInstruction).getUnaryOperand() = operand + or + instr.(InheritanceConversionInstruction).getUnaryOperand() = operand + or + instr.(ChiInstruction).getTotalOperand() = operand + } + + cached + predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + instructionToOperandStep(nodeFrom.asInstruction(), nodeTo.asOperand()) + or + flowThroughCallable(nodeFrom.asInstruction(), nodeTo.asInstruction()) + or + operandToInstructionStep(nodeFrom.asOperand(), nodeTo.asInstruction()) + } +} + +/** Holds if `nodeFrom` flows to `nodeTo`. */ +private predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo, MustFlowConfiguration config) { + exists(config) and + Cached::step(nodeFrom, nodeTo) + or + config.isAdditionalFlowStep(nodeFrom, nodeTo) +} + +private newtype TLocalPathNode = + MkLocalPathNode(DataFlow::Node n, MustFlowConfiguration config) { + flowsToSink(n, config) and + ( + config.isSource(n) + or + exists(MustFlowPathNode mid | step(mid.getNode(), n, config)) + ) + } + +/** A `Node` that is in a path from a source to a sink. */ +class MustFlowPathNode extends TLocalPathNode { + DataFlow::Node n; + + MustFlowPathNode() { this = MkLocalPathNode(n, _) } + + /** Gets the underlying node. */ + DataFlow::Node getNode() { result = n } + + /** Gets a textual representation of this node. */ + string toString() { result = n.toString() } + + /** Gets the location of this element. */ + Location getLocation() { result = n.getLocation() } + + /** Gets a successor node, if any. */ + MustFlowPathNode getASuccessor() { + step(this.getNode(), result.getNode(), this.getConfiguration()) + } + + /** Gets the associated configuration. */ + MustFlowConfiguration getConfiguration() { this = MkLocalPathNode(_, result) } +} + +private class MustFlowPathSink extends MustFlowPathNode { + MustFlowPathSink() { this.getConfiguration().isSink(this.getNode()) } +} + +/** + * Provides the query predicates needed to include a graph in a path-problem query. + */ +module PathGraph { + private predicate reach(MustFlowPathNode n) { + n instanceof MustFlowPathSink or reach(n.getASuccessor()) + } + + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(MustFlowPathNode a, MustFlowPathNode b) { + a.getASuccessor() = b and reach(b) + } + + /** Holds if `n` is a node in the graph of data flow path explanations. */ + query predicate nodes(MustFlowPathNode n, string key, string val) { + reach(n) and key = "semmle.label" and val = n.toString() + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/ResolveCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/ResolveCall.qll index f25386d3ba8..bcf2fa8c7db 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/ResolveCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/ResolveCall.qll @@ -17,7 +17,7 @@ private import semmle.code.cpp.ir.IR */ Function resolveCall(Call call) { exists(CallInstruction callInstruction | - callInstruction.getAST() = call and + callInstruction.getAst() = call and result = viableCallable(callInstruction) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll index c95fcd3f574..7eada0bb244 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll @@ -20,10 +20,4 @@ import semmle.code.cpp.ir.dataflow.DataFlow2 module TaintTracking { import semmle.code.cpp.ir.dataflow.internal.tainttracking1.TaintTrackingImpl - private import semmle.code.cpp.ir.dataflow.TaintTracking2 - - /** - * DEPRECATED: Use TaintTracking2::Configuration instead. - */ - deprecated class Configuration2 = TaintTracking2::Configuration; } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll index 509ee01ec07..c0bdb656e0e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll @@ -116,12 +116,12 @@ private module VirtualDispatch { /** Holds if `addressInstr` is an instruction that produces the address of `var`. */ private predicate addressOfGlobal(Instruction addressInstr, GlobalOrNamespaceVariable var) { // Access directly to the global variable - addressInstr.(VariableAddressInstruction).getASTVariable() = var + addressInstr.(VariableAddressInstruction).getAstVariable() = var or // Access to a field on a global union exists(FieldAddressInstruction fa | fa = addressInstr and - fa.getObjectAddress().(VariableAddressInstruction).getASTVariable() = var and + fa.getObjectAddress().(VariableAddressInstruction).getAstVariable() = var and fa.getField().getDeclaringType() instanceof Union ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll index fb806910898..fb773ea89f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll index 50dcb8901ea..95b34f15dad 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll @@ -216,10 +216,9 @@ private module LambdaFlow { or // jump step exists(Node mid, DataFlowType t0 | - revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and + revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and toReturn = false and - toJump = true and - lastCall = TDataFlowCallNone() + toJump = true | jumpStepCached(node, mid) and t = t0 @@ -305,7 +304,7 @@ cached private module Cached { /** * If needed, call this predicate from `DataFlowImplSpecific.qll` in order to - * force a stage-dependency on the `DataFlowImplCommon.qll` stage and therby + * force a stage-dependency on the `DataFlowImplCommon.qll` stage and thereby * collapsing the two stages. */ cached @@ -326,7 +325,10 @@ private module Cached { predicate jumpStepCached(Node node1, Node node2) { jumpStep(node1, node2) } cached - predicate clearsContentCached(Node n, Content c) { clearsContent(n, c) } + predicate clearsContentCached(Node n, ContentSet c) { clearsContent(n, c) } + + cached + predicate expectsContentCached(Node n, ContentSet c) { expectsContent(n, c) } cached predicate isUnreachableInCallCached(Node n, DataFlowCall call) { isUnreachableInCall(n, call) } @@ -373,7 +375,7 @@ private module Cached { // For reads, `x.f`, we want to check that the tracked type after the read (which // is obtained by popping the head of the access path stack) is compatible with // the type of `x.f`. - read(_, _, n) + readSet(_, _, n) } cached @@ -469,7 +471,7 @@ private module Cached { // read exists(Node mid | parameterValueFlowCand(p, mid, false) and - read(mid, _, node) and + readSet(mid, _, node) and read = true ) or @@ -657,8 +659,10 @@ private module Cached { * Holds if `arg` flows to `out` through a call using only * value-preserving steps and a single read step, not taking call * contexts into account, thus representing a getter-step. + * + * This predicate is exposed for testing only. */ - predicate getterStep(ArgNode arg, Content c, Node out) { + predicate getterStep(ArgNode arg, ContentSet c, Node out) { argumentValueFlowsThrough(arg, TReadStepTypesSome(_, c, _), out) } @@ -781,8 +785,12 @@ private module Cached { parameterValueFlow(p, n.getPreUpdateNode(), TReadStepTypesNone()) } - private predicate store( - Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + cached + predicate readSet(Node node1, ContentSet c, Node node2) { readStep(node1, c, node2) } + + cached + predicate storeSet( + Node node1, ContentSet c, Node node2, DataFlowType contentType, DataFlowType containerType ) { storeStep(node1, c, node2) and contentType = getNodeDataFlowType(node1) and @@ -794,14 +802,19 @@ private module Cached { | argumentValueFlowsThrough(n2, TReadStepTypesSome(containerType, c, contentType), n1) or - read(n2, c, n1) and + readSet(n2, c, n1) and contentType = getNodeDataFlowType(n1) and containerType = getNodeDataFlowType(n2) ) } - cached - predicate read(Node node1, Content c, Node node2) { readStep(node1, c, node2) } + private predicate store( + Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + ) { + exists(ContentSet cs | + c = cs.getAStoreContent() and storeSet(node1, cs, node2, contentType, containerType) + ) + } /** * Holds if data can flow from `node1` to `node2` via a direct assignment to @@ -932,16 +945,16 @@ class CastingNode extends Node { } private predicate readStepWithTypes( - Node n1, DataFlowType container, Content c, Node n2, DataFlowType content + Node n1, DataFlowType container, ContentSet c, Node n2, DataFlowType content ) { - read(n1, c, n2) and + readSet(n1, c, n2) and container = getNodeDataFlowType(n1) and content = getNodeDataFlowType(n2) } private newtype TReadStepTypesOption = TReadStepTypesNone() or - TReadStepTypesSome(DataFlowType container, Content c, DataFlowType content) { + TReadStepTypesSome(DataFlowType container, ContentSet c, DataFlowType content) { readStepWithTypes(_, container, c, _, content) } @@ -950,7 +963,7 @@ private class ReadStepTypesOption extends TReadStepTypesOption { DataFlowType getContainerType() { this = TReadStepTypesSome(result, _, _) } - Content getContent() { this = TReadStepTypesSome(_, result, _) } + ContentSet getContent() { this = TReadStepTypesSome(_, result, _) } DataFlowType getContentType() { this = TReadStepTypesSome(_, _, result) } @@ -1325,8 +1338,6 @@ abstract class AccessPathFront extends TAccessPathFront { abstract boolean toBoolNonEmpty(); TypedContent getHead() { this = TFrontHead(result) } - - predicate isClearedAt(Node n) { clearsContentCached(n, this.getHead().getContent()) } } class AccessPathFrontNil extends AccessPathFront, TFrontNil { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index b065f400fa6..9dcd7f176df 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -279,6 +279,12 @@ predicate clearsContent(Node n, Content c) { none() // stub implementation } +/** + * Holds if the value that is being tracked is expected to be stored inside content `c` + * at node `n`. + */ +predicate expectsContent(Node n, ContentSet c) { none() } + /** Gets the type of `n` used for type pruning. */ IRType getNodeType(Node n) { suppressUnusedNode(n) and 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 75b530e937d..4171f5a5227 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 @@ -37,7 +37,7 @@ private module Cached { * along the chain of addresses computed by `StoreNodeInstr.getInner` to identify field writes * and call `storeStep` accordingly (i.e., for an expression like `a.b.c = x`, we visit `c`, then * `b`, then `a`). - * 2. Flow is transfered from a `WriteSideEffectInstruction` to a `StoreNodeOperand` after flow + * 2. Flow is transferred from a `WriteSideEffectInstruction` to a `StoreNodeOperand` after flow * returns to a caller. Flow will then proceed to the defining instruction of the operand (because * the `StoreNodeInstr` computed by `StoreNodeOperand.getInner()` is the `StoreNode` containing * the defining instruction), and then along the chain computed by `StoreNodeInstr.getInner` like @@ -158,14 +158,6 @@ class Node extends TIRDataFlowNode { */ Expr asPartialDefinition() { result = this.(PartialDefinitionNode).getDefinedExpr() } - /** - * DEPRECATED: See UninitializedNode. - * - * Gets the uninitialized local variable corresponding to this node, if - * any. - */ - deprecated LocalVariable asUninitialized() { none() } - /** * Gets an upper bound on the type of this node. */ @@ -439,7 +431,7 @@ class SsaPhiNode extends Node, TSsaPhiNode { SsaPhiNode() { this = TSsaPhiNode(phi) } - /* Get the phi node associated with this node. */ + /** Gets the phi node associated with this node. */ Ssa::PhiNode getPhiNode() { result = phi } override Declaration getEnclosingCallable() { result = this.getFunction() } @@ -560,22 +552,6 @@ class ParameterIndirectionNode extends ParameterNode { override string toString() { result = "*" + instr.getIRVariable().toString() } } -/** - * DEPRECATED: Data flow was never an accurate way to determine what - * expressions might be uninitialized. It errs on the side of saying that - * everything is uninitialized, and this is even worse in the IR because the IR - * doesn't use syntactic hints to rule out variables that are definitely - * initialized. - * - * The value of an uninitialized local variable, viewed as a node in a data - * flow graph. - */ -deprecated class UninitializedNode extends Node { - UninitializedNode() { none() } - - LocalVariable getLocalVariable() { none() } -} - /** * A node associated with an object after an operation that might have * changed its state. @@ -725,14 +701,6 @@ InstructionNode instructionNode(Instruction instr) { result.getInstruction() = i */ OperandNode operandNode(Operand operand) { result.getOperand() = operand } -/** - * DEPRECATED: use `definitionByReferenceNodeFromArgument` instead. - * - * Gets the `Node` corresponding to a definition by reference of the variable - * that is passed as `argument` of a call. - */ -deprecated DefinitionByReferenceNode definitionByReferenceNode(Expr e) { result.getArgument() = e } - /** * Gets the `Node` corresponding to the value of evaluating `e` or any of its * conversions. There is no result if `e` is a `Conversion`. For data flowing @@ -1095,6 +1063,34 @@ private class CollectionContent extends Content, TCollectionContent { override string toString() { result = "" } } +/** + * An entity that represents a set of `Content`s. + * + * The set may be interpreted differently depending on whether it is + * stored into (`getAStoreContent`) or read from (`getAReadContent`). + */ +class ContentSet instanceof Content { + /** Gets a content that may be stored into when storing into this set. */ + Content getAStoreContent() { result = this } + + /** Gets a content that may be read from when reading from this set. */ + Content getAReadContent() { result = this } + + /** Gets a textual representation of this content set. */ + string toString() { result = super.toString() } + + /** + * 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`. + * 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) + } +} + /** * A guard that validates some instruction. * diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll index 19bf1d4f27d..eed0d050735 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll @@ -287,20 +287,6 @@ private module SsaDefReaches { ) } - /** - * Holds if the SSA definition of `v` at `def` reaches uncertain SSA definition - * `redef` in the same basic block, without crossing another SSA definition of `v`. - */ - predicate ssaDefReachesUncertainDefWithinBlock( - SourceVariable v, Definition def, UncertainWriteDefinition redef - ) { - exists(BasicBlock bb, int rnk, int i | - ssaDefReachesRank(bb, def, rnk, v) and - rnk = ssaRefRank(bb, i, v, SsaDef()) - 1 and - redef.definesAt(v, bb, i) - ) - } - /** * Same as `ssaRefRank()`, but restricted to a particular SSA definition `def`. */ diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } 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 32e36bb6787..91e1fe03e23 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll @@ -67,7 +67,7 @@ class DefaultEdge extends EdgeKind, TDefaultEdge { /** * A "case" edge, representing the successor of a `Switch` instruction when the - * the condition value matches a correponding `case` label. + * the condition value matches a corresponding `case` label. */ class CaseEdge extends EdgeKind, TCaseEdge { string minValue; 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 82db3146630..bac7634cbd0 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 @@ -161,8 +161,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock dominanceFrontier() { - this.dominates(result.getAPredecessor()) and - not this.strictlyDominates(result) + this.getASuccessor() = result and + not this.immediatelyDominates(result) + or + exists(IRBlock prev | result = prev.dominanceFrontier() | + this.immediatelyDominates(prev) and + not this.immediatelyDominates(result) + ) } /** @@ -201,8 +206,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock postDominanceFrontier() { - this.postDominates(result.getASuccessor()) and - not this.strictlyPostDominates(result) + this.getAPredecessor() = result and + not this.immediatelyPostDominates(result) + or + exists(IRBlock prev | result = prev.postDominanceFrontier() | + this.immediatelyPostDominates(prev) and + not this.immediatelyPostDominates(result) + ) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll index 146fc270738..ca4708857a7 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll @@ -55,7 +55,10 @@ class IRVariable extends TIRVariable { * Gets the AST node that declared this variable, or that introduced this * variable as part of the AST-to-IR translation. */ - Language::AST getAST() { none() } + Language::AST getAst() { none() } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = getAst() } /** * Gets an identifier string for the variable. This identifier is unique @@ -66,7 +69,7 @@ class IRVariable extends TIRVariable { /** * Gets the source location of this variable. */ - final Language::Location getLocation() { result = getAST().getLocation() } + final Language::Location getLocation() { result = getAst().getLocation() } /** * Gets the IR for the function that references this variable. @@ -90,7 +93,10 @@ class IRUserVariable extends IRVariable, TIRUserVariable { final override string toString() { result = getVariable().toString() } - final override Language::AST getAST() { result = var } + final override Language::AST getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } final override string getUniqueId() { result = getVariable().toString() + " " + getVariable().getLocation().toString() @@ -157,7 +163,10 @@ class IRGeneratedVariable extends IRVariable { final override Language::LanguageType getLanguageType() { result = type } - final override Language::AST getAST() { result = ast } + final override Language::AST getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } override string toString() { result = getBaseString() + getLocationString() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 1c2cc493338..e5a908bbf9a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -41,7 +41,7 @@ class Instruction extends Construction::TStageInstruction { } /** Gets a textual representation of this element. */ - final string toString() { result = this.getOpcode().toString() + ": " + this.getAST().toString() } + final string toString() { result = this.getOpcode().toString() + ": " + this.getAst().toString() } /** * Gets a string showing the result, opcode, and operands of the instruction, equivalent to what @@ -136,7 +136,7 @@ class Instruction extends Construction::TStageInstruction { string getResultId() { this.shouldGenerateDumpStrings() and result = - this.getResultPrefix() + this.getAST().getLocation().getStartLine() + "_" + this.getLineRank() + this.getResultPrefix() + this.getAst().getLocation().getStartLine() + "_" + this.getLineRank() } /** @@ -208,12 +208,15 @@ class Instruction extends Construction::TStageInstruction { /** * Gets the AST that caused this instruction to be generated. */ - final Language::AST getAST() { result = Construction::getInstructionAST(this) } + final Language::AST getAst() { result = Construction::getInstructionAst(this) } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Gets the location of the source code for this instruction. */ - final Language::Location getLocation() { result = this.getAST().getLocation() } + final Language::Location getLocation() { result = this.getAst().getLocation() } /** * Gets the `Expr` whose result is computed by this instruction, if any. The `Expr` may be a @@ -459,7 +462,10 @@ class VariableInstruction extends Instruction { /** * Gets the AST variable that this instruction's IR variable refers to, if one exists. */ - final Language::Variable getASTVariable() { result = var.(IRUserVariable).getVariable() } + final Language::Variable getAstVariable() { result = var.(IRUserVariable).getVariable() } + + /** DEPRECATED: Alias for getAstVariable */ + deprecated Language::Variable getASTVariable() { result = this.getAstVariable() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll index 89b82657c3b..c1e997d5844 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll @@ -18,7 +18,7 @@ private import internal.OperandInternal * of `TOperand` that are used in this stage. */ private class TStageOperand = - TRegisterOperand or TNonSSAMemoryOperand or TPhiOperand or TChiOperand; + TRegisterOperand or TNonSsaMemoryOperand or TPhiOperand or TChiOperand; /** * A known location. Testing `loc instanceof KnownLocation` will account for non existing locations, as @@ -38,7 +38,7 @@ class Operand extends TStageOperand { // Ensure that the operand does not refer to instructions from earlier stages that are unreachable here exists(Instruction use, Instruction def | this = registerOperand(use, _, def)) or - exists(Instruction use | this = nonSSAMemoryOperand(use, _)) + exists(Instruction use | this = nonSsaMemoryOperand(use, _)) or exists(Instruction use, Instruction def, IRBlock predecessorBlock | this = phiOperand(use, def, predecessorBlock, _) or @@ -209,7 +209,7 @@ class Operand extends TStageOperand { class MemoryOperand extends Operand { cached MemoryOperand() { - this instanceof TNonSSAMemoryOperand or + this instanceof TNonSsaMemoryOperand or this instanceof TPhiOperand or this instanceof TChiOperand } @@ -249,7 +249,7 @@ class NonPhiOperand extends Operand { NonPhiOperand() { this = registerOperand(useInstr, tag, _) or - this = nonSSAMemoryOperand(useInstr, tag) or + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } @@ -299,7 +299,7 @@ class NonPhiMemoryOperand extends NonPhiOperand, MemoryOperand, TNonPhiMemoryOpe cached NonPhiMemoryOperand() { - this = nonSSAMemoryOperand(useInstr, tag) + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll index 796fb792366..ca3c378cd7e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll @@ -34,7 +34,7 @@ class ValueNumber extends TValueNumber { final Instruction getAnInstruction() { this = valueNumber(result) } /** - * Gets one of the instructions that was assigned this value number. The chosen instuction is + * Gets one of the instructions that was assigned this value number. The chosen instruction is * deterministic but arbitrary. Intended for use only in debugging. */ final Instruction getExampleInstruction() { 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 2467d961892..2dc735f49df 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 @@ -99,13 +99,19 @@ private predicate filteredNumberableInstruction(Instruction instr) { // count rather than strictcount to handle missing AST elements // separate instanceof and inline casts to avoid failed casts with a count of 0 instr instanceof VariableAddressInstruction and - count(instr.(VariableAddressInstruction).getIRVariable().getAST()) != 1 + count(instr.(VariableAddressInstruction).getIRVariable().getAst()) != 1 or instr instanceof ConstantInstruction and count(instr.getResultIRType()) != 1 or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // 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. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAst()) = ast } private predicate initializeParameterValueNumber( @@ -126,15 +131,14 @@ private predicate initializeParameterValueNumber( // 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. - instr.getIRVariable().getAST() = var + instr.getIRVariable().getAst() = var } private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll index 8ba91d70087..7e12ebc1c90 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll @@ -2,12 +2,12 @@ private import AliasConfigurationInternal private import semmle.code.cpp.ir.implementation.unaliased_ssa.IR private import cpp private import AliasAnalysis -private import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.SimpleSSA as UnaliasedSSA +private import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.SimpleSSA as UnaliasedSsa private newtype TAllocation = TVariableAllocation(IRVariable var) { // Only model variables that were not already handled in unaliased SSA. - not UnaliasedSSA::canReuseSSAForVariable(var) + not UnaliasedSsa::canReuseSsaForVariable(var) } or TIndirectParameterAllocation(IRAutomaticVariable var) { exists(InitializeIndirectionInstruction instr | instr.getIRVariable() = var) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index acdae2b758a..76a99026d59 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -133,7 +133,10 @@ abstract class MemoryLocation extends TMemoryLocation { */ predicate isAlwaysAllocatedOnStack() { none() } - final predicate canReuseSSA() { none() } + final predicate canReuseSsa() { none() } + + /** DEPRECATED: Alias for canReuseSsa */ + deprecated predicate canReuseSSA() { canReuseSsa() } } /** @@ -569,13 +572,16 @@ private Overlap getVariableMemoryLocationOverlap( * Holds if the def/use information for the result of `instr` can be reused from the previous * iteration of the IR. */ -predicate canReuseSSAForOldResult(Instruction instr) { OldSSA::canReuseSSAForMemoryResult(instr) } +predicate canReuseSsaForOldResult(Instruction instr) { OldSSA::canReuseSsaForMemoryResult(instr) } + +/** DEPRECATED: Alias for canReuseSsaForOldResult */ +deprecated predicate canReuseSSAForOldResult = canReuseSsaForOldResult/1; bindingset[result, b] private boolean unbindBool(boolean b) { result != b.booleanNot() } MemoryLocation getResultMemoryLocation(Instruction instr) { - not canReuseSSAForOldResult(instr) and + not canReuseSsaForOldResult(instr) and exists(MemoryAccessKind kind, boolean isMayAccess | kind = instr.getResultMemoryAccess() and (if instr.hasResultMayMemoryAccess() then isMayAccess = true else isMayAccess = false) and @@ -608,7 +614,7 @@ MemoryLocation getResultMemoryLocation(Instruction instr) { } MemoryLocation getOperandMemoryLocation(MemoryOperand operand) { - not canReuseSSAForOldResult(operand.getAnyDef()) and + not canReuseSsaForOldResult(operand.getAnyDef()) and exists(MemoryAccessKind kind, boolean isMayAccess | kind = operand.getMemoryAccess() and (if operand.hasMayReadMemoryAccess() then isMayAccess = true else isMayAccess = false) and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll index b47c20e97ef..c7a5389901b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll @@ -1,2 +1,2 @@ private import semmle.code.cpp.ir.implementation.internal.TOperand -import AliasedSSAOperands +import AliasedSsaOperands diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll index 72bb239c153..c7487872512 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll @@ -2,7 +2,7 @@ private import SSAConstructionInternal private import OldIR private import Alias private import SSAConstruction -private import DebugSSA +private import DebugSsa bindingset[offset] private string getKeySuffixForOffset(int offset) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll index 5686bb439eb..1c75529be00 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll @@ -1,2 +1,2 @@ private import SSAConstruction as SSA -import SSA::SSAConsistency +import SSA::SsaConsistency diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll index 5092e921cb3..303a9683011 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll @@ -112,7 +112,7 @@ private module Cached { exists(Alias::getResultMemoryLocation(oldInstruction)) or // This result was already modeled by a previous iteration of SSA. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) } cached @@ -182,7 +182,7 @@ private module Cached { * unreachable, this predicate will recurse through any degenerate `Phi` instructions to find the * true definition. */ - private Instruction getNewDefinitionFromOldSSA(OldIR::MemoryOperand oldOperand, Overlap overlap) { + private Instruction getNewDefinitionFromOldSsa(OldIR::MemoryOperand oldOperand, Overlap overlap) { exists(Overlap originalOverlap | originalOverlap = oldOperand.getDefinitionOverlap() and ( @@ -191,7 +191,7 @@ private module Cached { or exists(OldIR::PhiInputOperand phiOperand, Overlap phiOperandOverlap | phiOperand = getDegeneratePhiOperand(oldOperand.getAnyDef()) and - result = getNewDefinitionFromOldSSA(phiOperand, phiOperandOverlap) and + result = getNewDefinitionFromOldSsa(phiOperand, phiOperandOverlap) and overlap = combineOverlap(pragma[only_bind_out](phiOperandOverlap), pragma[only_bind_out](originalOverlap)) @@ -233,7 +233,7 @@ private module Cached { ) or exists(OldIR::NonPhiMemoryOperand oldOperand | - result = getNewDefinitionFromOldSSA(oldOperand, overlap) and + result = getNewDefinitionFromOldSsa(oldOperand, overlap) and oldOperand.getUse() = instruction and tag = oldOperand.getOperandTag() ) @@ -307,13 +307,13 @@ private module Cached { * Gets the new definition instruction for the operand of `instr` that flows from the block * `newPredecessorBlock`, based on that operand's definition in the old IR. */ - private Instruction getNewPhiOperandDefinitionFromOldSSA( + private Instruction getNewPhiOperandDefinitionFromOldSsa( Instruction instr, IRBlock newPredecessorBlock, Overlap overlap ) { exists(OldIR::PhiInstruction oldPhi, OldIR::PhiInputOperand oldOperand | oldPhi = getOldInstruction(instr) and oldOperand = oldPhi.getInputOperand(getOldBlock(newPredecessorBlock)) and - result = getNewDefinitionFromOldSSA(oldOperand, overlap) + result = getNewDefinitionFromOldSsa(oldOperand, overlap) ) } @@ -333,7 +333,7 @@ private module Cached { overlap = Alias::getOverlap(actualDefLocation, useLocation) ) or - result = getNewPhiOperandDefinitionFromOldSSA(instr, newPredecessorBlock, overlap) + result = getNewPhiOperandDefinitionFromOldSsa(instr, newPredecessorBlock, overlap) } cached @@ -412,17 +412,17 @@ private module Cached { } cached - Language::AST getInstructionAST(Instruction instr) { - result = getOldInstruction(instr).getAST() + Language::AST getInstructionAst(Instruction instr) { + result = getOldInstruction(instr).getAst() or exists(RawIR::Instruction blockStartInstr | instr = phiInstruction(blockStartInstr, _) and - result = blockStartInstr.getAST() + result = blockStartInstr.getAst() ) or exists(RawIR::Instruction primaryInstr | instr = chiInstruction(primaryInstr) and - result = primaryInstr.getAST() + result = primaryInstr.getAst() ) or exists(IRFunctionBase irFunc | @@ -430,6 +430,12 @@ private module Cached { ) } + /** DEPRECATED: Alias for getInstructionAst */ + cached + deprecated Language::AST getInstructionAST(Instruction instr) { + result = getInstructionAst(instr) + } + cached Language::LanguageType getInstructionResultType(Instruction instr) { result = instr.(RawIR::Instruction).getResultLanguageType() @@ -975,35 +981,41 @@ module DefUse { } } -predicate canReuseSSAForMemoryResult(Instruction instruction) { +predicate canReuseSsaForMemoryResult(Instruction instruction) { exists(OldInstruction oldInstruction | oldInstruction = getOldInstruction(instruction) and ( // The previous iteration said it was reusable, so we should mark it as reusable as well. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) or // The current alias analysis says it is reusable. - Alias::getResultMemoryLocation(oldInstruction).canReuseSSA() + Alias::getResultMemoryLocation(oldInstruction).canReuseSsa() ) ) or exists(Alias::MemoryLocation defLocation | // This is a `Phi` for a reusable location, so the result of the `Phi` is reusable as well. instruction = phiInstruction(_, defLocation) and - defLocation.canReuseSSA() + defLocation.canReuseSsa() ) // We don't support reusing SSA for any location that could create a `Chi` instruction. } +/** DEPRECATED: Alias for canReuseSsaForMemoryResult */ +deprecated predicate canReuseSSAForMemoryResult = canReuseSsaForMemoryResult/1; + /** - * Expose some of the internal predicates to PrintSSA.qll. We do this by publically importing those modules in the + * Expose some of the internal predicates to PrintSSA.qll. We do this by publicly importing those modules in the * `DebugSSA` module, which is then imported by PrintSSA. */ -module DebugSSA { +module DebugSsa { import PhiInsertion import DefUse } +/** DEPRECATED: Alias for DebugSsa */ +deprecated module DebugSSA = DebugSsa; + import CachedForDebugging cached @@ -1038,7 +1050,7 @@ private module CachedForDebugging { private OldIR::IRTempVariable getOldTempVariable(IRTempVariable var) { result.getEnclosingFunction() = var.getEnclosingFunction() and - result.getAST() = var.getAST() and + result.getAst() = var.getAst() and result.getTag() = var.getTag() } @@ -1061,7 +1073,7 @@ private module CachedForDebugging { int maxValue() { result = 2147483647 } } -module SSAConsistency { +module SsaConsistency { /** * Holds if a `MemoryOperand` has more than one `MemoryLocation` assigned by alias analysis. */ @@ -1114,6 +1126,9 @@ module SSAConsistency { } } +/** DEPRECATED: Alias for SsaConsistency */ +deprecated module SSAConsistency = SsaConsistency; + /** * Provides the portion of the parameterized IR interface that is used to construct the SSA stages * of the IR. The raw stage of the IR does not expose these predicates. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll index a1ce2629cc2..74919a57870 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll @@ -2,7 +2,7 @@ import semmle.code.cpp.ir.implementation.unaliased_ssa.IR as OldIR import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.reachability.ReachableBlock as Reachability import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.reachability.Dominance as Dominance import semmle.code.cpp.ir.implementation.aliased_ssa.IR as NewIR -import semmle.code.cpp.ir.implementation.internal.TInstruction::AliasedSSAInstructions as SSAInstructions +import semmle.code.cpp.ir.implementation.internal.TInstruction::AliasedSsaInstructions as SSAInstructions import semmle.code.cpp.ir.internal.IRCppLanguage as Language import AliasedSSA as Alias -import semmle.code.cpp.ir.implementation.internal.TOperand::AliasedSSAOperands as SSAOperands +import semmle.code.cpp.ir.implementation.internal.TOperand::AliasedSsaOperands as SSAOperands diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll index 4b3f19cbdde..5a7099d9fa2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll @@ -19,24 +19,24 @@ newtype TInstruction = ) { IRConstruction::Raw::hasInstruction(tag1, tag2) } or - TUnaliasedSSAPhiInstruction( - TRawInstruction blockStartInstr, UnaliasedSSA::SSA::MemoryLocation memoryLocation + TUnaliasedSsaPhiInstruction( + TRawInstruction blockStartInstr, UnaliasedSsa::SSA::MemoryLocation memoryLocation ) { - UnaliasedSSA::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) + UnaliasedSsa::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) } or - TUnaliasedSSAChiInstruction(TRawInstruction primaryInstruction) { none() } or - TUnaliasedSSAUnreachedInstruction(IRFunctionBase irFunc) { - UnaliasedSSA::SSA::hasUnreachedInstruction(irFunc) + TUnaliasedSsaChiInstruction(TRawInstruction primaryInstruction) { none() } or + TUnaliasedSsaUnreachedInstruction(IRFunctionBase irFunc) { + UnaliasedSsa::SSA::hasUnreachedInstruction(irFunc) } or - TAliasedSSAPhiInstruction( + TAliasedSsaPhiInstruction( TRawInstruction blockStartInstr, AliasedSSA::SSA::MemoryLocation memoryLocation ) { AliasedSSA::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) } or - TAliasedSSAChiInstruction(TRawInstruction primaryInstruction) { + TAliasedSsaChiInstruction(TRawInstruction primaryInstruction) { AliasedSSA::SSA::hasChiInstruction(primaryInstruction) } or - TAliasedSSAUnreachedInstruction(IRFunctionBase irFunc) { + TAliasedSsaUnreachedInstruction(IRFunctionBase irFunc) { AliasedSSA::SSA::hasUnreachedInstruction(irFunc) } @@ -46,58 +46,64 @@ newtype TInstruction = * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module UnaliasedSSAInstructions { - class TPhiInstruction = TUnaliasedSSAPhiInstruction; +module UnaliasedSsaInstructions { + class TPhiInstruction = TUnaliasedSsaPhiInstruction; TPhiInstruction phiInstruction( - TRawInstruction blockStartInstr, UnaliasedSSA::SSA::MemoryLocation memoryLocation + TRawInstruction blockStartInstr, UnaliasedSsa::SSA::MemoryLocation memoryLocation ) { - result = TUnaliasedSSAPhiInstruction(blockStartInstr, memoryLocation) + result = TUnaliasedSsaPhiInstruction(blockStartInstr, memoryLocation) } TRawInstruction reusedPhiInstruction(TRawInstruction blockStartInstr) { none() } - class TChiInstruction = TUnaliasedSSAChiInstruction; + class TChiInstruction = TUnaliasedSsaChiInstruction; TChiInstruction chiInstruction(TRawInstruction primaryInstruction) { - result = TUnaliasedSSAChiInstruction(primaryInstruction) + result = TUnaliasedSsaChiInstruction(primaryInstruction) } - class TUnreachedInstruction = TUnaliasedSSAUnreachedInstruction; + class TUnreachedInstruction = TUnaliasedSsaUnreachedInstruction; TUnreachedInstruction unreachedInstruction(IRFunctionBase irFunc) { - result = TUnaliasedSSAUnreachedInstruction(irFunc) + result = TUnaliasedSsaUnreachedInstruction(irFunc) } } +/** DEPRECATED: Alias for UnaliasedSsaInstructions */ +deprecated module UnaliasedSSAInstructions = UnaliasedSsaInstructions; + /** * Provides wrappers for the constructors of each branch of `TInstruction` that is used by the * aliased SSA stage. * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module AliasedSSAInstructions { - class TPhiInstruction = TAliasedSSAPhiInstruction or TUnaliasedSSAPhiInstruction; +module AliasedSsaInstructions { + class TPhiInstruction = TAliasedSsaPhiInstruction or TUnaliasedSsaPhiInstruction; TPhiInstruction phiInstruction( TRawInstruction blockStartInstr, AliasedSSA::SSA::MemoryLocation memoryLocation ) { - result = TAliasedSSAPhiInstruction(blockStartInstr, memoryLocation) + result = TAliasedSsaPhiInstruction(blockStartInstr, memoryLocation) } TPhiInstruction reusedPhiInstruction(TRawInstruction blockStartInstr) { - result = TUnaliasedSSAPhiInstruction(blockStartInstr, _) + result = TUnaliasedSsaPhiInstruction(blockStartInstr, _) } - class TChiInstruction = TAliasedSSAChiInstruction; + class TChiInstruction = TAliasedSsaChiInstruction; TChiInstruction chiInstruction(TRawInstruction primaryInstruction) { - result = TAliasedSSAChiInstruction(primaryInstruction) + result = TAliasedSsaChiInstruction(primaryInstruction) } - class TUnreachedInstruction = TAliasedSSAUnreachedInstruction; + class TUnreachedInstruction = TAliasedSsaUnreachedInstruction; TUnreachedInstruction unreachedInstruction(IRFunctionBase irFunc) { - result = TAliasedSSAUnreachedInstruction(irFunc) + result = TAliasedSsaUnreachedInstruction(irFunc) } } + +/** DEPRECATED: Alias for AliasedSsaInstructions */ +deprecated module AliasedSSAInstructions = AliasedSsaInstructions; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll index adaaaca9cd8..2c9ac1c4b80 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll @@ -1,4 +1,4 @@ import semmle.code.cpp.ir.internal.IRCppLanguage as Language import semmle.code.cpp.ir.implementation.raw.internal.IRConstruction as IRConstruction -import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.SSAConstruction as UnaliasedSSA +import semmle.code.cpp.ir.implementation.unaliased_ssa.internal.SSAConstruction as UnaliasedSsa import semmle.code.cpp.ir.implementation.aliased_ssa.internal.SSAConstruction as AliasedSSA diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll index e86494af03a..bc69754fe32 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll @@ -31,7 +31,7 @@ private module Internal { TNoOperand() { none() } or // Can be "removed" later when there's unreachable code // These operands can be reused across all three stages. They just get different defs. - TNonSSAMemoryOperand(Raw::Instruction useInstr, MemoryOperandTag tag) { + TNonSsaMemoryOperand(Raw::Instruction useInstr, MemoryOperandTag tag) { // Has no definition in raw but will get definitions later useInstr.getOpcode().hasOperand(tag) } or @@ -49,11 +49,11 @@ private module Internal { // important that we use the same definition of "is variable aliased" across // the phases. TAliasedPhiOperand( - TAliasedSSAPhiInstruction useInstr, Aliased::IRBlock predecessorBlock, Overlap overlap + TAliasedSsaPhiInstruction useInstr, Aliased::IRBlock predecessorBlock, Overlap overlap ) { exists(AliasedConstruction::getPhiOperandDefinition(useInstr, predecessorBlock, overlap)) } or - TAliasedChiOperand(TAliasedSSAChiInstruction useInstr, ChiOperandTag tag) { any() } + TAliasedChiOperand(TAliasedSsaChiInstruction useInstr, ChiOperandTag tag) { any() } } /** @@ -72,13 +72,21 @@ private module Shared { result = Internal::TRegisterOperand(useInstr, tag, defInstr) } - class TNonSSAMemoryOperand = Internal::TNonSSAMemoryOperand; + class TNonSsaMemoryOperand = Internal::TNonSsaMemoryOperand; + + /** DEPRECATED: Alias for TNonSsaMemoryOperand */ + deprecated class TNonSSAMemoryOperand = TNonSsaMemoryOperand; /** * Returns the non-Phi memory operand with the specified parameters. */ - TNonSSAMemoryOperand nonSSAMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { - result = Internal::TNonSSAMemoryOperand(useInstr, tag) + TNonSsaMemoryOperand nonSsaMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { + result = Internal::TNonSsaMemoryOperand(useInstr, tag) + } + + /** DEPRECATED: Alias for nonSsaMemoryOperand */ + deprecated TNonSSAMemoryOperand nonSSAMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { + result = nonSsaMemoryOperand(useInstr, tag) } } @@ -95,7 +103,7 @@ module RawOperands { class TChiOperand = Internal::TNoOperand; - class TNonPhiMemoryOperand = TNonSSAMemoryOperand or TChiOperand; + class TNonPhiMemoryOperand = TNonSsaMemoryOperand or TChiOperand; /** * Returns the Phi operand with the specified parameters. @@ -126,14 +134,14 @@ module RawOperands { * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module UnaliasedSSAOperands { +module UnaliasedSsaOperands { import Shared class TPhiOperand = Internal::TUnaliasedPhiOperand; class TChiOperand = Internal::TNoOperand; - class TNonPhiMemoryOperand = TNonSSAMemoryOperand or TChiOperand; + class TNonPhiMemoryOperand = TNonSsaMemoryOperand or TChiOperand; /** * Returns the Phi operand with the specified parameters. @@ -159,20 +167,23 @@ module UnaliasedSSAOperands { TChiOperand chiOperand(Unaliased::Instruction useInstr, ChiOperandTag tag) { none() } } +/** DEPRECATED: Alias for UnaliasedSsaOperands */ +deprecated module UnaliasedSSAOperands = UnaliasedSsaOperands; + /** * Provides wrappers for the constructors of each branch of `TOperand` that is used by the * asliased SSA stage. * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module AliasedSSAOperands { +module AliasedSsaOperands { import Shared class TPhiOperand = Internal::TAliasedPhiOperand or Internal::TUnaliasedPhiOperand; class TChiOperand = Internal::TAliasedChiOperand; - class TNonPhiMemoryOperand = TNonSSAMemoryOperand or TChiOperand; + class TNonPhiMemoryOperand = TNonSsaMemoryOperand or TChiOperand; /** * Returns the Phi operand with the specified parameters. @@ -202,7 +213,10 @@ module AliasedSSAOperands { /** * Returns the Chi operand with the specified parameters. */ - TChiOperand chiOperand(TAliasedSSAChiInstruction useInstr, ChiOperandTag tag) { + TChiOperand chiOperand(TAliasedSsaChiInstruction useInstr, ChiOperandTag tag) { result = Internal::TAliasedChiOperand(useInstr, tag) } } + +/** DEPRECATED: Alias for AliasedSsaOperands */ +deprecated module AliasedSSAOperands = AliasedSsaOperands; 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 82db3146630..bac7634cbd0 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 @@ -161,8 +161,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock dominanceFrontier() { - this.dominates(result.getAPredecessor()) and - not this.strictlyDominates(result) + this.getASuccessor() = result and + not this.immediatelyDominates(result) + or + exists(IRBlock prev | result = prev.dominanceFrontier() | + this.immediatelyDominates(prev) and + not this.immediatelyDominates(result) + ) } /** @@ -201,8 +206,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock postDominanceFrontier() { - this.postDominates(result.getASuccessor()) and - not this.strictlyPostDominates(result) + this.getAPredecessor() = result and + not this.immediatelyPostDominates(result) + or + exists(IRBlock prev | result = prev.postDominanceFrontier() | + this.immediatelyPostDominates(prev) and + not this.immediatelyPostDominates(result) + ) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll index 146fc270738..ca4708857a7 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll @@ -55,7 +55,10 @@ class IRVariable extends TIRVariable { * Gets the AST node that declared this variable, or that introduced this * variable as part of the AST-to-IR translation. */ - Language::AST getAST() { none() } + Language::AST getAst() { none() } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = getAst() } /** * Gets an identifier string for the variable. This identifier is unique @@ -66,7 +69,7 @@ class IRVariable extends TIRVariable { /** * Gets the source location of this variable. */ - final Language::Location getLocation() { result = getAST().getLocation() } + final Language::Location getLocation() { result = getAst().getLocation() } /** * Gets the IR for the function that references this variable. @@ -90,7 +93,10 @@ class IRUserVariable extends IRVariable, TIRUserVariable { final override string toString() { result = getVariable().toString() } - final override Language::AST getAST() { result = var } + final override Language::AST getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } final override string getUniqueId() { result = getVariable().toString() + " " + getVariable().getLocation().toString() @@ -157,7 +163,10 @@ class IRGeneratedVariable extends IRVariable { final override Language::LanguageType getLanguageType() { result = type } - final override Language::AST getAST() { result = ast } + final override Language::AST getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } override string toString() { result = getBaseString() + getLocationString() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 1c2cc493338..e5a908bbf9a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -41,7 +41,7 @@ class Instruction extends Construction::TStageInstruction { } /** Gets a textual representation of this element. */ - final string toString() { result = this.getOpcode().toString() + ": " + this.getAST().toString() } + final string toString() { result = this.getOpcode().toString() + ": " + this.getAst().toString() } /** * Gets a string showing the result, opcode, and operands of the instruction, equivalent to what @@ -136,7 +136,7 @@ class Instruction extends Construction::TStageInstruction { string getResultId() { this.shouldGenerateDumpStrings() and result = - this.getResultPrefix() + this.getAST().getLocation().getStartLine() + "_" + this.getLineRank() + this.getResultPrefix() + this.getAst().getLocation().getStartLine() + "_" + this.getLineRank() } /** @@ -208,12 +208,15 @@ class Instruction extends Construction::TStageInstruction { /** * Gets the AST that caused this instruction to be generated. */ - final Language::AST getAST() { result = Construction::getInstructionAST(this) } + final Language::AST getAst() { result = Construction::getInstructionAst(this) } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Gets the location of the source code for this instruction. */ - final Language::Location getLocation() { result = this.getAST().getLocation() } + final Language::Location getLocation() { result = this.getAst().getLocation() } /** * Gets the `Expr` whose result is computed by this instruction, if any. The `Expr` may be a @@ -459,7 +462,10 @@ class VariableInstruction extends Instruction { /** * Gets the AST variable that this instruction's IR variable refers to, if one exists. */ - final Language::Variable getASTVariable() { result = var.(IRUserVariable).getVariable() } + final Language::Variable getAstVariable() { result = var.(IRUserVariable).getVariable() } + + /** DEPRECATED: Alias for getAstVariable */ + deprecated Language::Variable getASTVariable() { result = this.getAstVariable() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll index 89b82657c3b..c1e997d5844 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll @@ -18,7 +18,7 @@ private import internal.OperandInternal * of `TOperand` that are used in this stage. */ private class TStageOperand = - TRegisterOperand or TNonSSAMemoryOperand or TPhiOperand or TChiOperand; + TRegisterOperand or TNonSsaMemoryOperand or TPhiOperand or TChiOperand; /** * A known location. Testing `loc instanceof KnownLocation` will account for non existing locations, as @@ -38,7 +38,7 @@ class Operand extends TStageOperand { // Ensure that the operand does not refer to instructions from earlier stages that are unreachable here exists(Instruction use, Instruction def | this = registerOperand(use, _, def)) or - exists(Instruction use | this = nonSSAMemoryOperand(use, _)) + exists(Instruction use | this = nonSsaMemoryOperand(use, _)) or exists(Instruction use, Instruction def, IRBlock predecessorBlock | this = phiOperand(use, def, predecessorBlock, _) or @@ -209,7 +209,7 @@ class Operand extends TStageOperand { class MemoryOperand extends Operand { cached MemoryOperand() { - this instanceof TNonSSAMemoryOperand or + this instanceof TNonSsaMemoryOperand or this instanceof TPhiOperand or this instanceof TChiOperand } @@ -249,7 +249,7 @@ class NonPhiOperand extends Operand { NonPhiOperand() { this = registerOperand(useInstr, tag, _) or - this = nonSSAMemoryOperand(useInstr, tag) or + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } @@ -299,7 +299,7 @@ class NonPhiMemoryOperand extends NonPhiOperand, MemoryOperand, TNonPhiMemoryOpe cached NonPhiMemoryOperand() { - this = nonSSAMemoryOperand(useInstr, tag) + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll index 796fb792366..ca3c378cd7e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll @@ -34,7 +34,7 @@ class ValueNumber extends TValueNumber { final Instruction getAnInstruction() { this = valueNumber(result) } /** - * Gets one of the instructions that was assigned this value number. The chosen instuction is + * Gets one of the instructions that was assigned this value number. The chosen instruction is * deterministic but arbitrary. Intended for use only in debugging. */ final Instruction getExampleInstruction() { 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 2467d961892..2dc735f49df 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 @@ -99,13 +99,19 @@ private predicate filteredNumberableInstruction(Instruction instr) { // count rather than strictcount to handle missing AST elements // separate instanceof and inline casts to avoid failed casts with a count of 0 instr instanceof VariableAddressInstruction and - count(instr.(VariableAddressInstruction).getIRVariable().getAST()) != 1 + count(instr.(VariableAddressInstruction).getIRVariable().getAst()) != 1 or instr instanceof ConstantInstruction and count(instr.getResultIRType()) != 1 or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // 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. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAst()) = ast } private predicate initializeParameterValueNumber( @@ -126,15 +131,14 @@ private predicate initializeParameterValueNumber( // 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. - instr.getIRVariable().getAST() = var + instr.getIRVariable().getAst() = var } private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index e8fcf3fcdf3..94bfc53875f 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -48,7 +48,7 @@ module Raw { cached predicate hasTempVariable(Function func, Locatable ast, TempVariableTag tag, CppType type) { exists(TranslatedElement element | - element.getAST() = ast and + element.getAst() = ast and func = element.getFunction() and element.hasTempVariable(tag, type) ) @@ -75,7 +75,7 @@ module Raw { tag = getInstructionTag(instruction) and ( result = element.getInstructionVariable(tag) or - result.(IRStringLiteral).getAST() = element.getInstructionStringLiteral(tag) + result.(IRStringLiteral).getAst() = element.getInstructionStringLiteral(tag) ) ) } @@ -339,7 +339,7 @@ Instruction getInstructionBackEdgeSuccessor(Instruction instruction, EdgeKind ki // such a `goto` creates a back edge. exists(TranslatedElement s, GotoStmt goto | not isStrictlyForwardGoto(goto) and - goto = s.getAST() and + goto = s.getAst() and exists(InstructionTag tag | result = s.getInstructionSuccessor(tag, kind) and instruction = s.getInstruction(tag) @@ -349,11 +349,16 @@ Instruction getInstructionBackEdgeSuccessor(Instruction instruction, EdgeKind ki /** Holds if `goto` jumps strictly forward in the program text. */ private predicate isStrictlyForwardGoto(GotoStmt goto) { - goto.getLocation().isBefore(goto.getTarget().getLocation()) + goto.getLocation().isBefore(goto.getTarget().getLocation(), _) } -Locatable getInstructionAST(TStageInstruction instr) { - result = getInstructionTranslatedElement(instr).getAST() +Locatable getInstructionAst(TStageInstruction instr) { + result = getInstructionTranslatedElement(instr).getAst() +} + +/** DEPRECATED: Alias for getInstructionAst */ +deprecated Locatable getInstructionAST(TStageInstruction instr) { + result = getInstructionAst(instr) } CppType getInstructionResultType(TStageInstruction instr) { 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 aed1ae21129..617fa9ffd89 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 @@ -71,7 +71,8 @@ newtype TInstructionTag = AsmTag() or AsmInputTag(int elementIndex) { exists(AsmStmt asm | exists(asm.getChild(elementIndex))) } or ThisAddressTag() or - ThisLoadTag() + ThisLoadTag() or + StructuredBindingAccessTag() class InstructionTag extends TInstructionTag { final string toString() { result = "Tag" } @@ -221,4 +222,6 @@ string getInstructionTagId(TInstructionTag tag) { tag = ThisAddressTag() and result = "ThisAddress" or tag = ThisLoadTag() and result = "ThisLoad" + or + tag = StructuredBindingAccessTag() and result = "StructuredBindingAccess" } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 8ef5334b598..66c601736af 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -175,7 +175,10 @@ abstract class TranslatedSideEffects extends TranslatedElement { /** Gets the expression whose side effects are being modeled. */ abstract Expr getExpr(); - final override Locatable getAST() { result = getExpr() } + final override Locatable getAst() { result = getExpr() } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = getExpr().getEnclosingFunction() } @@ -522,7 +525,10 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect, this = TTranslatedArgumentExprSideEffect(call, arg, index, sideEffectOpcode) } - final override Locatable getAST() { result = arg } + final override Locatable getAst() { result = arg } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Type getIndirectionType() { result = arg.getUnspecifiedType().(DerivedType).getBaseType() @@ -553,7 +559,10 @@ class TranslatedStructorQualifierSideEffect extends TranslatedArgumentSideEffect index = -1 } - final override Locatable getAST() { result = call } + final override Locatable getAst() { result = call } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Type getIndirectionType() { result = call.getTarget().getDeclaringType() } @@ -574,7 +583,10 @@ class TranslatedCallSideEffect extends TranslatedSideEffect, TTranslatedCallSide TranslatedCallSideEffect() { this = TTranslatedCallSideEffect(expr, sideEffectOpcode) } - override Locatable getAST() { result = expr } + override Locatable getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Expr getPrimaryExpr() { result = expr } @@ -612,7 +624,10 @@ class TranslatedAllocationSideEffect extends TranslatedSideEffect, TTranslatedAl TranslatedAllocationSideEffect() { this = TTranslatedAllocationSideEffect(expr) } - override Locatable getAST() { result = expr } + override Locatable getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Expr getPrimaryExpr() { result = expr } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 0779d6fbda5..528acf4498b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -19,7 +19,10 @@ abstract class TranslatedCondition extends TranslatedElement { final override string toString() { result = expr.toString() } - final override Locatable getAST() { result = expr } + final override Locatable getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final ConditionContext getConditionContext() { result = getParent() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index de63b81c876..36f1ce9443d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -14,7 +14,7 @@ private import TranslatedInitialization * `entry`. */ TranslatedDeclarationEntry getTranslatedDeclarationEntry(DeclarationEntry entry) { - result.getAST() = entry + result.getAst() = entry } /** @@ -37,7 +37,10 @@ abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslated final override string toString() { result = entry.toString() } - final override Locatable getAST() { result = entry } + final override Locatable getAst() { result = entry } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } } /** @@ -223,7 +226,10 @@ class TranslatedStaticLocalVariableInitialization extends TranslatedElement, final override string toString() { result = "init: " + entry.toString() } - final override Locatable getAST() { result = entry } + final override Locatable getAst() { result = entry } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override LocalVariable getVariable() { result = var } @@ -254,7 +260,10 @@ class TranslatedRangeBasedForVariableDeclaration extends TranslatedLocalVariable override string toString() { result = var.toString() } - override Locatable getAST() { result = var } + override Locatable getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Function getFunction() { result = forStmt.getEnclosingFunction() } @@ -262,7 +271,7 @@ class TranslatedRangeBasedForVariableDeclaration extends TranslatedLocalVariable } TranslatedConditionDecl getTranslatedConditionDecl(ConditionDeclExpr expr) { - result.getAST() = expr + result.getAst() = expr } /** @@ -280,7 +289,10 @@ class TranslatedConditionDecl extends TranslatedLocalVariableDeclaration, TTrans override string toString() { result = "decl: " + conditionDeclExpr.toString() } - override Locatable getAST() { result = conditionDeclExpr } + override Locatable getAst() { result = conditionDeclExpr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Function getFunction() { result = conditionDeclExpr.getEnclosingFunction() } 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 8034e9e2bd1..d11d718e215 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 @@ -31,7 +31,7 @@ IRUserVariable getIRUserVariable(Function func, Variable var) { } IRTempVariable getIRTempVariable(Locatable ast, TempVariableTag tag) { - result.getAST() = ast and + result.getAst() = ast and result.getTag() = tag } @@ -154,13 +154,6 @@ private predicate ignoreSideEffects(Expr expr) { * around extractor bugs. Once the relevant extractor bugs are fixed, this predicate can be removed. */ private predicate isInvalidFunction(Function func) { - exists(Literal literal | - // Constructor field inits within a compiler-generated copy constructor have a source expression - // that is a `Literal` with no value. - literal = func.(Constructor).getAnInitializer().(ConstructorFieldInit).getExpr() and - not exists(literal.getValue()) - ) - or exists(ThisExpr thisExpr | // An instantiation of a member function template is not treated as a `MemberFunction` if it has // only non-type template arguments. @@ -730,7 +723,10 @@ abstract class TranslatedElement extends TTranslatedElement { /** * Gets the AST node being translated. */ - abstract Locatable getAST(); + abstract Locatable getAst(); + + /** DEPRECATED: Alias for getAst */ + deprecated Locatable getAST() { result = getAst() } /** * Get the first instruction to be executed in the evaluation of this element. @@ -929,16 +925,16 @@ abstract class TranslatedElement extends TTranslatedElement { */ final IRTempVariable getTempVariable(TempVariableTag tag) { exists(Locatable ast | - result.getAST() = ast and + result.getAst() = ast and result.getTag() = tag and - hasTempVariableAndAST(tag, ast) + hasTempVariableAndAst(tag, ast) ) } pragma[noinline] - private predicate hasTempVariableAndAST(TempVariableTag tag, Locatable ast) { + private predicate hasTempVariableAndAst(TempVariableTag tag, Locatable ast) { hasTempVariable(tag, _) and - ast = getAST() + ast = getAst() } /** 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 d3f70b94db7..c81b7c5943a 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 @@ -3,6 +3,7 @@ private import semmle.code.cpp.ir.implementation.IRType private import semmle.code.cpp.ir.implementation.Opcode private import semmle.code.cpp.ir.implementation.internal.OperandTag private import semmle.code.cpp.ir.internal.CppType +private import semmle.code.cpp.ir.internal.IRUtilities private import semmle.code.cpp.ir.internal.TempVariableTag private import InstructionTag private import TranslatedCondition @@ -10,7 +11,6 @@ private import TranslatedDeclarationEntry private import TranslatedElement private import TranslatedFunction private import TranslatedInitialization -private import TranslatedFunction private import TranslatedStmt import TranslatedCall @@ -73,7 +73,10 @@ abstract class TranslatedExpr extends TranslatedElement { expr.isGLValueCategory() } - final override Locatable getAST() { result = expr } + final override Locatable getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = this.getAst() } final override Function getFunction() { result = expr.getEnclosingFunction() } @@ -813,7 +816,9 @@ abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { } class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { - TranslatedNonFieldVariableAccess() { not expr instanceof FieldAccess } + TranslatedNonFieldVariableAccess() { + not expr instanceof FieldAccess and not isNonReferenceStructuredBinding(expr.getTarget()) + } override Instruction getFirstInstruction() { if exists(this.getQualifier()) @@ -860,6 +865,71 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { } } +/** + * The IR translation of a variable access of a structured binding, where the type + * of the structured binding is not of a reference type, e.g., `x0` and `x1` + * in `auto [x0, x1] = xs` where `xs` is an array. Although the type of the + * structured binding is a non-reference type, the structured binding behaves + * like a reference. Hence, the translation requires a `VariableAddress` followed + * by a `Load` instead of only a `VariableAddress` as produced by + * `TranslatedVariableAccess`. + */ +class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExpr { + override VariableAccess expr; + + TranslatedStructuredBindingVariableAccess() { isNonReferenceStructuredBinding(expr.getTarget()) } + + override Instruction getFirstInstruction() { + // Structured bindings cannot be qualified. + result = this.getInstruction(StructuredBindingAccessTag()) + } + + override TranslatedElement getChild(int id) { + // Structured bindings cannot be qualified. + none() + } + + override Instruction getResult() { result = this.getInstruction(LoadTag()) } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + tag = StructuredBindingAccessTag() and + kind instanceof GotoEdge and + result = this.getInstruction(LoadTag()) + or + tag = LoadTag() and + kind instanceof GotoEdge and + result = this.getParent().getChildSuccessor(this) + } + + override Instruction getChildSuccessor(TranslatedElement child) { none() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = StructuredBindingAccessTag() and + opcode instanceof Opcode::VariableAddress and + resultType = getTypeForGLValue(this.getLValueReferenceType()) + or + tag = LoadTag() and + opcode instanceof Opcode::Load and + resultType = getTypeForPRValue(this.getLValueReferenceType()) + } + + private LValueReferenceType getLValueReferenceType() { + // The extractor ensures `result` exists when `isNonReferenceStructuredBinding(expr.getTarget())` holds. + result.getBaseType() = expr.getUnspecifiedType() + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = LoadTag() and + operandTag instanceof AddressOperandTag and + result = this.getInstruction(StructuredBindingAccessTag()) + } + + override IRVariable getInstructionVariable(InstructionTag tag) { + tag = StructuredBindingAccessTag() and + result = getIRUserVariable(expr.getEnclosingFunction(), expr.getTarget()) + } +} + class TranslatedFunctionAccess extends TranslatedNonConstantExpr { override FunctionAccess expr; @@ -1641,7 +1711,7 @@ abstract class TranslatedAllocationSize extends TranslatedExpr, TTranslatedAlloc } TranslatedAllocationSize getTranslatedAllocationSize(NewOrNewArrayExpr newExpr) { - result.getAST() = newExpr + result.getAst() = newExpr } /** @@ -1807,7 +1877,7 @@ class TranslatedAllocatorCall extends TTranslatedAllocatorCall, TranslatedDirect } TranslatedAllocatorCall getTranslatedAllocatorCall(NewOrNewArrayExpr newExpr) { - result.getAST() = newExpr + result.getAst() = newExpr } /** 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 2fa4548fc3c..0f781cb2244 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 @@ -15,7 +15,7 @@ private import VarArgs /** * Gets the `TranslatedFunction` that represents function `func`. */ -TranslatedFunction getTranslatedFunction(Function func) { result.getAST() = func } +TranslatedFunction getTranslatedFunction(Function func) { result.getAst() = func } /** * Gets the size, in bytes, of the variable used to represent the `...` parameter in a varargs @@ -65,7 +65,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final override string toString() { result = func.toString() } - final override Locatable getAST() { result = func } + final override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } /** * Gets the function being translated. @@ -344,7 +347,7 @@ TranslatedThisParameter getTranslatedThisParameter(Function func) { result.getFu /** * Gets the `TranslatedPositionalParameter` that represents parameter `param`. */ -TranslatedPositionalParameter getTranslatedParameter(Parameter param) { result.getAST() = param } +TranslatedPositionalParameter getTranslatedParameter(Parameter param) { result.getAst() = param } /** * Gets the `TranslatedEllipsisParameter` for function `func`, if one exists. @@ -457,7 +460,10 @@ class TranslatedThisParameter extends TranslatedParameter, TTranslatedThisParame final override string toString() { result = "this" } - final override Locatable getAST() { result = func } + final override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = func } @@ -489,7 +495,10 @@ class TranslatedPositionalParameter extends TranslatedParameter, TTranslatedPara final override string toString() { result = param.toString() } - final override Locatable getAST() { result = param } + final override Locatable getAst() { result = param } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = param.getFunction() or @@ -526,7 +535,10 @@ class TranslatedEllipsisParameter extends TranslatedParameter, TTranslatedEllips final override string toString() { result = "..." } - final override Locatable getAST() { result = func } + final override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = func } @@ -544,7 +556,7 @@ class TranslatedEllipsisParameter extends TranslatedParameter, TTranslatedEllips } private TranslatedConstructorInitList getTranslatedConstructorInitList(Function func) { - result.getAST() = func + result.getAst() = func } /** @@ -561,7 +573,10 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon override string toString() { result = "ctor init: " + func.toString() } - override Locatable getAST() { result = func } + override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override TranslatedElement getChild(int id) { exists(ConstructorFieldInit fieldInit | @@ -611,7 +626,7 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon } private TranslatedDestructorDestructionList getTranslatedDestructorDestructionList(Function func) { - result.getAST() = func + result.getAst() = func } /** @@ -629,7 +644,10 @@ class TranslatedDestructorDestructionList extends TranslatedElement, override string toString() { result = "dtor destruction: " + func.toString() } - override Locatable getAST() { result = func } + override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override TranslatedElement getChild(int id) { exists(DestructorFieldDestruction fieldDestruction | @@ -667,14 +685,17 @@ class TranslatedDestructorDestructionList extends TranslatedElement, } } -TranslatedReadEffects getTranslatedReadEffects(Function func) { result.getAST() = func } +TranslatedReadEffects getTranslatedReadEffects(Function func) { result.getAst() = func } class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { Function func; TranslatedReadEffects() { this = TTranslatedReadEffects(func) } - override Locatable getAST() { result = func } + override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Function getFunction() { result = func } @@ -718,11 +739,11 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { } private TranslatedThisReadEffect getTranslatedThisReadEffect(Function func) { - result.getAST() = func + result.getAst() = func } private TranslatedParameterReadEffect getTranslatedParameterReadEffect(Parameter param) { - result.getAST() = param + result.getAst() = param } abstract class TranslatedReadEffect extends TranslatedElement { @@ -758,7 +779,10 @@ class TranslatedThisReadEffect extends TranslatedReadEffect, TTranslatedThisRead TranslatedThisReadEffect() { this = TTranslatedThisReadEffect(func) } - override Locatable getAST() { result = func } + override Locatable getAst() { result = func } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override Function getFunction() { result = func } @@ -781,7 +805,10 @@ class TranslatedParameterReadEffect extends TranslatedReadEffect, TTranslatedPar TranslatedParameterReadEffect() { this = TTranslatedParameterReadEffect(param) } - override Locatable getAST() { result = param } + override Locatable getAst() { result = param } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } override string toString() { result = "read effect: " + param.toString() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index 23d6ad133cf..1a9d7ad9d70 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -139,7 +139,10 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn final override Function getFunction() { result = expr.getEnclosingFunction() } - final override Locatable getAST() { result = expr } + final override Locatable getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } /** * Gets the expression that is doing the initialization. @@ -461,11 +464,11 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization TranslatedFieldInitialization getTranslatedFieldInitialization( ClassAggregateLiteral initList, Field field ) { - result.getAST() = initList and result.getField() = field + result.getAst() = initList and result.getField() = field } TranslatedFieldInitialization getTranslatedConstructorFieldInitialization(ConstructorFieldInit init) { - result.getAST() = init + result.getAst() = init } /** @@ -478,7 +481,10 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { final override string toString() { result = ast.toString() + "." + field.toString() } - final override Locatable getAST() { result = ast } + final override Locatable getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = ast.getEnclosingFunction() } @@ -622,7 +628,10 @@ abstract class TranslatedElementInitialization extends TranslatedElement { result = initList.toString() + "[" + getElementIndex().toString() + "]" } - final override Locatable getAST() { result = initList } + final override Locatable getAst() { result = initList } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = initList.getEnclosingFunction() } @@ -802,7 +811,10 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati abstract class TranslatedStructorCallFromStructor extends TranslatedElement, StructorCallContext { FunctionCall call; - final override Locatable getAST() { result = call } + final override Locatable getAst() { result = call } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override TranslatedElement getChild(int id) { id = 0 and @@ -864,7 +876,7 @@ abstract class TranslatedConstructorCallFromConstructor extends TranslatedStruct } TranslatedConstructorCallFromConstructor getTranslatedConstructorBaseInit(ConstructorBaseInit init) { - result.getAST() = init + result.getAst() = init } /** @@ -904,7 +916,7 @@ class TranslatedConstructorBaseInit extends TranslatedConstructorCallFromConstru TranslatedDestructorBaseDestruction getTranslatedDestructorBaseDestruction( DestructorBaseDestruction destruction ) { - result.getAST() = destruction + result.getAst() = destruction } /** @@ -928,7 +940,10 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr TranslatedConstructorBareInit() { this = TTranslatedConstructorBareInit(init) } - override Locatable getAST() { result = init } + override Locatable getAst() { result = init } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override string toString() { result = "construct base (no constructor)" } @@ -948,5 +963,5 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr } TranslatedConstructorBareInit getTranslatedConstructorBareInit(ConstructorInit init) { - result.getAST() = init + result.getAst() = init } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 2bc3b5bc3ef..187dbc2f994 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 @@ -11,7 +11,7 @@ private import TranslatedExpr private import TranslatedFunction private import TranslatedInitialization -TranslatedStmt getTranslatedStmt(Stmt stmt) { result.getAST() = stmt } +TranslatedStmt getTranslatedStmt(Stmt stmt) { result.getAst() = stmt } abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { Stmt stmt; @@ -20,7 +20,10 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { final override string toString() { result = stmt.toString() } - final override Locatable getAST() { result = stmt } + final override Locatable getAst() { result = stmt } + + /** DEPRECATED: Alias for getAst */ + deprecated override Locatable getAST() { result = getAst() } final override Function getFunction() { result = stmt.getEnclosingFunction() } } @@ -418,20 +421,36 @@ class TranslatedCatchAnyHandler extends TranslatedHandler { class TranslatedIfStmt extends TranslatedStmt, ConditionContext { override IfStmt stmt; - override Instruction getFirstInstruction() { result = getCondition().getFirstInstruction() } + override Instruction getFirstInstruction() { + if hasInitialization() + then result = getInitialization().getFirstInstruction() + else result = getFirstConditionInstruction() + } override TranslatedElement getChild(int id) { - id = 0 and result = getCondition() + id = 0 and result = getInitialization() or - id = 1 and result = getThen() + id = 1 and result = getCondition() or - id = 2 and result = getElse() + id = 2 and result = getThen() + or + id = 3 and result = getElse() + } + + private predicate hasInitialization() { exists(stmt.getInitialization()) } + + private TranslatedStmt getInitialization() { + result = getTranslatedStmt(stmt.getInitialization()) } private TranslatedCondition getCondition() { result = getTranslatedCondition(stmt.getCondition().getFullyConverted()) } + private Instruction getFirstConditionInstruction() { + result = getCondition().getFirstInstruction() + } + private TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) } private TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) } @@ -453,6 +472,9 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { } override Instruction getChildSuccessor(TranslatedElement child) { + child = getInitialization() and + result = getFirstConditionInstruction() + or (child = getThen() or child = getElse()) and result = getParent().getChildSuccessor(this) } @@ -695,14 +717,28 @@ class TranslatedSwitchStmt extends TranslatedStmt { result = getTranslatedExpr(stmt.getExpr().getFullyConverted()) } + private Instruction getFirstExprInstruction() { result = getExpr().getFirstInstruction() } + private TranslatedStmt getBody() { result = getTranslatedStmt(stmt.getStmt()) } - override Instruction getFirstInstruction() { result = getExpr().getFirstInstruction() } + override Instruction getFirstInstruction() { + if hasInitialization() + then result = getInitialization().getFirstInstruction() + else result = getFirstExprInstruction() + } override TranslatedElement getChild(int id) { - id = 0 and result = getExpr() + id = 0 and result = getInitialization() or - id = 1 and result = getBody() + id = 1 and result = getExpr() + or + id = 2 and result = getBody() + } + + private predicate hasInitialization() { exists(stmt.getInitialization()) } + + private TranslatedStmt getInitialization() { + result = getTranslatedStmt(stmt.getInitialization()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -732,6 +768,8 @@ class TranslatedSwitchStmt extends TranslatedStmt { } override Instruction getChildSuccessor(TranslatedElement child) { + child = getInitialization() and result = getFirstExprInstruction() + or child = getExpr() and result = getInstruction(SwitchBranchTag()) or child = getBody() and result = getParent().getChildSuccessor(this) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll index cee8fa1543b..aaa4cc7bd53 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll @@ -1,7 +1,5 @@ private import ReachableBlock as Reachability -private module ReachabilityGraph = Reachability::Graph; - module Graph { import Reachability::Graph 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 82db3146630..bac7634cbd0 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 @@ -161,8 +161,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock dominanceFrontier() { - this.dominates(result.getAPredecessor()) and - not this.strictlyDominates(result) + this.getASuccessor() = result and + not this.immediatelyDominates(result) + or + exists(IRBlock prev | result = prev.dominanceFrontier() | + this.immediatelyDominates(prev) and + not this.immediatelyDominates(result) + ) } /** @@ -201,8 +206,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock postDominanceFrontier() { - this.postDominates(result.getASuccessor()) and - not this.strictlyPostDominates(result) + this.getAPredecessor() = result and + not this.immediatelyPostDominates(result) + or + exists(IRBlock prev | result = prev.postDominanceFrontier() | + this.immediatelyPostDominates(prev) and + not this.immediatelyPostDominates(result) + ) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll index 146fc270738..ca4708857a7 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll @@ -55,7 +55,10 @@ class IRVariable extends TIRVariable { * Gets the AST node that declared this variable, or that introduced this * variable as part of the AST-to-IR translation. */ - Language::AST getAST() { none() } + Language::AST getAst() { none() } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = getAst() } /** * Gets an identifier string for the variable. This identifier is unique @@ -66,7 +69,7 @@ class IRVariable extends TIRVariable { /** * Gets the source location of this variable. */ - final Language::Location getLocation() { result = getAST().getLocation() } + final Language::Location getLocation() { result = getAst().getLocation() } /** * Gets the IR for the function that references this variable. @@ -90,7 +93,10 @@ class IRUserVariable extends IRVariable, TIRUserVariable { final override string toString() { result = getVariable().toString() } - final override Language::AST getAST() { result = var } + final override Language::AST getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } final override string getUniqueId() { result = getVariable().toString() + " " + getVariable().getLocation().toString() @@ -157,7 +163,10 @@ class IRGeneratedVariable extends IRVariable { final override Language::LanguageType getLanguageType() { result = type } - final override Language::AST getAST() { result = ast } + final override Language::AST getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } override string toString() { result = getBaseString() + getLocationString() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 1c2cc493338..e5a908bbf9a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -41,7 +41,7 @@ class Instruction extends Construction::TStageInstruction { } /** Gets a textual representation of this element. */ - final string toString() { result = this.getOpcode().toString() + ": " + this.getAST().toString() } + final string toString() { result = this.getOpcode().toString() + ": " + this.getAst().toString() } /** * Gets a string showing the result, opcode, and operands of the instruction, equivalent to what @@ -136,7 +136,7 @@ class Instruction extends Construction::TStageInstruction { string getResultId() { this.shouldGenerateDumpStrings() and result = - this.getResultPrefix() + this.getAST().getLocation().getStartLine() + "_" + this.getLineRank() + this.getResultPrefix() + this.getAst().getLocation().getStartLine() + "_" + this.getLineRank() } /** @@ -208,12 +208,15 @@ class Instruction extends Construction::TStageInstruction { /** * Gets the AST that caused this instruction to be generated. */ - final Language::AST getAST() { result = Construction::getInstructionAST(this) } + final Language::AST getAst() { result = Construction::getInstructionAst(this) } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Gets the location of the source code for this instruction. */ - final Language::Location getLocation() { result = this.getAST().getLocation() } + final Language::Location getLocation() { result = this.getAst().getLocation() } /** * Gets the `Expr` whose result is computed by this instruction, if any. The `Expr` may be a @@ -459,7 +462,10 @@ class VariableInstruction extends Instruction { /** * Gets the AST variable that this instruction's IR variable refers to, if one exists. */ - final Language::Variable getASTVariable() { result = var.(IRUserVariable).getVariable() } + final Language::Variable getAstVariable() { result = var.(IRUserVariable).getVariable() } + + /** DEPRECATED: Alias for getAstVariable */ + deprecated Language::Variable getASTVariable() { result = this.getAstVariable() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll index 89b82657c3b..c1e997d5844 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll @@ -18,7 +18,7 @@ private import internal.OperandInternal * of `TOperand` that are used in this stage. */ private class TStageOperand = - TRegisterOperand or TNonSSAMemoryOperand or TPhiOperand or TChiOperand; + TRegisterOperand or TNonSsaMemoryOperand or TPhiOperand or TChiOperand; /** * A known location. Testing `loc instanceof KnownLocation` will account for non existing locations, as @@ -38,7 +38,7 @@ class Operand extends TStageOperand { // Ensure that the operand does not refer to instructions from earlier stages that are unreachable here exists(Instruction use, Instruction def | this = registerOperand(use, _, def)) or - exists(Instruction use | this = nonSSAMemoryOperand(use, _)) + exists(Instruction use | this = nonSsaMemoryOperand(use, _)) or exists(Instruction use, Instruction def, IRBlock predecessorBlock | this = phiOperand(use, def, predecessorBlock, _) or @@ -209,7 +209,7 @@ class Operand extends TStageOperand { class MemoryOperand extends Operand { cached MemoryOperand() { - this instanceof TNonSSAMemoryOperand or + this instanceof TNonSsaMemoryOperand or this instanceof TPhiOperand or this instanceof TChiOperand } @@ -249,7 +249,7 @@ class NonPhiOperand extends Operand { NonPhiOperand() { this = registerOperand(useInstr, tag, _) or - this = nonSSAMemoryOperand(useInstr, tag) or + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } @@ -299,7 +299,7 @@ class NonPhiMemoryOperand extends NonPhiOperand, MemoryOperand, TNonPhiMemoryOpe cached NonPhiMemoryOperand() { - this = nonSSAMemoryOperand(useInstr, tag) + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll index 796fb792366..ca3c378cd7e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll @@ -34,7 +34,7 @@ class ValueNumber extends TValueNumber { final Instruction getAnInstruction() { this = valueNumber(result) } /** - * Gets one of the instructions that was assigned this value number. The chosen instuction is + * Gets one of the instructions that was assigned this value number. The chosen instruction is * deterministic but arbitrary. Intended for use only in debugging. */ final Instruction getExampleInstruction() { 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 2467d961892..2dc735f49df 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 @@ -99,13 +99,19 @@ private predicate filteredNumberableInstruction(Instruction instr) { // count rather than strictcount to handle missing AST elements // separate instanceof and inline casts to avoid failed casts with a count of 0 instr instanceof VariableAddressInstruction and - count(instr.(VariableAddressInstruction).getIRVariable().getAST()) != 1 + count(instr.(VariableAddressInstruction).getIRVariable().getAst()) != 1 or instr instanceof ConstantInstruction and count(instr.getResultIRType()) != 1 or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // 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. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAst()) = ast } private predicate initializeParameterValueNumber( @@ -126,15 +131,14 @@ private predicate initializeParameterValueNumber( // 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. - instr.getIRVariable().getAST() = var + instr.getIRVariable().getAst() = var } private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll index 80e06a381a1..369f7c317f9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll @@ -1,2 +1,2 @@ private import semmle.code.cpp.ir.implementation.internal.TOperand -import UnaliasedSSAOperands +import UnaliasedSsaOperands diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll index 72bb239c153..c7487872512 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll @@ -2,7 +2,7 @@ private import SSAConstructionInternal private import OldIR private import Alias private import SSAConstruction -private import DebugSSA +private import DebugSsa bindingset[offset] private string getKeySuffixForOffset(int offset) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll index 5686bb439eb..1c75529be00 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll @@ -1,2 +1,2 @@ private import SSAConstruction as SSA -import SSA::SSAConsistency +import SSA::SsaConsistency diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll index 5092e921cb3..303a9683011 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll @@ -112,7 +112,7 @@ private module Cached { exists(Alias::getResultMemoryLocation(oldInstruction)) or // This result was already modeled by a previous iteration of SSA. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) } cached @@ -182,7 +182,7 @@ private module Cached { * unreachable, this predicate will recurse through any degenerate `Phi` instructions to find the * true definition. */ - private Instruction getNewDefinitionFromOldSSA(OldIR::MemoryOperand oldOperand, Overlap overlap) { + private Instruction getNewDefinitionFromOldSsa(OldIR::MemoryOperand oldOperand, Overlap overlap) { exists(Overlap originalOverlap | originalOverlap = oldOperand.getDefinitionOverlap() and ( @@ -191,7 +191,7 @@ private module Cached { or exists(OldIR::PhiInputOperand phiOperand, Overlap phiOperandOverlap | phiOperand = getDegeneratePhiOperand(oldOperand.getAnyDef()) and - result = getNewDefinitionFromOldSSA(phiOperand, phiOperandOverlap) and + result = getNewDefinitionFromOldSsa(phiOperand, phiOperandOverlap) and overlap = combineOverlap(pragma[only_bind_out](phiOperandOverlap), pragma[only_bind_out](originalOverlap)) @@ -233,7 +233,7 @@ private module Cached { ) or exists(OldIR::NonPhiMemoryOperand oldOperand | - result = getNewDefinitionFromOldSSA(oldOperand, overlap) and + result = getNewDefinitionFromOldSsa(oldOperand, overlap) and oldOperand.getUse() = instruction and tag = oldOperand.getOperandTag() ) @@ -307,13 +307,13 @@ private module Cached { * Gets the new definition instruction for the operand of `instr` that flows from the block * `newPredecessorBlock`, based on that operand's definition in the old IR. */ - private Instruction getNewPhiOperandDefinitionFromOldSSA( + private Instruction getNewPhiOperandDefinitionFromOldSsa( Instruction instr, IRBlock newPredecessorBlock, Overlap overlap ) { exists(OldIR::PhiInstruction oldPhi, OldIR::PhiInputOperand oldOperand | oldPhi = getOldInstruction(instr) and oldOperand = oldPhi.getInputOperand(getOldBlock(newPredecessorBlock)) and - result = getNewDefinitionFromOldSSA(oldOperand, overlap) + result = getNewDefinitionFromOldSsa(oldOperand, overlap) ) } @@ -333,7 +333,7 @@ private module Cached { overlap = Alias::getOverlap(actualDefLocation, useLocation) ) or - result = getNewPhiOperandDefinitionFromOldSSA(instr, newPredecessorBlock, overlap) + result = getNewPhiOperandDefinitionFromOldSsa(instr, newPredecessorBlock, overlap) } cached @@ -412,17 +412,17 @@ private module Cached { } cached - Language::AST getInstructionAST(Instruction instr) { - result = getOldInstruction(instr).getAST() + Language::AST getInstructionAst(Instruction instr) { + result = getOldInstruction(instr).getAst() or exists(RawIR::Instruction blockStartInstr | instr = phiInstruction(blockStartInstr, _) and - result = blockStartInstr.getAST() + result = blockStartInstr.getAst() ) or exists(RawIR::Instruction primaryInstr | instr = chiInstruction(primaryInstr) and - result = primaryInstr.getAST() + result = primaryInstr.getAst() ) or exists(IRFunctionBase irFunc | @@ -430,6 +430,12 @@ private module Cached { ) } + /** DEPRECATED: Alias for getInstructionAst */ + cached + deprecated Language::AST getInstructionAST(Instruction instr) { + result = getInstructionAst(instr) + } + cached Language::LanguageType getInstructionResultType(Instruction instr) { result = instr.(RawIR::Instruction).getResultLanguageType() @@ -975,35 +981,41 @@ module DefUse { } } -predicate canReuseSSAForMemoryResult(Instruction instruction) { +predicate canReuseSsaForMemoryResult(Instruction instruction) { exists(OldInstruction oldInstruction | oldInstruction = getOldInstruction(instruction) and ( // The previous iteration said it was reusable, so we should mark it as reusable as well. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) or // The current alias analysis says it is reusable. - Alias::getResultMemoryLocation(oldInstruction).canReuseSSA() + Alias::getResultMemoryLocation(oldInstruction).canReuseSsa() ) ) or exists(Alias::MemoryLocation defLocation | // This is a `Phi` for a reusable location, so the result of the `Phi` is reusable as well. instruction = phiInstruction(_, defLocation) and - defLocation.canReuseSSA() + defLocation.canReuseSsa() ) // We don't support reusing SSA for any location that could create a `Chi` instruction. } +/** DEPRECATED: Alias for canReuseSsaForMemoryResult */ +deprecated predicate canReuseSSAForMemoryResult = canReuseSsaForMemoryResult/1; + /** - * Expose some of the internal predicates to PrintSSA.qll. We do this by publically importing those modules in the + * Expose some of the internal predicates to PrintSSA.qll. We do this by publicly importing those modules in the * `DebugSSA` module, which is then imported by PrintSSA. */ -module DebugSSA { +module DebugSsa { import PhiInsertion import DefUse } +/** DEPRECATED: Alias for DebugSsa */ +deprecated module DebugSSA = DebugSsa; + import CachedForDebugging cached @@ -1038,7 +1050,7 @@ private module CachedForDebugging { private OldIR::IRTempVariable getOldTempVariable(IRTempVariable var) { result.getEnclosingFunction() = var.getEnclosingFunction() and - result.getAST() = var.getAST() and + result.getAst() = var.getAst() and result.getTag() = var.getTag() } @@ -1061,7 +1073,7 @@ private module CachedForDebugging { int maxValue() { result = 2147483647 } } -module SSAConsistency { +module SsaConsistency { /** * Holds if a `MemoryOperand` has more than one `MemoryLocation` assigned by alias analysis. */ @@ -1114,6 +1126,9 @@ module SSAConsistency { } } +/** DEPRECATED: Alias for SsaConsistency */ +deprecated module SSAConsistency = SsaConsistency; + /** * Provides the portion of the parameterized IR interface that is used to construct the SSA stages * of the IR. The raw stage of the IR does not expose these predicates. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll index 70d44e03267..8f64bff29f2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll @@ -3,7 +3,7 @@ import semmle.code.cpp.ir.implementation.raw.internal.reachability.ReachableBloc import semmle.code.cpp.ir.implementation.raw.internal.reachability.Dominance as Dominance import semmle.code.cpp.ir.implementation.unaliased_ssa.IR as NewIR import semmle.code.cpp.ir.implementation.raw.internal.IRConstruction as RawStage -import semmle.code.cpp.ir.implementation.internal.TInstruction::UnaliasedSSAInstructions as SSAInstructions +import semmle.code.cpp.ir.implementation.internal.TInstruction::UnaliasedSsaInstructions as SSAInstructions import semmle.code.cpp.ir.internal.IRCppLanguage as Language import SimpleSSA as Alias -import semmle.code.cpp.ir.implementation.internal.TOperand::UnaliasedSSAOperands as SSAOperands +import semmle.code.cpp.ir.implementation.internal.TOperand::UnaliasedSsaOperands as SSAOperands diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll index f3e02c9f6a8..ec2e6f5ef34 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll @@ -41,11 +41,14 @@ predicate isVariableModeled(Allocation var) { * subsequent iterations will recompute SSA for any variable that we assumed did not escape, but * actually would have escaped if we had used a sound escape analysis. */ -predicate canReuseSSAForVariable(IRAutomaticVariable var) { +predicate canReuseSsaForVariable(IRAutomaticVariable var) { isVariableModeled(var) and not allocationEscapes(var) } +/** DEPRECATED: Alias for canReuseSsaForVariable */ +deprecated predicate canReuseSSAForVariable = canReuseSsaForVariable/1; + private newtype TMemoryLocation = MkMemoryLocation(Allocation var) { isVariableModeled(var) } private MemoryLocation getMemoryLocation(Allocation var) { result.getAllocation() = var } @@ -69,10 +72,16 @@ class MemoryLocation extends TMemoryLocation { final string getUniqueId() { result = var.getUniqueId() } - final predicate canReuseSSA() { canReuseSSAForVariable(var) } + final predicate canReuseSsa() { canReuseSsaForVariable(var) } + + /** DEPRECATED: Alias for canReuseSsa */ + deprecated predicate canReuseSSA() { canReuseSsa() } } -predicate canReuseSSAForOldResult(Instruction instr) { none() } +predicate canReuseSsaForOldResult(Instruction instr) { none() } + +/** DEPRECATED: Alias for canReuseSsaForOldResult */ +deprecated predicate canReuseSSAForOldResult = canReuseSsaForOldResult/1; /** * Represents a set of `MemoryLocation`s that cannot overlap with diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll index cee8fa1543b..aaa4cc7bd53 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll @@ -1,7 +1,5 @@ private import ReachableBlock as Reachability -private module ReachabilityGraph = Reachability::Graph; - module Graph { import Reachability::Graph diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll index 2ce23f098a2..f3130baec4e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll @@ -141,7 +141,7 @@ private predicate isOpaqueType(Type type) { * Holds if an `IROpaqueType` with the specified `tag` and `byteSize` should exist. */ predicate hasOpaqueType(Type tag, int byteSize) { - isOpaqueType(tag) and byteSize = getTypeSize(tag) + isOpaqueType(tag) and byteSize = getTypeSize(tag.getUnspecifiedType()) or tag instanceof UnknownType and Raw::needsUnknownOpaqueType(byteSize) } @@ -153,17 +153,18 @@ private IRType getIRTypeForPRValue(Type type) { exists(Type unspecifiedType | unspecifiedType = type.getUnspecifiedType() | isOpaqueType(unspecifiedType) and exists(IROpaqueType opaqueType | opaqueType = result | - opaqueType.getByteSize() = getTypeSize(type) and + opaqueType.getByteSize() = getTypeSize(unspecifiedType) and opaqueType.getTag() = unspecifiedType ) or - unspecifiedType instanceof BoolType and result.(IRBooleanType).getByteSize() = type.getSize() + unspecifiedType instanceof BoolType and + result.(IRBooleanType).getByteSize() = unspecifiedType.getSize() or isSignedIntegerType(unspecifiedType) and - result.(IRSignedIntegerType).getByteSize() = type.getSize() + result.(IRSignedIntegerType).getByteSize() = unspecifiedType.getSize() or isUnsignedIntegerType(unspecifiedType) and - result.(IRUnsignedIntegerType).getByteSize() = type.getSize() + result.(IRUnsignedIntegerType).getByteSize() = unspecifiedType.getSize() or exists(FloatingPointType floatType, IRFloatingPointType irFloatType | floatType = unspecifiedType and @@ -173,7 +174,8 @@ private IRType getIRTypeForPRValue(Type type) { irFloatType.getDomain() = floatType.getDomain() ) or - isPointerIshType(unspecifiedType) and result.(IRAddressType).getByteSize() = getTypeSize(type) + isPointerIshType(unspecifiedType) and + result.(IRAddressType).getByteSize() = getTypeSize(unspecifiedType) or unspecifiedType instanceof FunctionPointerIshType and result.(IRFunctionAddressType).getByteSize() = getTypeSize(type) 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 6b2b4c918af..1415cdc9c5b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll @@ -11,6 +11,15 @@ private Type getDecayedType(Type type) { result.(PointerType).getBaseType() = type.(ArrayType).getBaseType() } +/** + * Holds if the sepcified variable is a structured binding with a non-reference + * type. + */ +predicate isNonReferenceStructuredBinding(Variable v) { + v.isStructuredBinding() and + not v.getUnspecifiedType() instanceof ReferenceType +} + /** * Get the actual type of the specified variable, as opposed to the declared type. * This returns the type of the variable after any pointer decay is applied, and @@ -30,7 +39,12 @@ Type getVariableType(Variable v) { result = v.getInitializer().getExpr().getType() or not exists(v.getInitializer()) and result = v.getType() - else result = v.getType() + else + if isNonReferenceStructuredBinding(v) + then + // The extractor ensures `r` exists when `isNonReferenceStructuredBinding(v)` holds. + exists(LValueReferenceType r | r.getBaseType() = v.getUnspecifiedType() | result = r) + else result = v.getType() ) } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll index 1da6e3b0b3b..892673ff1c8 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll @@ -42,10 +42,13 @@ private class MallocAllocationFunction extends AllocationFunction { this.hasGlobalName([ // --- Windows Memory Management for Windows Drivers "ExAllocatePool", // ExAllocatePool(type, size) + "ExAllocatePool2", // ExAllocatePool2(flags, size, tag) + "ExAllocatePool3", // ExAllocatePool3(flags, size, tag, extparams, extparamscount) "ExAllocatePoolWithTag", // ExAllocatePool(type, size, tag) "ExAllocatePoolWithTagPriority", // ExAllocatePoolWithTagPriority(type, size, tag, priority) "ExAllocatePoolWithQuota", // ExAllocatePoolWithQuota(type, size) "ExAllocatePoolWithQuotaTag", // ExAllocatePoolWithQuotaTag(type, size, tag) + "ExAllocatePoolZero", // ExAllocatePoolZero(type, size, tag) "IoAllocateMdl", // IoAllocateMdl(address, size, flag, flag, irp) "IoAllocateErrorLogEntry", // IoAllocateErrorLogEntry(object, size) // --- Windows Global / Local legacy allocation diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll index ed201a14587..e360fa7b2bb 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll @@ -23,8 +23,6 @@ private class Printf extends FormattingFunction, AliasFunction { override int getFormatParameterIndex() { result = 0 } - deprecated override predicate isWideCharDefault() { hasName(["wprintf", "wprintf_s"]) } - override predicate isOutputGlobal() { any() } override predicate parameterNeverEscapes(int n) { n = 0 } @@ -49,8 +47,6 @@ private class Fprintf extends FormattingFunction { override int getFormatParameterIndex() { result = 1 } - deprecated override predicate isWideCharDefault() { hasName("fwprintf") } - override int getOutputParameterIndex(boolean isStream) { result = 0 and isStream = true } } @@ -77,15 +73,6 @@ private class Sprintf extends FormattingFunction { not exists(getDefinition().getFile().getRelativePath()) } - deprecated override predicate isWideCharDefault() { - getParameter(getFormatParameterIndex()) - .getType() - .getUnspecifiedType() - .(PointerType) - .getBaseType() - .getSize() > 1 - } - override int getFormatParameterIndex() { hasName("g_strdup_printf") and result = 0 or @@ -133,15 +120,6 @@ private class SnprintfImpl extends Snprintf { else result = getFirstFormatArgumentIndex() - 1 } - deprecated override predicate isWideCharDefault() { - getParameter(getFormatParameterIndex()) - .getType() - .getUnspecifiedType() - .(PointerType) - .getBaseType() - .getSize() > 1 - } - override int getOutputParameterIndex(boolean isStream) { result = 0 and isStream = false } override int getFirstFormatArgumentIndex() { @@ -182,15 +160,6 @@ private class StringCchPrintf extends FormattingFunction { if getName().matches("%Ex") then result = 5 else result = 2 } - deprecated override predicate isWideCharDefault() { - getParameter(getFormatParameterIndex()) - .getType() - .getUnspecifiedType() - .(PointerType) - .getBaseType() - .getSize() > 1 - } - override int getOutputParameterIndex(boolean isStream) { result = 0 and isStream = false } override int getSizeParameterIndex() { result = 1 } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll index f2cb6498819..f2759e4a737 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll @@ -5,7 +5,6 @@ import semmle.code.cpp.Function import semmle.code.cpp.models.interfaces.ArrayFunction -import semmle.code.cpp.models.interfaces.ArrayFunction import semmle.code.cpp.models.interfaces.Alias import semmle.code.cpp.models.interfaces.SideEffect import semmle.code.cpp.models.interfaces.Taint diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll index 9630bb13e18..5f128bc55e8 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll @@ -52,14 +52,6 @@ abstract class FormattingFunction extends ArrayFunction, TaintFunction { */ predicate isMicrosoft() { anyFileCompiledAsMicrosoft() } - /** - * Holds if the default meaning of `%s` is a `wchar_t *`, rather than - * a `char *` (either way, `%S` will have the opposite meaning). - * - * DEPRECATED: Use getDefaultCharType() instead. - */ - deprecated predicate isWideCharDefault() { none() } - /** * Gets the character type used in the format string for this function. */ @@ -100,6 +92,7 @@ abstract class FormattingFunction extends ArrayFunction, TaintFunction { * snapshots there may be multiple results where we can't tell which is correct for a * particular function. */ + pragma[nomagic] Type getWideCharType() { result = getFormatCharType() and result.getSize() > 1 @@ -116,13 +109,6 @@ abstract class FormattingFunction extends ArrayFunction, TaintFunction { */ int getOutputParameterIndex(boolean isStream) { none() } - /** - * Gets the position at which the output parameter, if any, occurs. - * - * DEPRECATED: use `getOutputParameterIndex(boolean isStream)` instead. - */ - deprecated int getOutputParameterIndex() { result = getOutputParameterIndex(_) } - /** * Holds if this function outputs to a global stream such as standard output, * standard error or a system log. For example `printf`. diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll index d2d2fbd5b3c..02cd5cb7876 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll @@ -29,8 +29,8 @@ private import RangeAnalysisUtils * The SSA logic comes in two versions: the standard SSA and range-analysis RangeSSA. * This class provides the range-analysis SSA logic. */ -library class RangeSSA extends SSAHelper { - RangeSSA() { this = 1 } +library class RangeSsa extends SsaHelper { + RangeSsa() { this = 1 } /** * Add a phi node on the out-edge of a guard. @@ -40,6 +40,9 @@ library class RangeSSA extends SSAHelper { } } +/** DEPRECATED: Alias for RangeSsa */ +deprecated class RangeSSA = RangeSsa; + private predicate guard_defn(VariableAccess v, Expr guard, BasicBlock b, boolean branch) { guardCondition(guard, v, branch) and guardSuccessor(guard, branch, b) @@ -67,22 +70,22 @@ private predicate guardSuccessor(Expr guard, boolean branch, BasicBlock succ) { * nodes. */ class RangeSsaDefinition extends ControlFlowNodeBase { - RangeSsaDefinition() { exists(RangeSSA x | x.ssa_defn(_, this, _, _)) } + RangeSsaDefinition() { exists(RangeSsa x | x.ssa_defn(_, this, _, _)) } /** * Gets a variable corresponding to a SSA StackVariable defined by * this definition. */ - StackVariable getAVariable() { exists(RangeSSA x | x.ssa_defn(result, this, _, _)) } + StackVariable getAVariable() { exists(RangeSsa x | x.ssa_defn(result, this, _, _)) } /** * A string representation of the SSA variable represented by the pair * `(this, v)`. */ - string toString(StackVariable v) { exists(RangeSSA x | result = x.toString(this, v)) } + string toString(StackVariable v) { exists(RangeSsa x | result = x.toString(this, v)) } /** Gets a use of the SSA variable represented by the pair `(this, v)`. */ - VariableAccess getAUse(StackVariable v) { exists(RangeSSA x | result = x.getAUse(this, v)) } + VariableAccess getAUse(StackVariable v) { exists(RangeSsa x | result = x.getAUse(this, v)) } /** Gets the control flow node for this definition. */ ControlFlowNode getDefinition() { result = this } @@ -91,7 +94,7 @@ class RangeSsaDefinition extends ControlFlowNodeBase { BasicBlock getBasicBlock() { result.contains(this.getDefinition()) } /** Whether this definition is a phi node for variable `v`. */ - predicate isPhiNode(StackVariable v) { exists(RangeSSA x | x.phi_node(v, this)) } + predicate isPhiNode(StackVariable v) { exists(RangeSsa x | x.phi_node(v, this)) } /** * DEPRECATED: Use isGuardPhi/4 instead @@ -172,6 +175,6 @@ class RangeSsaDefinition extends ControlFlowNodeBase { * Holds if this definition of the variable `v` reached the end of the basic block `b`. */ predicate reachesEndOfBB(StackVariable v, BasicBlock b) { - exists(RangeSSA x | x.ssaDefinitionReachesEndOfBB(v, this, b)) + exists(RangeSsa x | x.ssaDefinitionReachesEndOfBB(v, this, b)) } } diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll index 0be94ed4e62..c9e790d9077 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll @@ -705,24 +705,6 @@ private float getTruncatedUpperBounds(Expr expr) { result = exprMaxVal(expr) } -/** - * Holds if the expression might overflow negatively. This predicate - * does not consider the possibility that the expression might overflow - * due to a conversion. - * - * DEPRECATED: use `exprMightOverflowNegatively` instead. - */ -deprecated predicate negative_overflow(Expr expr) { exprMightOverflowNegatively(expr) } - -/** - * Holds if the expression might overflow positively. This predicate - * does not consider the possibility that the expression might overflow - * due to a conversion. - * - * DEPRECATED: use `exprMightOverflowPositively` instead. - */ -deprecated predicate positive_overflow(Expr expr) { exprMightOverflowPositively(expr) } - /** Only to be called by `getTruncatedLowerBounds`. */ private float getLowerBoundsImpl(Expr expr) { ( @@ -1820,5 +1802,3 @@ module SimpleRangeAnalysisInternal { defMightOverflowNegatively(def, v) and result = varMaxVal(v) } } - -private import SimpleRangeAnalysisInternal diff --git a/cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll index a980de9785d..a112f5a3371 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll @@ -6,7 +6,6 @@ */ import cpp -import semmle.code.cpp.commons.Alloc import semmle.code.cpp.commons.Buffer import semmle.code.cpp.commons.Scanf import semmle.code.cpp.models.implementations.Strcat @@ -156,7 +155,7 @@ class StrCopyBW extends BufferWriteCall { // when result exists, it is an exact flow analysis reason instanceof ValueFlowAnalysis and result = - this.getArgument(this.getParamSrc()).(AnalysedString).getMaxLength() * this.getCharSize() + this.getArgument(this.getParamSrc()).(AnalyzedString).getMaxLength() * this.getCharSize() } override int getMaxData(BufferWriteEstimationReason reason) { @@ -202,7 +201,7 @@ class StrCatBW extends BufferWriteCall { // when result exists, it is an exact flow analysis reason instanceof ValueFlowAnalysis and result = - this.getArgument(this.getParamSrc()).(AnalysedString).getMaxLength() * this.getCharSize() + this.getArgument(this.getParamSrc()).(AnalyzedString).getMaxLength() * this.getCharSize() } override int getMaxData(BufferWriteEstimationReason reason) { diff --git a/cpp/ql/lib/semmle/code/cpp/security/Encryption.qll b/cpp/ql/lib/semmle/code/cpp/security/Encryption.qll index 55ef606483c..00be9a3deb5 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/Encryption.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/Encryption.qll @@ -59,7 +59,7 @@ predicate isInsecureEncryption(string name) { name.regexpMatch(getInsecureAlgori /** * Holds if there is additional evidence that `name` looks like it might be * related to operations with an encyption algorithm, besides the name of a - * specific algorithm. This can be used in conjuction with + * specific algorithm. This can be used in conjunction with * `isInsecureEncryption` to produce a stronger heuristic. */ bindingset[name] @@ -84,31 +84,3 @@ string getSecureAlgorithmRegex() { "(^|.*[A-Z]{2}|.*[^a-zA-Z0-9])(" + strictconcat(getASecureAlgorithmName().toLowerCase(), "|") + ")([^a-z0-9].*|$)" } - -/** - * DEPRECATED: Terminology has been updated. Use `getAnInsecureAlgorithmName()` - * instead. - */ -deprecated string algorithmBlacklist() { result = getAnInsecureAlgorithmName() } - -/** - * DEPRECATED: Terminology has been updated. Use - * `getAnInsecureHashAlgorithmName()` instead. - */ -deprecated string hashAlgorithmBlacklist() { result = getAnInsecureHashAlgorithmName() } - -/** - * DEPRECATED: Terminology has been updated. Use `getInsecureAlgorithmRegex()` instead. - */ -deprecated string algorithmBlacklistRegex() { result = getInsecureAlgorithmRegex() } - -/** - * DEPRECATED: Terminology has been updated. Use `getASecureAlgorithmName()` - * instead. - */ -deprecated string algorithmWhitelist() { result = getASecureAlgorithmName() } - -/** - * DEPRECATED: Terminology has been updated. Use `getSecureAlgorithmRegex()` instead. - */ -deprecated string algorithmWhitelistRegex() { result = getSecureAlgorithmRegex() } diff --git a/cpp/ql/lib/semmle/code/cpp/security/Overflow.qll b/cpp/ql/lib/semmle/code/cpp/security/Overflow.qll index a18b30146ec..4d6d22c086a 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/Overflow.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/Overflow.qll @@ -5,8 +5,6 @@ import cpp import semmle.code.cpp.controlflow.Dominance -// `GlobalValueNumbering` is only imported to prevent IR re-evaluation. -private import semmle.code.cpp.valuenumbering.GlobalValueNumbering import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils import semmle.code.cpp.controlflow.Guards @@ -25,6 +23,7 @@ predicate guardedAbs(Operation e, Expr use) { * Holds if the value of `use` is guarded to be less than something, and `e` * is in code controlled by that guard (where the guard condition held). */ +pragma[nomagic] predicate guardedLesser(Operation e, Expr use) { exists(GuardCondition c | c.ensuresLt(use, _, _, e.getBasicBlock(), true)) or @@ -35,6 +34,7 @@ predicate guardedLesser(Operation e, Expr use) { * Holds if the value of `use` is guarded to be greater than something, and `e` * is in code controlled by that guard (where the guard condition held). */ +pragma[nomagic] predicate guardedGreater(Operation e, Expr use) { exists(GuardCondition c | c.ensuresLt(use, _, _, e.getBasicBlock(), false)) or diff --git a/cpp/ql/lib/semmle/code/cpp/security/PrivateData.qll b/cpp/ql/lib/semmle/code/cpp/security/PrivateData.qll new file mode 100644 index 00000000000..7bb05a25a3c --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/security/PrivateData.qll @@ -0,0 +1,71 @@ +/** + * Provides classes for heuristically identifying variables and functions that + * might contain or return sensitive private data. + * + * 'Private' data in general is anything that would compromise user privacy if + * exposed. This library tries to guess where private data may either be stored + * in a variable or returned by a function call. + * + * This library is not concerned with credentials. See `SensitiveExprs.qll` for + * expressions related to credentials. + */ + +import cpp + +/** + * A string for `regexpMatch` that identifies strings that look like they + * represent private data. + */ +private string privateNames() { + result = + ".*(" + + // Inspired by the list on https://cwe.mitre.org/data/definitions/359.html + // Government identifiers, such as Social Security Numbers + "social.?security|national.?insurance|" + + // Contact information, such as home addresses + "post.?code|zip.?code|home.?address|" + + // and telephone numbers + "telephone|home.?phone|mobile|fax.?no|fax.?number|" + + // Geographic location - where the user is (or was) + "latitude|longitude|" + + // Financial data - such as credit card numbers, salary, bank accounts, and debts + "credit.?card|debit.?card|salary|bank.?account|" + + // Communications - e-mail addresses, private e-mail messages, SMS text messages, chat logs, etc. + "email|" + + // Health - medical conditions, insurance status, prescription records + "birthday|birth.?date|date.?of.?birth|medical|" + + // Relationships - work and family + "employer|spouse" + + // --- + ").*" +} + +/** + * A variable that might contain sensitive private information. + */ +class PrivateDataVariable extends Variable { + PrivateDataVariable() { + this.getName().toLowerCase().regexpMatch(privateNames()) and + not this.getUnspecifiedType() instanceof IntegralType + } +} + +/** + * A function that might return sensitive private information. + */ +class PrivateDataFunction extends Function { + PrivateDataFunction() { + this.getName().toLowerCase().regexpMatch(privateNames()) and + not this.getUnspecifiedType() instanceof IntegralType + } +} + +/** + * An expression whose value might be sensitive private information. + */ +class PrivateDataExpr extends Expr { + PrivateDataExpr() { + this.(VariableAccess).getTarget() instanceof PrivateDataVariable or + this.(FunctionCall).getTarget() instanceof PrivateDataFunction + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll b/cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll index 389129835cb..3707021b685 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll @@ -1,22 +1,25 @@ /** * Provides classes for heuristically identifying variables and functions that - * might contain or return a password or other sensitive information. + * might contain or return a password or other credential. + * + * This library is not concerned with other kinds of sensitive private + * information. See `PrivateData.qll` for expressions related to that. */ import cpp /** * Holds if the name `s` suggests something might contain or return a password - * or other sensitive information. + * or other credential. */ bindingset[s] private predicate suspicious(string s) { - s.matches(["%password%", "%passwd%", "%trusted%"]) and - not s.matches(["%hash%", "%crypt%", "%file%", "%path%"]) + s.regexpMatch(".*(password|passwd|accountid|account.?key|accnt.?key|license.?key|trusted).*") and + not s.matches(["%hash%", "%crypt%", "%file%", "%path%", "%invalid%"]) } /** - * A variable that might contain a password or other sensitive information. + * A variable that might contain a password or other credential. */ class SensitiveVariable extends Variable { SensitiveVariable() { @@ -26,7 +29,7 @@ class SensitiveVariable extends Variable { } /** - * A function that might return a password or other sensitive information. + * A function that might return a password or other credential. */ class SensitiveFunction extends Function { SensitiveFunction() { @@ -36,7 +39,7 @@ class SensitiveFunction extends Function { } /** - * An expression whose value might be a password or other sensitive information. + * An expression whose value might be a password or other credential. */ class SensitiveExpr extends Expr { SensitiveExpr() { diff --git a/cpp/ql/lib/semmle/code/cpp/stmts/Block.qll b/cpp/ql/lib/semmle/code/cpp/stmts/Block.qll index 5fe8798cebb..871709de119 100644 --- a/cpp/ql/lib/semmle/code/cpp/stmts/Block.qll +++ b/cpp/ql/lib/semmle/code/cpp/stmts/Block.qll @@ -126,9 +126,3 @@ class BlockStmt extends Stmt, @stmt_block { override predicate mayBeGloballyImpure() { this.getAStmt().mayBeGloballyImpure() } } - -/** - * DEPRECATED: This is now called `BlockStmt` to avoid confusion with - * `BasicBlock`. - */ -deprecated class Block = BlockStmt; diff --git a/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll b/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll index 5b157a54ce8..7ccd9f797dd 100644 --- a/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll @@ -61,13 +61,6 @@ class Stmt extends StmtParent, @stmt { override Location getLocation() { stmts(underlyingElement(this), _, result) } - /** - * Gets an int indicating the type of statement that this represents. - * - * DEPRECATED: use the subclasses of `Stmt` rather than relying on this predicate. - */ - deprecated int getKind() { stmts(underlyingElement(this), result, _) } - override string toString() { none() } override Function getControlFlowScope() { result = this.getEnclosingFunction() } @@ -220,6 +213,26 @@ class ConditionalStmt extends ControlStructure, TConditionalStmt { } class IfStmt extends ConditionalStmt, @stmt_if { override string getAPrimaryQlClass() { result = "IfStmt" } + /** + * Gets the initialization statement of this 'if' statement, if any. + * + * For example, for + * ``` + * if (int x = y; b) { f(); } + * ``` + * the result is `int x = y;`. + * + * Does not hold if the initialization statement is missing or an empty statement, as in + * ``` + * if (b) { f(); } + * ``` + * or + * ``` + * if (; b) { f(); } + * ``` + */ + Stmt getInitialization() { if_initialization(underlyingElement(this), unresolveElement(result)) } + /** * Gets the condition expression of this 'if' statement. * @@ -229,7 +242,7 @@ class IfStmt extends ConditionalStmt, @stmt_if { * ``` * the result is `b`. */ - Expr getCondition() { result = this.getChild(0) } + Expr getCondition() { result = this.getChild(1) } override Expr getControllingExpr() { result = this.getCondition() } @@ -306,6 +319,28 @@ class IfStmt extends ConditionalStmt, @stmt_if { class ConstexprIfStmt extends ConditionalStmt, @stmt_constexpr_if { override string getAPrimaryQlClass() { result = "ConstexprIfStmt" } + /** + * Gets the initialization statement of this 'constexpr if' statement, if any. + * + * For example, for + * ``` + * if constexpr (int x = y; b) { f(); } + * ``` + * the result is `int x = y;`. + * + * Does not hold if the initialization statement is missing or an empty statement, as in + * ``` + * if constexpr (b) { f(); } + * ``` + * or + * ``` + * if constexpr (; b) { f(); } + * ``` + */ + Stmt getInitialization() { + constexpr_if_initialization(underlyingElement(this), unresolveElement(result)) + } + /** * Gets the condition expression of this 'constexpr if' statement. * @@ -315,7 +350,7 @@ class ConstexprIfStmt extends ConditionalStmt, @stmt_constexpr_if { * ``` * the result is `b`. */ - Expr getCondition() { result = this.getChild(0) } + Expr getCondition() { result = this.getChild(1) } override Expr getControllingExpr() { result = this.getCondition() } @@ -933,7 +968,7 @@ class ForStmt extends Loop, @stmt_for { * * Does not hold if the initialization statement is an empty statement, as in * ``` - * for (; i < 10; i++) { j++ } + * for (; i < 10; i++) { j++; } * ``` */ Stmt getInitialization() { for_initialization(underlyingElement(this), unresolveElement(result)) } @@ -1230,38 +1265,6 @@ class SwitchCase extends Stmt, @stmt_switch_case { */ int getChildNum() { switch_case(_, result, underlyingElement(this)) } - /** - * DEPRECATED: use `SwitchCase.getAStmt` or `ControlFlowNode.getASuccessor` - * rather than this predicate. - * - * Gets the `BlockStmt` statement immediately following this 'switch case' - * statement, if any. - * - * For example, for - * ``` - * switch (i) { - * case 5: - * x = 1; - * break; - * case 6: - * case 7: - * { x = 2; break; } - * default: - * { x = 3; } - * x = 4; - * break; - * } - * ``` - * the `case 7:` has result `{ x = 2; break; }`, `default:` has result - * `{ x = 3; }`, and the others have no result. - */ - deprecated BlockStmt getLabelledStmt() { - exists(int i, Stmt parent | - this = parent.getChild(i) and - result = parent.getChild(i + 1) - ) - } - /** * Gets the next `SwitchCase` belonging to the same 'switch' * statement, if any. @@ -1509,6 +1512,28 @@ class DefaultCase extends SwitchCase { class SwitchStmt extends ConditionalStmt, @stmt_switch { override string getAPrimaryQlClass() { result = "SwitchStmt" } + /** + * Gets the initialization statement of this 'switch' statement, if any. + * + * For example, for + * ``` + * switch (int x = y; b) { } + * ``` + * the result is `int x = y;`. + * + * Does not hold if the initialization statement is missing or an empty statement, as in + * ``` + * switch (b) { } + * ``` + * or + * ``` + * switch (; b) { } + * ``` + */ + Stmt getInitialization() { + switch_initialization(underlyingElement(this), unresolveElement(result)) + } + /** * Gets the expression that this 'switch' statement switches on. * @@ -1524,7 +1549,7 @@ class SwitchStmt extends ConditionalStmt, @stmt_switch { * ``` * the result is `i`. */ - Expr getExpr() { result = this.getChild(0) } + Expr getExpr() { result = this.getChild(1) } override Expr getControllingExpr() { result = this.getExpr() } @@ -1741,23 +1766,6 @@ class Handler extends Stmt, @stmt_handler { override predicate mayBeGloballyImpure() { none() } } -/** - * DEPRECATED: Objective-C is no longer supported. - * The end of a 'finally' clause. - * - * This has no concrete representation in the source, but makes the - * control flow graph easier to use. - */ -deprecated class FinallyEnd extends Stmt { - FinallyEnd() { none() } - - override string toString() { result = "" } - - override predicate mayBeImpure() { none() } - - override predicate mayBeGloballyImpure() { none() } -} - /** * A C/C++ 'try' statement. * diff --git a/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll b/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll index f9231e24725..d5e69d31254 100644 --- a/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll @@ -89,7 +89,7 @@ private ControlFlowNode getControlFlowEntry(ControlFlowNode node) { * graph so that we can use the dominator tree to find the most recent * side-effect. */ -private predicate sideEffectCFG(ControlFlowNode src, ControlFlowNode dst) { +private predicate sideEffectCfg(ControlFlowNode src, ControlFlowNode dst) { src.getASuccessor() = dst or // Add an edge from the entry point to any node that might have a side @@ -103,7 +103,7 @@ private predicate sideEffectCFG(ControlFlowNode src, ControlFlowNode dst) { * the side-effect CFG. */ private predicate iDomEffect(ControlFlowNode dominator, ControlFlowNode node) = - idominance(functionEntry/1, sideEffectCFG/2)(_, dominator, node) + idominance(functionEntry/1, sideEffectCfg/2)(_, dominator, node) /** * Gets the most recent side effect. To be more precise, `result` is a diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index bb0f279f2ac..cf72c8898d1 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -703,7 +703,7 @@ usertype_final(unique int id: @usertype ref); usertype_uuid( unique int id: @usertype ref, - unique string uuid: string ref + string uuid: string ref ); mangled_name( @@ -1863,6 +1863,11 @@ variable_vla( int decl: @stmt_vla_decl ref ); +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + if_then( unique int if_stmt: @stmt_if ref, int then_id: @stmt ref @@ -1873,6 +1878,11 @@ if_else( int else_id: @stmt ref ); +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + constexpr_if_then( unique int constexpr_if_stmt: @stmt_constexpr_if ref, int then_id: @stmt ref @@ -1893,6 +1903,11 @@ do_body( int body_id: @stmt ref ); +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + #keyset[switch_stmt, index] switch_case( int switch_stmt: @stmt_switch ref, diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index 07abcbbef90..52676255dbd 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -1,39132 +1,39738 @@ - -@compilation -9440 - - -@externalDataElement -65 - - -@external_package -119 - - -@svnentry -575525 - - -@location_default -8719593 - - -@location_stmt -2179578 - - -@location_expr -9756708 - - -@diagnostic -67893 - - -@file -59320 - - -@folder -10817 - - -@macroinvocation -34675701 - - -@function -3658482 - - -@fun_decl -3730234 - - -@var_decl -5296821 - - -@type_decl -1316547 - - -@namespace_decl -135267 - - -@using -287692 - - -@static_assert -130452 - - -@parameter -4572935 - - -@membervariable -302107 - - -@globalvariable -301143 - - -@localvariable -520392 - - -@enumconstant -93691 - - -@builtintype -509 - - -@derivedtype -4408457 - - -@decltype -46454 - - -@usertype -4144306 - - -@mangledname -478020 - - -@type_mention -1674881 - - -@routinetype -421539 - - -@ptrtomember -12486 - - -@specifier -498 - - -@gnuattribute -414234 - - -@stdattribute -363 - - -@declspec -57736 - - -@msattribute -3 - - -@alignas -1723 - - -@attribute_arg_empty -1 - - -@attribute_arg_token -15700 - - -@attribute_arg_constant -146454 - - -@attribute_arg_type -54 - - -@derivation -385706 - - -@frienddecl -237444 - - -@comment -1561817 - - -@namespace -7597 - - -@specialnamequalifyingelement -10 - - -@namequalifier -1119060 - - -@value -8774622 - - -@initialiser -1662175 - - -@errorexpr -48145 - - -@address_of -440386 - - -@reference_to -1045861 - - -@indirect -294699 - - -@ref_indirect -1239321 - - -@array_to_pointer -997247 - - -@vacuous_destructor_call -5061 - - -@assume -3280 - - -@parexpr -3000807 - - -@arithnegexpr -652982 - - -@unaryplusexpr -184 - - -@complementexpr -28032 - - -@notexpr -338408 - - -@conjugation -1 - - -@realpartexpr -65 - - -@imagpartexpr -65 - - -@postincrexpr -43048 - - -@postdecrexpr -5402 - - -@preincrexpr -61791 - - -@predecrexpr -24506 - - -@conditionalexpr -154485 - - -@addexpr -246779 - - -@subexpr -135008 - - -@mulexpr -140641 - - -@divexpr -63732 - - -@remexpr -4539 - - -@jmulexpr -1 - - -@jdivexpr -1 - - -@fjaddexpr -1 - - -@jfaddexpr -1 - - -@fjsubexpr -1 - - -@jfsubexpr -1 - - -@paddexpr -87270 - - -@psubexpr -21970 - - -@pdiffexpr -24788 - - -@lshiftexpr -350576 - - -@rshiftexpr -71789 - - -@andexpr -257998 - - -@orexpr -143145 - - -@xorexpr -37313 - - -@eqexpr -212665 - - -@neexpr -88475 - - -@gtexpr -43945 - - -@ltexpr -51329 - - -@geexpr -22366 - - -@leexpr -213944 - - -@minexpr -1 - - -@maxexpr -1 - - -@assignexpr -551753 - - -@assignaddexpr -68313 - - -@assignsubexpr -7863 - - -@assignmulexpr -6828 - - -@assigndivexpr -2048 - - -@assignremexpr -270 - - -@assignlshiftexpr -598 - - -@assignrshiftexpr -4513 - - -@assignandexpr -7190 - - -@assignorexpr -17576 - - -@assignxorexpr -21997 - - -@assignpaddexpr -13024 - - -@assignpsubexpr -577 - - -@andlogicalexpr -130955 - - -@orlogicalexpr -74652 - - -@commaexpr -10611 - - -@subscriptexpr -166218 - - -@virtfunptrexpr -1 - - -@callexpr -224123 - - -@vastartexpr -3657 - - -@vaargexpr -975 - - -@vaendexpr -491 - - -@vacopyexpr -30 - - -@varaccess -5309798 - - -@thisaccess -1165266 - - -@new_expr -31757 - - -@delete_expr -5896 - - -@throw_expr -22056 - - -@condition_decl -6947 - - -@braced_init_list -119 - - -@type_id -4368 - - -@runtime_sizeof -279225 - - -@runtime_alignof -1561 - - -@sizeof_pack -466 - - -@expr_stmt -156574 - - -@routineexpr -2239747 - - -@type_operand -123457 - - -@offsetofexpr -33641 - - -@hasassignexpr -2 - - -@hascopyexpr -2 - - -@hasnothrowassign -3 - - -@hasnothrowconstr -3 - - -@hasnothrowcopy -5 - - -@hastrivialassign -2 - - -@hastrivialconstr -3 - - -@hastrivialcopy -2 - - -@hasuserdestr -3 - - -@hasvirtualdestr -3 - - -@isabstractexpr -3 - - -@isbaseofexpr -38 - - -@isclassexpr -214 - - -@isconvtoexpr -12 - - -@isemptyexpr -162 - - -@isenumexpr -21 - - -@ispodexpr -596 - - -@ispolyexpr -3 - - -@isunionexpr -5 - - -@typescompexpr -44908 - - -@intaddrexpr -1 - - -@hastrivialdestructor -108 - - -@literal -4380637 - - -@uuidof -844 - - -@aggregateliteral -915561 - - -@delete_array_expr -1333 - - -@new_array_expr -5287 - - -@foldexpr -4 - - -@ctordirectinit -89137 - - -@ctorvirtualinit -6156 - - -@ctorfieldinit -193753 - - -@ctordelegatinginit -726 - - -@dtordirectdestruct -28798 - - -@dtorvirtualdestruct -2406 - - -@dtorfielddestruct -29557 - - -@static_cast -212243 - - -@reinterpret_cast -30758 - - -@const_cast -5245 - - -@dynamic_cast -975 - - -@c_style_cast -4235362 - - -@lambdaexpr -12660 - - -@param_ref -84888 - - -@noopexpr -38 - - -@istriviallyconstructibleexpr -3 - - -@isdestructibleexpr -4 - - -@isnothrowdestructibleexpr -5 - - -@istriviallydestructibleexpr -5 - - -@istriviallyassignableexpr -3 - - -@isnothrowassignableexpr -3 - - -@istrivialexpr -43 - - -@isstandardlayoutexpr -2 - - -@istriviallycopyableexpr -2330 - - -@isliteraltypeexpr -2 - - -@hastrivialmoveconstructorexpr -3 - - -@hastrivialmoveassignexpr -3 - - -@hasnothrowmoveassignexpr -4 - - -@isconstructibleexpr -3 - - -@isnothrowconstructibleexpr -3 - - -@hasfinalizerexpr -1 - - -@isdelegateexpr -1 - - -@isinterfaceclassexpr -1 - - -@isrefarrayexpr -1 - - -@isrefclassexpr -1 - - -@issealedexpr -1 - - -@issimplevalueclassexpr -1 - - -@isvalueclassexpr -1 - - -@isfinalexpr -162 - - -@noexceptexpr -17320 - - -@builtinshufflevector -1 - - -@builtinchooseexpr -7405 - - -@builtinaddressof -3923 - - -@vec_fill -1 - - -@builtinconvertvector -1 - - -@builtincomplex -4 - - -@spaceshipexpr -1 - - -@co_await -6 - - -@co_yield -1 - - -@temp_init -241259 - - -@lambdacapture -21618 - - -@stmt_expr -1267720 - - -@stmt_if -524673 - - -@stmt_while -30641 - - -@stmt_goto -111468 - - -@stmt_label -81577 - - -@stmt_return -1116898 - - -@stmt_block -1309643 - - -@stmt_end_test_while -149931 - - -@stmt_for -32103 - - -@stmt_switch_case -271721 - - -@stmt_switch -53308 - - -@stmt_asm -241548 - - -@stmt_try_block -17753 - - -@stmt_microsoft_try -168 - - -@stmt_decl -605017 - - -@stmt_set_vla_size -11 - - -@stmt_vla_decl -8 - - -@stmt_assigned_goto -9139 - - -@stmt_empty -102194 - - -@stmt_continue -8080 - - -@stmt_break -224116 - - -@stmt_range_based_for -21 - - -@stmt_handler -21612 - - -@stmt_constexpr_if -3 - - -@stmt_co_return -2 - - -@ppd_if -154267 - - -@ppd_ifdef -60371 - - -@ppd_ifndef -82352 - - -@ppd_elif -20387 - - -@ppd_else -56990 - - -@ppd_endif -296991 - - -@ppd_plain_include -287356 - - -@ppd_define -314344 - - -@ppd_undef -19021 - - -@ppd_line -12495 - - -@ppd_error -43 - - -@ppd_pragma -36507 - - -@ppd_objc_import -2 - - -@ppd_include_next -86 - - -@ppd_warning -1 - - -@link_target -574 - - -@xmldtd -1 - - -@xmlelement -1270313 - - -@xmlattribute -1202020 - - -@xmlnamespace -4185 - - -@xmlcomment -26812 - - -@xmlcharacters -439958 - - - -compilations -9440 - - -id -9440 - - -cwd -10 - - - - -id -cwd - - -12 - - -1 -2 -9440 - - - - - - -cwd -id - - -12 - - -871 -872 -10 - - - - - - - - -compilation_args -376128 - - -id -4323 - - -num -162 - - -arg -18625 - - - - -id -num - - -12 - - -13 -77 -324 - - -85 -86 -9 - - -89 -90 -3202 - - -90 -92 -221 - - -92 -96 -267 - - -99 -101 -298 - - - - - - -id -arg - - -12 - - -13 -77 -324 - - -82 -83 -9 - - -88 -89 -3204 - - -89 -90 -158 - - -90 -92 -327 - - -94 -97 -299 - - - - - - -num -id - - -12 - - -2 -185 -13 - - -347 -2449 -11 - - -2454 -2455 -14 - - -2456 -2530 -13 - - -2530 -2534 -13 - - -2534 -2539 -13 - - -2539 -2544 -13 - - -2550 -2595 -9 - - -2604 -2607 -13 - - -2607 -2618 -13 - - -2619 -2643 -13 - - -2648 -2649 -1 - - -2653 -2654 -21 - - - - - - -num -arg - - -12 - - -1 -4 -11 - - -5 -7 -14 - - -7 -8 -19 - - -8 -9 -14 - - -9 -10 -16 - - -10 -11 -9 - - -11 -13 -8 - - -13 -14 -9 - - -14 -18 -13 - - -18 -26 -13 - - -30 -90 -13 - - -140 -1349 -13 - - -1739 -2534 -6 - - - - - - -arg -id - - -12 - - -1 -2 -17722 - - -2 -2654 -902 - - - - - - -arg -num - - -12 - - -1 -2 -18286 - - -2 -55 -339 - - - - - - - - -compilation_compiling_files -9440 - - -id -9440 - - -num -10 - - -file -4790 - - - - -id -num - - -12 - - -1 -2 -9440 - - - - - - -id -file - - -12 - - -1 -2 -9440 - - - - - - -num -id - - -12 - - -871 -872 -10 - - - - - - -num -file - - -12 - - -442 -443 -10 - - - - - - -file -id - - -12 - - -1 -2 -270 - - -2 -3 -4498 - - -3 -14 -21 - - - - - - -file -num - - -12 - - -1 -2 -4790 - - - - - - - - -compilation_time -37675 - - -id -9418 - - -num -10 - - -kind -43 - - -seconds -11868 - - - - -id -num - - -12 - - -1 -2 -9418 - - - - - - -id -kind - - -12 - - -4 -5 -9418 - - - - - - -id -seconds - - -12 - - -3 -4 -2850 - - -4 -5 -6568 - - - - - - -num -id - - -12 - - -869 -870 -10 - - - - - - -num -kind - - -12 - - -4 -5 -10 - - - - - - -num -seconds - - -12 - - -1095 -1096 -10 - - - - - - -kind -id - - -12 - - -869 -870 -43 - - - - - - -kind -num - - -12 - - -1 -2 -43 - - - - - - -kind -seconds - - -12 - - -7 -8 -10 - - -12 -13 -10 - - -579 -580 -10 - - -647 -648 -10 - - - - - - -seconds -id - - -12 - - -1 -2 -8053 - - -2 -3 -2254 - - -3 -5 -997 - - -5 -632 -563 - - - - - - -seconds -num - - -12 - - -1 -2 -11868 - - - - - - -seconds -kind - - -12 - - -1 -2 -10253 - - -2 -3 -1604 - - -3 -4 -10 - - - - - - - - -diagnostic_for -837183 - - -diagnostic -67893 - - -compilation -9115 - - -file_number -10 - - -file_number_diagnostic_number -6427 - - - - -diagnostic -compilation - - -12 - - -1 -2 -9147 - - -2 -3 -56079 - - -254 -840 -2666 - - - - - - -diagnostic -file_number - - -12 - - -1 -2 -67893 - - - - - - -diagnostic -file_number_diagnostic_number - - -12 - - -1 -2 -67893 - - - - - - -compilation -diagnostic - - -12 - - -2 -3 -21 - - -7 -8 -5744 - - -8 -9 -596 - - -247 -248 -1842 - - -263 -444 -715 - - -446 -594 -195 - - - - - - -compilation -file_number - - -12 - - -1 -2 -9115 - - - - - - -compilation -file_number_diagnostic_number - - -12 - - -2 -3 -21 - - -7 -8 -5744 - - -8 -9 -596 - - -247 -248 -1842 - - -263 -444 -715 - - -446 -594 -195 - - - - - - -file_number -diagnostic - - -12 - - -6264 -6265 -10 - - - - - - -file_number -compilation - - -12 - - -841 -842 -10 - - - - - - -file_number -file_number_diagnostic_number - - -12 - - -593 -594 -10 - - - - - - -file_number_diagnostic_number -diagnostic - - -12 - - -1 -2 -2644 - - -2 -5 -574 - - -5 -6 -942 - - -7 -14 -509 - - -15 -16 -54 - - -17 -18 -563 - - -18 -23 -433 - - -26 -40 -520 - - -42 -842 -184 - - - - - - -file_number_diagnostic_number -compilation - - -12 - - -4 -9 -552 - - -10 -11 -942 - - -14 -27 -509 - - -30 -31 -54 - - -34 -35 -563 - - -36 -45 -433 - - -52 -79 -520 - - -84 -85 -173 - - -254 -255 -2590 - - -309 -842 -86 - - - - - - -file_number_diagnostic_number -file_number - - -12 - - -1 -2 -6427 - - - - - - - - -compilation_finished -9440 - - -id -9440 - - -cpu_seconds -7619 - - -elapsed_seconds -195 - - - - -id -cpu_seconds - - -12 - - -1 -2 -9440 - - - - - - -id -elapsed_seconds - - -12 - - -1 -2 -9440 - - - - - - -cpu_seconds -id - - -12 - - -1 -2 -6449 - - -2 -3 -856 - - -3 -11 -314 - - - - - - -cpu_seconds -elapsed_seconds - - -12 - - -1 -2 -7045 - - -2 -3 -574 - - - - - - -elapsed_seconds -id - - -12 - - -1 -2 -54 - - -3 -4 -21 - - -6 -7 -10 - - -7 -8 -10 - - -8 -9 -10 - - -17 -18 -10 - - -26 -27 -10 - - -34 -35 -10 - - -124 -125 -10 - - -125 -126 -10 - - -140 -141 -10 - - -174 -175 -10 - - -199 -200 -10 - - - - - - -elapsed_seconds -cpu_seconds - - -12 - - -1 -2 -54 - - -3 -4 -21 - - -6 -7 -10 - - -7 -8 -10 - - -8 -9 -10 - - -17 -18 -10 - - -26 -27 -10 - - -34 -35 -10 - - -95 -96 -10 - - -106 -107 -10 - - -118 -119 -10 - - -148 -149 -10 - - -180 -181 -10 - - - - - - - - -externalData -130 - - -id -65 - - -path -10 - - -column -21 - - -value -130 - - - - -id -path - - -12 - - -1 -2 -65 - - - - - - -id -column - - -12 - - -2 -3 -65 - - - - - - -id -value - - -12 - - -2 -3 -65 - - - - - - -path -id - - -12 - - -6 -7 -10 - - - - - - -path -column - - -12 - - -2 -3 -10 - - - - - - -path -value - - -12 - - -12 -13 -10 - - - - - - -column -id - - -12 - - -6 -7 -21 - - - - - - -column -path - - -12 - - -1 -2 -21 - - - - - - -column -value - - -12 - - -6 -7 -21 - - - - - - -value -id - - -12 - - -1 -2 -130 - - - - - - -value -path - - -12 - - -1 -2 -130 - - - - - - -value -column - - -12 - - -1 -2 -130 - - - - - - - - -sourceLocationPrefix -10 - - -prefix -10 - - - - - -external_packages -119 - - -id -119 - - -namespace -10 - - -package_name -119 - - -version -119 - - - - -id -namespace - - -12 - - -1 -2 -119 - - - - - - -id -package_name - - -12 - - -1 -2 -119 - - - - - - -id -version - - -12 - - -1 -2 -119 - - - - - - -namespace -id - - -12 - - -11 -12 -10 - - - - - - -namespace -package_name - - -12 - - -11 -12 -10 - - - - - - -namespace -version - - -12 - - -11 -12 -10 - - - - - - -package_name -id - - -12 - - -1 -2 -119 - - - - - - -package_name -namespace - - -12 - - -1 -2 -119 - - - - - - -package_name -version - - -12 - - -1 -2 -119 - - - - - - -version -id - - -12 - - -1 -2 -119 - - - - - - -version -namespace - - -12 - - -1 -2 -119 - - - - - - -version -package_name - - -12 - - -1 -2 -119 - - - - - - - - -header_to_external_package -8432 - - -fileid -8432 - - -package -119 - - - - -fileid -package - - -12 - - -1 -2 -8432 - - - - - - -package -fileid - - -12 - - -1 -2 -32 - - -2 -3 -10 - - -15 -16 -21 - - -63 -64 -10 - - -71 -72 -10 - - -86 -87 -10 - - -253 -254 -10 - - -270 -271 -10 - - - - - - - - -svnentries -575525 - - -id -575525 - - -revision -575525 - - -author -19539 - - -revisionDate -547759 - - -changeSize -1 - - - - -id -revision - - -12 - - -1 -2 -575525 - - - - - - -id -author - - -12 - - -1 -2 -575525 - - - - - - -id -revisionDate - - -12 - - -1 -2 -575525 - - - - - - -id -changeSize - - -12 - - -1 -2 -575525 - - - - - - -revision -id - - -12 - - -1 -2 -575525 - - - - - - -revision -author - - -12 - - -1 -2 -575525 - - - - - - -revision -revisionDate - - -12 - - -1 -2 -575525 - - - - - - -revision -changeSize - - -12 - - -1 -2 -575525 - - - - - - -author -id - - -12 - - -1 -2 -7913 - - -2 -3 -2531 - - -3 -4 -1388 - - -4 -6 -1523 - - -6 -10 -1529 - - -10 -20 -1509 - - -20 -52 -1488 - - -52 -568 -1466 - - -569 -16582 -192 - - - - - - -author -revision - - -12 - - -1 -2 -7913 - - -2 -3 -2531 - - -3 -4 -1388 - - -4 -6 -1523 - - -6 -10 -1529 - - -10 -20 -1509 - - -20 -52 -1488 - - -52 -568 -1466 - - -569 -16582 -192 - - - - - - -author -revisionDate - - -12 - - -1 -2 -7996 - - -2 -3 -2509 - - -3 -4 -1379 - - -4 -6 -1520 - - -6 -10 -1529 - - -10 -20 -1507 - - -20 -52 -1474 - - -52 -662 -1466 - - -663 -16573 -159 - - - - - - -author -changeSize - - -12 - - -1 -2 -19539 - - - - - - -revisionDate -id - - -12 - - -1 -2 -531878 - - -2 -100 -15881 - - - - - - -revisionDate -revision - - -12 - - -1 -2 -531878 - - -2 -100 -15881 - - - - - - -revisionDate -author - - -12 - - -1 -2 -542505 - - -2 -17 -5254 - - - - - - -revisionDate -changeSize - - -12 - - -1 -2 -547759 - - - - - - -changeSize -id - - -12 - - -575525 -575526 -1 - - - - - - -changeSize -revision - - -12 - - -575525 -575526 -1 - - - - - - -changeSize -author - - -12 - - -19539 -19540 -1 - - - - - - -changeSize -revisionDate - - -12 - - -547759 -547760 -1 - - - - - - - - -svnaffectedfiles -1314068 - - -id -531628 - - -file -90924 - - -action -1 - - - - -id -file - - -12 - - -1 -2 -337698 - - -2 -3 -77525 - - -3 -4 -43024 - - -4 -7 -46689 - - -7 -16635 -26692 - - - - - - -id -action - - -12 - - -1 -2 -531628 - - - - - - -file -id - - -12 - - -1 -2 -11819 - - -2 -3 -18230 - - -3 -4 -9501 - - -4 -5 -6656 - - -5 -6 -5012 - - -6 -8 -7103 - - -8 -11 -6788 - - -11 -16 -6996 - - -16 -26 -7180 - - -26 -54 -6824 - - -54 -3572 -4815 - - - - - - -file -action - - -12 - - -1 -2 -90924 - - - - - - -action -id - - -12 - - -531628 -531629 -1 - - - - - - -action -file - - -12 - - -90924 -90925 -1 - - - - - - - - -svnentrymsg -575525 - - -id -575525 - - -message -568305 - - - - -id -message - - -12 - - -1 -2 -575525 - - - - - - -message -id - - -12 - - -1 -2 -565381 - - -2 -142 -2924 - - - - - - - - -svnchurn -46790 - - -commit -22361 - - -file -16124 - - -addedLines -910 - - -deletedLines -787 - - - - -commit -file - - -12 - - -1 -2 -15208 - - -2 -3 -3101 - - -3 -4 -1746 - - -4 -8 -1774 - - -8 -246 -532 - - - - - - -commit -addedLines - - -12 - - -1 -2 -16074 - - -2 -3 -3323 - - -3 -4 -1561 - - -4 -118 -1403 - - - - - - -commit -deletedLines - - -12 - - -1 -2 -16799 - - -2 -3 -3286 - - -3 -5 -1763 - - -5 -113 -513 - - - - - - -file -commit - - -12 - - -1 -2 -8618 - - -2 -3 -2956 - - -3 -4 -1426 - - -4 -6 -1364 - - -6 -12 -1210 - - -12 -448 -550 - - - - - - -file -addedLines - - -12 - - -1 -2 -9240 - - -2 -3 -3129 - - -3 -4 -1393 - - -4 -6 -1239 - - -6 -59 -1123 - - - - - - -file -deletedLines - - -12 - - -1 -2 -9525 - - -2 -3 -3192 - - -3 -4 -1401 - - -4 -7 -1387 - - -7 -70 -619 - - - - - - -addedLines -commit - - -12 - - -1 -2 -446 - - -2 -3 -133 - - -3 -4 -70 - - -4 -6 -68 - - -6 -12 -70 - - -12 -57 -69 - - -57 -6874 -54 - - - - - - -addedLines -file - - -12 - - -1 -2 -445 - - -2 -3 -132 - - -3 -4 -69 - - -4 -6 -68 - - -6 -12 -73 - - -12 -58 -69 - - -58 -6663 -54 - - - - - - -addedLines -deletedLines - - -12 - - -1 -2 -621 - - -2 -3 -96 - - -3 -7 -81 - - -7 -34 -70 - - -34 -727 -42 - - - - - - -deletedLines -commit - - -12 - - -1 -2 -439 - - -2 -3 -116 - - -3 -4 -48 - - -4 -8 -67 - - -8 -28 -60 - - -28 -6794 -57 - - - - - - -deletedLines -file - - -12 - - -1 -2 -437 - - -2 -3 -113 - - -3 -4 -49 - - -4 -7 -61 - - -7 -19 -60 - - -19 -770 -60 - - -985 -7318 -7 - - - - - - -deletedLines -addedLines - - -12 - - -1 -2 -545 - - -2 -3 -72 - - -3 -7 -69 - - -7 -30 -60 - - -30 -871 -41 - - - - - - - - -locations_default -8719593 - - -id -8719593 - - -container -70137 - - -startLine -148869 - - -startColumn -5397 - - -endLine -148696 - - -endColumn -10502 - - - - -id -container - - -12 - - -1 -2 -8719593 - - - - - - -id -startLine - - -12 - - -1 -2 -8719593 - - - - - - -id -startColumn - - -12 - - -1 -2 -8719593 - - - - - - -id -endLine - - -12 - - -1 -2 -8719593 - - - - - - -id -endColumn - - -12 - - -1 -2 -8719593 - - - - - - -container -id - - -12 - - -1 -2 -11391 - - -2 -19 -6026 - - -19 -25 -5419 - - -25 -31 -5451 - - -31 -41 -5755 - - -41 -54 -5462 - - -54 -72 -5538 - - -72 -99 -5354 - - -99 -137 -5321 - - -137 -220 -5267 - - -220 -430 -5267 - - -430 -20913 -3880 - - - - - - -container -startLine - - -12 - - -1 -2 -11391 - - -2 -15 -5939 - - -15 -20 -6069 - - -20 -25 -5484 - - -25 -32 -6026 - - -32 -41 -5614 - - -41 -53 -5657 - - -53 -71 -5527 - - -71 -99 -5386 - - -99 -158 -5267 - - -158 -351 -5300 - - -351 -9356 -2471 - - - - - - -container -startColumn - - -12 - - -1 -2 -11391 - - -2 -4 -5939 - - -4 -8 -6470 - - -8 -11 -5332 - - -11 -14 -5712 - - -14 -18 -6178 - - -18 -23 -5690 - - -23 -29 -5766 - - -29 -37 -5625 - - -37 -50 -5603 - - -50 -78 -5321 - - -78 -168 -1105 - - - - - - -container -endLine - - -12 - - -1 -2 -11391 - - -2 -15 -5917 - - -15 -20 -6091 - - -20 -25 -5430 - - -25 -32 -6037 - - -32 -41 -5603 - - -41 -53 -5657 - - -53 -70 -5321 - - -70 -96 -5278 - - -96 -153 -5332 - - -153 -333 -5289 - - -333 -9356 -2785 - - - - - - -container -endColumn - - -12 - - -1 -2 -11391 - - -2 -14 -5668 - - -14 -19 -6048 - - -19 -23 -5646 - - -23 -28 -6340 - - -28 -33 -5451 - - -33 -40 -5885 - - -40 -47 -5289 - - -47 -57 -5538 - - -57 -69 -5571 - - -69 -91 -5267 - - -91 -336 -2037 - - - - - - -startLine -id - - -12 - - -1 -2 -30489 - - -2 -3 -17818 - - -3 -4 -17742 - - -4 -5 -9603 - - -5 -7 -13548 - - -7 -9 -13255 - - -9 -13 -13049 - - -13 -32 -11434 - - -32 -128 -11185 - - -128 -6472 -10741 - - - - - - -startLine -container - - -12 - - -1 -2 -55006 - - -2 -3 -33047 - - -3 -4 -9787 - - -4 -5 -8334 - - -5 -8 -12757 - - -8 -27 -11358 - - -27 -123 -11207 - - -123 -6472 -7370 - - - - - - -startLine -startColumn - - -12 - - -1 -2 -31584 - - -2 -3 -17656 - - -3 -4 -19563 - - -4 -5 -9473 - - -5 -7 -13754 - - -7 -9 -13667 - - -9 -13 -12562 - - -13 -27 -11348 - - -27 -62 -11218 - - -62 -153 -8042 - - - - - - -startLine -endLine - - -12 - - -1 -2 -111649 - - -2 -3 -17211 - - -3 -7 -12388 - - -7 -184 -7619 - - - - - - -startLine -endColumn - - -12 - - -1 -2 -31432 - - -2 -3 -17569 - - -3 -4 -18425 - - -4 -5 -9754 - - -5 -7 -13570 - - -7 -9 -13613 - - -9 -13 -12583 - - -13 -29 -11521 - - -29 -74 -11185 - - -74 -258 -9212 - - - - - - -startColumn -id - - -12 - - -1 -2 -867 - - -2 -3 -997 - - -3 -5 -498 - - -5 -8 -476 - - -8 -16 -433 - - -16 -37 -411 - - -37 -119 -411 - - -124 -512 -411 - - -522 -5004 -411 - - -5044 -19250 -411 - - -19714 -201002 -65 - - - - - - -startColumn -container - - -12 - - -1 -2 -2319 - - -2 -3 -487 - - -3 -6 -422 - - -6 -15 -433 - - -15 -55 -411 - - -59 -228 -411 - - -231 -1213 -411 - - -1274 -2356 -411 - - -2555 -6472 -86 - - - - - - -startColumn -startLine - - -12 - - -1 -2 -899 - - -2 -3 -986 - - -3 -4 -260 - - -4 -6 -466 - - -6 -10 -422 - - -10 -20 -411 - - -20 -55 -411 - - -56 -194 -411 - - -196 -844 -411 - - -863 -1976 -411 - - -1976 -6604 -303 - - - - - - -startColumn -endLine - - -12 - - -1 -2 -899 - - -2 -3 -986 - - -3 -4 -260 - - -4 -6 -466 - - -6 -10 -422 - - -10 -20 -411 - - -20 -55 -411 - - -56 -194 -411 - - -206 -843 -411 - - -863 -1977 -411 - - -1980 -6583 -303 - - - - - - -startColumn -endColumn - - -12 - - -1 -2 -2449 - - -2 -3 -487 - - -3 -7 -487 - - -7 -13 -422 - - -13 -28 -411 - - -28 -49 -422 - - -50 -103 -411 - - -105 -428 -303 - - - - - - -endLine -id - - -12 - - -1 -2 -30207 - - -2 -3 -17851 - - -3 -4 -17602 - - -4 -5 -9754 - - -5 -7 -13613 - - -7 -9 -13299 - - -9 -13 -12898 - - -13 -31 -11326 - - -31 -125 -11207 - - -125 -6472 -10936 - - - - - - -endLine -container - - -12 - - -1 -2 -54724 - - -2 -3 -32949 - - -3 -4 -9754 - - -4 -5 -8443 - - -5 -8 -12952 - - -8 -27 -11196 - - -27 -121 -11163 - - -121 -6472 -7511 - - - - - - -endLine -startLine - - -12 - - -1 -2 -110869 - - -2 -3 -17049 - - -3 -7 -11933 - - -7 -46 -8844 - - - - - - -endLine -startColumn - - -12 - - -1 -2 -31280 - - -2 -3 -17732 - - -3 -4 -19509 - - -4 -5 -9494 - - -5 -6 -7771 - - -6 -7 -6058 - - -7 -9 -13678 - - -9 -13 -12562 - - -13 -27 -11358 - - -27 -62 -11218 - - -62 -153 -8031 - - - - - - -endLine -endColumn - - -12 - - -1 -2 -31183 - - -2 -3 -17537 - - -3 -4 -18414 - - -4 -5 -9819 - - -5 -7 -13656 - - -7 -9 -13613 - - -9 -13 -12637 - - -13 -29 -11380 - - -29 -74 -11196 - - -74 -258 -9256 - - - - - - -endColumn -id - - -12 - - -1 -2 -4151 - - -2 -3 -1159 - - -3 -4 -758 - - -4 -5 -639 - - -5 -9 -867 - - -9 -36 -791 - - -36 -256 -791 - - -257 -7244 -791 - - -7397 -25755 -552 - - - - - - -endColumn -container - - -12 - - -1 -2 -4769 - - -2 -3 -1257 - - -3 -4 -953 - - -4 -7 -899 - - -7 -31 -791 - - -32 -356 -791 - - -377 -2696 -791 - - -2701 -6472 -249 - - - - - - -endColumn -startLine - - -12 - - -1 -2 -4183 - - -2 -3 -1148 - - -3 -4 -791 - - -4 -5 -628 - - -5 -9 -845 - - -9 -34 -791 - - -34 -221 -791 - - -233 -1884 -791 - - -1885 -4894 -531 - - - - - - -endColumn -startColumn - - -12 - - -1 -2 -4801 - - -2 -3 -1311 - - -3 -4 -942 - - -4 -7 -899 - - -7 -22 -802 - - -22 -45 -791 - - -45 -81 -812 - - -81 -84 -140 - - - - - - -endColumn -endLine - - -12 - - -1 -2 -4183 - - -2 -3 -1148 - - -3 -4 -802 - - -4 -5 -628 - - -5 -9 -845 - - -9 -33 -802 - - -34 -234 -791 - - -240 -1928 -791 - - -1951 -4895 -509 - - - - - - - - -locations_stmt -2179578 - - -id -2179578 - - -container -3177 - - -startLine -296783 - - -startColumn -1229 - - -endLine -294982 - - -endColumn -1493 - - - - -id -container - - -12 - - -1 -2 -2179578 - - - - - - -id -startLine - - -12 - - -1 -2 -2179578 - - - - - - -id -startColumn - - -12 - - -1 -2 -2179578 - - - - - - -id -endLine - - -12 - - -1 -2 -2179578 - - - - - - -id -endColumn - - -12 - - -1 -2 -2179578 - - - - - - -container -id - - -12 - - -1 -7 -288 - - -7 -17 -258 - - -17 -30 -251 - - -30 -53 -239 - - -53 -89 -245 - - -89 -140 -239 - - -140 -213 -245 - - -215 -297 -239 - - -302 -462 -239 - - -464 -739 -239 - - -743 -1085 -239 - - -1099 -1959 -239 - - -1972 -53712 -208 - - - - - - -container -startLine - - -12 - - -1 -6 -239 - - -6 -13 -239 - - -13 -23 -245 - - -23 -37 -239 - - -37 -65 -239 - - -65 -101 -245 - - -102 -155 -239 - - -158 -212 -239 - - -214 -325 -239 - - -328 -516 -239 - - -526 -738 -239 - - -738 -1166 -239 - - -1169 -3598 -239 - - -3809 -38985 -49 - - - - - - -container -startColumn - - -12 - - -1 -2 -24 - - -2 -3 -571 - - -3 -5 -202 - - -5 -8 -288 - - -8 -14 -245 - - -14 -20 -264 - - -20 -29 -251 - - -29 -39 -251 - - -39 -51 -251 - - -51 -63 -264 - - -63 -78 -245 - - -78 -107 -245 - - -107 -126 -67 - - - - - - -container -endLine - - -12 - - -1 -5 -239 - - -5 -13 -282 - - -13 -24 -264 - - -24 -41 -245 - - -43 -67 -239 - - -67 -103 -239 - - -103 -163 -245 - - -163 -230 -239 - - -231 -369 -239 - - -369 -581 -239 - - -581 -811 -239 - - -818 -1418 -239 - - -1423 -38575 -221 - - - - - - -container -endColumn - - -12 - - -1 -4 -282 - - -4 -7 -258 - - -7 -13 -245 - - -13 -21 -251 - - -21 -29 -239 - - -29 -40 -282 - - -40 -49 -264 - - -49 -60 -258 - - -60 -73 -245 - - -73 -84 -239 - - -84 -97 -239 - - -97 -120 -239 - - -120 -172 -129 - - - - - - -startLine -id - - -12 - - -1 -2 -113822 - - -2 -3 -78757 - - -3 -4 -31327 - - -4 -6 -25205 - - -6 -16 -22538 - - -16 -128 -22347 - - -128 -222 -2784 - - - - - - -startLine -container - - -12 - - -1 -2 -175591 - - -2 -3 -52052 - - -3 -5 -22741 - - -5 -13 -22415 - - -13 -125 -22298 - - -125 -176 -1684 - - - - - - -startLine -startColumn - - -12 - - -1 -2 -130841 - - -2 -3 -73207 - - -3 -4 -31204 - - -4 -7 -26846 - - -7 -17 -23085 - - -17 -45 -11597 - - - - - - -startLine -endLine - - -12 - - -1 -2 -191719 - - -2 -3 -47768 - - -3 -4 -21726 - - -4 -9 -23202 - - -9 -30 -12366 - - - - - - -startLine -endColumn - - -12 - - -1 -2 -156052 - - -2 -3 -62630 - - -3 -4 -21093 - - -4 -9 -24707 - - -9 -31 -22464 - - -31 -73 -9833 - - - - - - -startColumn -id - - -12 - - -1 -2 -135 - - -2 -3 -79 - - -3 -6 -110 - - -6 -15 -98 - - -15 -29 -104 - - -29 -69 -98 - - -72 -145 -98 - - -149 -318 -98 - - -321 -581 -98 - - -585 -893 -98 - - -905 -2476 -98 - - -2724 -38142 -98 - - -63637 -75127 -12 - - - - - - -startColumn -container - - -12 - - -1 -2 -141 - - -2 -3 -86 - - -3 -5 -73 - - -5 -10 -98 - - -11 -18 -98 - - -18 -32 -104 - - -34 -64 -98 - - -66 -92 -98 - - -92 -130 -98 - - -131 -174 -98 - - -174 -208 -104 - - -208 -298 -98 - - -298 -498 -30 - - - - - - -startColumn -startLine - - -12 - - -1 -2 -135 - - -2 -3 -79 - - -3 -6 -110 - - -6 -15 -98 - - -15 -29 -104 - - -29 -68 -98 - - -70 -143 -98 - - -143 -313 -104 - - -319 -555 -98 - - -603 -830 -98 - - -832 -2107 -98 - - -2438 -15462 -98 - - -18292 -18293 -6 - - - - - - -startColumn -endLine - - -12 - - -1 -2 -135 - - -2 -3 -79 - - -3 -6 -110 - - -6 -15 -98 - - -15 -29 -104 - - -29 -68 -98 - - -70 -144 -98 - - -146 -308 -98 - - -314 -542 -98 - - -554 -801 -98 - - -819 -2028 -98 - - -2086 -15270 -98 - - -15556 -18380 -12 - - - - - - -startColumn -endColumn - - -12 - - -1 -2 -153 - - -2 -3 -92 - - -3 -4 -86 - - -4 -6 -98 - - -6 -7 -55 - - -7 -9 -104 - - -9 -12 -98 - - -12 -15 -98 - - -15 -26 -104 - - -26 -35 -98 - - -35 -46 -98 - - -46 -114 -98 - - -131 -203 -43 - - - - - - -endLine -id - - -12 - - -1 -2 -116170 - - -2 -3 -72937 - - -3 -4 -31948 - - -4 -6 -25709 - - -6 -16 -23140 - - -16 -126 -22138 - - -126 -229 -2937 - - - - - - -endLine -container - - -12 - - -1 -2 -175302 - - -2 -3 -52249 - - -3 -5 -22206 - - -5 -14 -23521 - - -14 -172 -21702 - - - - - - -endLine -startLine - - -12 - - -1 -2 -194005 - - -2 -3 -42943 - - -3 -4 -20940 - - -4 -8 -22458 - - -8 -32 -14634 - - - - - - -endLine -startColumn - - -12 - - -1 -2 -133004 - - -2 -3 -68069 - - -3 -4 -32489 - - -4 -7 -26723 - - -7 -16 -22163 - - -16 -46 -12532 - - - - - - -endLine -endColumn - - -12 - - -1 -2 -155948 - - -2 -3 -62494 - - -3 -4 -21401 - - -4 -9 -23890 - - -9 -34 -22415 - - -34 -73 -8832 - - - - - - -endColumn -id - - -12 - - -1 -2 -184 - - -2 -4 -135 - - -4 -7 -104 - - -7 -15 -122 - - -16 -43 -116 - - -56 -131 -122 - - -134 -276 -116 - - -283 -620 -116 - - -650 -1179 -116 - - -1220 -2551 -116 - - -2686 -5415 -116 - - -5429 -26558 -116 - - -36191 -36192 -6 - - - - - - -endColumn -container - - -12 - - -1 -2 -215 - - -2 -3 -86 - - -3 -6 -135 - - -6 -12 -129 - - -13 -25 -116 - - -25 -51 -116 - - -55 -89 -116 - - -92 -152 -116 - - -153 -210 -116 - - -210 -266 -116 - - -270 -310 -116 - - -312 -512 -110 - - - - - - -endColumn -startLine - - -12 - - -1 -2 -184 - - -2 -4 -135 - - -4 -7 -104 - - -7 -15 -122 - - -16 -43 -116 - - -51 -125 -116 - - -128 -254 -116 - - -264 -570 -116 - - -590 -943 -116 - - -1020 -1875 -116 - - -1902 -3509 -116 - - -3526 -7422 -116 - - -8516 -9009 -12 - - - - - - -endColumn -startColumn - - -12 - - -1 -2 -202 - - -2 -3 -116 - - -3 -4 -86 - - -4 -6 -135 - - -6 -10 -129 - - -10 -13 -122 - - -13 -16 -122 - - -16 -22 -122 - - -22 -31 -122 - - -31 -38 -129 - - -38 -43 -122 - - -43 -174 -79 - - - - - - -endColumn -endLine - - -12 - - -1 -2 -184 - - -2 -4 -135 - - -4 -7 -104 - - -7 -15 -122 - - -16 -43 -116 - - -51 -124 -116 - - -127 -251 -116 - - -261 -556 -116 - - -584 -934 -116 - - -1007 -1816 -116 - - -1894 -3330 -116 - - -3448 -6941 -116 - - -8353 -8659 -12 - - - - - - - - -locations_expr -9756708 - - -id -9756708 - - -container -3574 - - -startLine -195321 - - -startColumn -386 - - -endLine -195640 - - -endColumn -456 - - - - -id -container - - -12 - - -1 -2 -9756708 - - - - - - -id -startLine - - -12 - - -1 -2 -9756708 - - - - - - -id -startColumn - - -12 - - -1 -2 -9756708 - - - - - - -id -endLine - - -12 - - -1 -2 -9756708 - - - - - - -id -endColumn - - -12 - - -1 -2 -9756708 - - - - - - -container -id - - -12 - - -1 -4 -319 - - -4 -10 -269 - - -10 -34 -269 - - -34 -108 -269 - - -108 -205 -270 - - -205 -322 -270 - - -322 -485 -271 - - -486 -746 -269 - - -746 -1181 -269 - - -1181 -1853 -269 - - -1857 -3184 -269 - - -3187 -7084 -269 - - -7174 -43241 -269 - - -43580 -491727 -23 - - - - - - -container -startLine - - -12 - - -1 -3 -302 - - -3 -7 -316 - - -7 -17 -271 - - -17 -36 -277 - - -36 -61 -272 - - -61 -89 -273 - - -89 -137 -270 - - -137 -205 -271 - - -205 -335 -269 - - -335 -524 -269 - - -524 -946 -269 - - -947 -2043 -269 - - -2045 -142752 -246 - - - - - - -container -startColumn - - -12 - - -1 -3 -304 - - -3 -7 -303 - - -7 -17 -272 - - -17 -35 -269 - - -35 -51 -283 - - -51 -63 -290 - - -63 -73 -292 - - -73 -83 -282 - - -83 -92 -271 - - -92 -104 -274 - - -104 -120 -277 - - -120 -145 -270 - - -145 -330 -187 - - - - - - -container -endLine - - -12 - - -1 -3 -302 - - -3 -7 -313 - - -7 -17 -274 - - -17 -36 -275 - - -36 -61 -272 - - -61 -89 -270 - - -89 -137 -270 - - -137 -205 -270 - - -205 -337 -269 - - -337 -533 -269 - - -533 -946 -269 - - -947 -2071 -269 - - -2077 -143560 -252 - - - - - - -container -endColumn - - -12 - - -1 -3 -282 - - -3 -7 -298 - - -7 -19 -282 - - -19 -43 -284 - - -43 -61 -287 - - -61 -74 -294 - - -74 -85 -279 - - -85 -96 -286 - - -96 -107 -280 - - -107 -121 -280 - - -121 -139 -274 - - -139 -167 -271 - - -167 -416 -177 - - - - - - -startLine -id - - -12 - - -1 -2 -7506 - - -2 -3 -28155 - - -3 -4 -37070 - - -4 -5 -16164 - - -5 -6 -10348 - - -6 -8 -16992 - - -8 -11 -17633 - - -11 -16 -16438 - - -16 -25 -15790 - - -25 -97 -14716 - - -97 -4266 -14509 - - - - - - -startLine -container - - -12 - - -1 -2 -100560 - - -2 -3 -34005 - - -3 -4 -12707 - - -4 -5 -12439 - - -5 -12 -15112 - - -12 -95 -14670 - - -95 -1342 -5828 - - - - - - -startLine -startColumn - - -12 - - -1 -2 -7668 - - -2 -3 -28146 - - -3 -4 -37760 - - -4 -5 -16417 - - -5 -6 -11671 - - -6 -7 -12742 - - -7 -9 -16572 - - -9 -12 -15812 - - -12 -18 -16484 - - -18 -39 -14870 - - -39 -118 -14836 - - -118 -201 -2343 - - - - - - -startLine -endLine - - -12 - - -1 -2 -93569 - - -2 -3 -68359 - - -3 -4 -13336 - - -4 -8 -16334 - - -8 -60 -3723 - - - - - - -startLine -endColumn - - -12 - - -1 -2 -17044 - - -2 -3 -34830 - - -3 -4 -22935 - - -4 -5 -15998 - - -5 -6 -18855 - - -6 -8 -12903 - - -8 -10 -13538 - - -10 -14 -15565 - - -14 -21 -14781 - - -21 -61 -14731 - - -61 -184 -14141 - - - - - - -startColumn -id - - -12 - - -1 -2 -31 - - -2 -4 -29 - - -4 -8 -29 - - -8 -23 -29 - - -24 -63 -30 - - -75 -225 -29 - - -232 -684 -29 - - -694 -1672 -29 - - -1751 -4184 -29 - - -4489 -15276 -29 - - -16143 -46384 -29 - - -48765 -86984 -29 - - -87199 -224328 -29 - - -237383 -712891 -6 - - - - - - -startColumn -container - - -12 - - -1 -2 -76 - - -2 -3 -25 - - -3 -7 -31 - - -7 -19 -30 - - -19 -53 -29 - - -55 -130 -29 - - -132 -341 -29 - - -344 -777 -29 - - -778 -1426 -29 - - -1471 -2095 -29 - - -2118 -2433 -29 - - -2437 -2810 -21 - - - - - - -startColumn -startLine - - -12 - - -1 -2 -41 - - -2 -4 -30 - - -4 -9 -29 - - -9 -28 -30 - - -31 -113 -29 - - -120 -349 -29 - - -356 -880 -29 - - -919 -2301 -29 - - -2307 -5125 -29 - - -5505 -12957 -29 - - -13031 -18247 -29 - - -18468 -26386 -29 - - -26397 -108382 -24 - - - - - - -startColumn -endLine - - -12 - - -1 -2 -41 - - -2 -4 -30 - - -4 -9 -29 - - -9 -28 -30 - - -31 -113 -29 - - -120 -349 -29 - - -356 -880 -29 - - -919 -2301 -29 - - -2307 -5126 -29 - - -5507 -12959 -29 - - -13028 -18367 -29 - - -18468 -26374 -29 - - -26393 -108398 -24 - - - - - - -startColumn -endColumn - - -12 - - -1 -2 -34 - - -2 -3 -37 - - -3 -5 -33 - - -5 -9 -29 - - -9 -18 -30 - - -18 -40 -30 - - -42 -51 -29 - - -51 -73 -29 - - -74 -99 -29 - - -99 -136 -29 - - -136 -166 -30 - - -166 -181 -29 - - -181 -293 -18 - - - - - - -endLine -id - - -12 - - -1 -2 -7754 - - -2 -3 -40765 - - -3 -4 -7734 - - -4 -5 -29998 - - -5 -6 -10878 - - -6 -7 -12021 - - -7 -9 -15602 - - -9 -13 -17880 - - -13 -19 -14695 - - -19 -34 -14922 - - -34 -233 -14683 - - -233 -4272 -8708 - - - - - - -endLine -container - - -12 - - -1 -2 -100438 - - -2 -3 -34143 - - -3 -4 -12560 - - -4 -5 -12621 - - -5 -11 -14795 - - -11 -88 -14707 - - -88 -1343 -6376 - - - - - - -endLine -startLine - - -12 - - -1 -2 -118668 - - -2 -3 -22776 - - -3 -4 -30958 - - -4 -7 -17210 - - -7 -23 -6028 - - - - - - -endLine -startColumn - - -12 - - -1 -2 -7907 - - -2 -3 -40677 - - -3 -4 -8232 - - -4 -5 -30893 - - -5 -6 -10994 - - -6 -7 -13979 - - -7 -9 -16931 - - -9 -12 -16730 - - -12 -18 -16864 - - -18 -38 -14833 - - -38 -116 -14846 - - -116 -201 -2754 - - - - - - -endLine -endColumn - - -12 - - -1 -2 -32161 - - -2 -3 -18779 - - -3 -4 -8001 - - -4 -5 -30465 - - -5 -6 -18987 - - -6 -8 -17087 - - -8 -11 -16321 - - -11 -16 -15572 - - -16 -27 -14835 - - -27 -94 -14740 - - -94 -184 -8692 - - - - - - -endColumn -id - - -12 - - -1 -2 -28 - - -2 -3 -38 - - -3 -9 -38 - - -9 -15 -37 - - -15 -34 -35 - - -34 -173 -35 - - -174 -506 -35 - - -522 -1595 -35 - - -1667 -5254 -35 - - -5327 -18561 -35 - - -20354 -51707 -35 - - -54831 -117890 -35 - - -117994 -185975 -35 - - - - - - -endColumn -container - - -12 - - -1 -2 -99 - - -2 -3 -42 - - -3 -8 -37 - - -8 -28 -36 - - -28 -70 -35 - - -70 -207 -35 - - -226 -589 -35 - - -602 -1192 -35 - - -1208 -1967 -35 - - -1970 -2479 -35 - - -2482 -2650 -32 - - - - - - -endColumn -startLine - - -12 - - -1 -2 -44 - - -2 -4 -38 - - -4 -10 -32 - - -10 -16 -37 - - -16 -50 -35 - - -52 -234 -35 - - -243 -667 -35 - - -682 -2061 -35 - - -2070 -5994 -35 - - -6052 -12974 -35 - - -13162 -20941 -35 - - -20996 -28030 -35 - - -29280 -55693 -25 - - - - - - -endColumn -startColumn - - -12 - - -1 -2 -45 - - -2 -3 -56 - - -3 -5 -37 - - -5 -13 -36 - - -13 -35 -37 - - -35 -54 -35 - - -54 -64 -36 - - -65 -82 -36 - - -82 -102 -36 - - -102 -125 -38 - - -125 -135 -35 - - -135 -156 -29 - - - - - - -endColumn -endLine - - -12 - - -1 -2 -44 - - -2 -4 -38 - - -4 -10 -32 - - -10 -16 -37 - - -16 -50 -35 - - -52 -234 -35 - - -243 -666 -35 - - -682 -2062 -35 - - -2067 -5995 -35 - - -6041 -12938 -35 - - -13154 -20904 -35 - - -21020 -28041 -35 - - -29290 -55694 -25 - - - - - - - - -numlines -493411 - - -element_id -486528 - - -num_lines -9234 - - -num_code -7207 - - -num_comment -3891 - - - - -element_id -num_lines - - -12 - - -1 -2 -479722 - - -2 -7 -6806 - - - - - - -element_id -num_code - - -12 - - -1 -2 -479776 - - -2 -7 -6752 - - - - - - -element_id -num_comment - - -12 - - -1 -2 -486452 - - -2 -3 -75 - - - - - - -num_lines -element_id - - -12 - - -1 -2 -4205 - - -2 -3 -1235 - - -3 -4 -693 - - -4 -6 -726 - - -6 -12 -693 - - -12 -24 -704 - - -24 -121 -693 - - -121 -7771 -281 - - - - - - -num_lines -num_code - - -12 - - -1 -2 -4270 - - -2 -3 -1246 - - -3 -4 -704 - - -4 -6 -747 - - -6 -11 -802 - - -11 -18 -726 - - -18 -30 -704 - - -30 -32 -32 - - - - - - -num_lines -num_comment - - -12 - - -1 -2 -4259 - - -2 -3 -1246 - - -3 -4 -715 - - -4 -6 -758 - - -6 -11 -834 - - -11 -17 -715 - - -17 -27 -704 - - - - - - -num_code -element_id - - -12 - - -1 -2 -3143 - - -2 -3 -845 - - -3 -4 -617 - - -4 -6 -552 - - -6 -10 -596 - - -10 -22 -585 - - -22 -101 -541 - - -101 -7978 -325 - - - - - - -num_code -num_lines - - -12 - - -1 -2 -3164 - - -2 -3 -877 - - -3 -4 -628 - - -4 -6 -552 - - -6 -10 -628 - - -10 -21 -606 - - -21 -35 -541 - - -35 -42 -205 - - - - - - -num_code -num_comment - - -12 - - -1 -2 -3154 - - -2 -3 -899 - - -3 -4 -628 - - -4 -6 -531 - - -6 -9 -552 - - -9 -17 -552 - - -17 -27 -574 - - -27 -34 -314 - - - - - - -num_comment -element_id - - -12 - - -1 -2 -1864 - - -2 -3 -401 - - -3 -4 -292 - - -4 -7 -325 - - -7 -13 -325 - - -14 -38 -292 - - -39 -280 -292 - - -286 -36252 -97 - - - - - - -num_comment -num_lines - - -12 - - -1 -2 -1875 - - -2 -3 -411 - - -3 -4 -260 - - -4 -7 -336 - - -7 -13 -325 - - -13 -35 -292 - - -35 -90 -292 - - -91 -119 -97 - - - - - - -num_comment -num_code - - -12 - - -1 -2 -1875 - - -2 -3 -411 - - -3 -4 -270 - - -4 -7 -325 - - -7 -12 -303 - - -12 -33 -292 - - -33 -82 -292 - - -82 -108 -119 - - - - - - - - -diagnostics -67893 - - -id -67893 - - -severity -21 - - -error_tag -75 - - -error_message -97 - - -full_error_message -58789 - - -location -119 - - - - -id -severity - - -12 - - -1 -2 -67893 - - - - - - -id -error_tag - - -12 - - -1 -2 -67893 - - - - - - -id -error_message - - -12 - - -1 -2 -67893 - - - - - - -id -full_error_message - - -12 - - -1 -2 -67893 - - - - - - -id -location - - -12 - - -1 -2 -67893 - - - - - - -severity -id - - -12 - - -2 -3 -10 - - -6262 -6263 -10 - - - - - - -severity -error_tag - - -12 - - -1 -2 -10 - - -6 -7 -10 - - - - - - -severity -error_message - - -12 - - -1 -2 -10 - - -8 -9 -10 - - - - - - -severity -full_error_message - - -12 - - -2 -3 -10 - - -5422 -5423 -10 - - - - - - -severity -location - - -12 - - -2 -3 -10 - - -9 -10 -10 - - - - - - -error_tag -id - - -12 - - -1 -2 -10 - - -2 -3 -21 - - -5 -6 -10 - - -417 -418 -10 - - -841 -842 -10 - - -4996 -4997 -10 - - - - - - -error_tag -severity - - -12 - - -1 -2 -75 - - - - - - -error_tag -error_message - - -12 - - -1 -2 -65 - - -3 -4 -10 - - - - - - -error_tag -full_error_message - - -12 - - -1 -2 -21 - - -2 -3 -21 - - -5 -6 -10 - - -417 -418 -10 - - -4996 -4997 -10 - - - - - - -error_tag -location - - -12 - - -1 -2 -43 - - -2 -3 -21 - - -5 -6 -10 - - - - - - -error_message -id - - -12 - - -1 -2 -10 - - -2 -3 -21 - - -5 -6 -10 - - -10 -11 -10 - - -75 -76 -10 - - -332 -333 -10 - - -841 -842 -10 - - -4996 -4997 -10 - - - - - - -error_message -severity - - -12 - - -1 -2 -97 - - - - - - -error_message -error_tag - - -12 - - -1 -2 -97 - - - - - - -error_message -full_error_message - - -12 - - -1 -2 -21 - - -2 -3 -21 - - -5 -6 -10 - - -10 -11 -10 - - -75 -76 -10 - - -332 -333 -10 - - -4996 -4997 -10 - - - - - - -error_message -location - - -12 - - -1 -2 -65 - - -2 -3 -21 - - -5 -6 -10 - - - - - - -full_error_message -id - - -12 - - -1 -2 -58778 - - -841 -842 -10 - - - - - - -full_error_message -severity - - -12 - - -1 -2 -58789 - - - - - - -full_error_message -error_tag - - -12 - - -1 -2 -58789 - - - - - - -full_error_message -error_message - - -12 - - -1 -2 -58789 - - - - - - -full_error_message -location - - -12 - - -1 -2 -58789 - - - - - - -location -id - - -12 - - -1 -2 -108 - - -6254 -6255 -10 - - - - - - -location -severity - - -12 - - -1 -2 -119 - - - - - - -location -error_tag - - -12 - - -1 -2 -108 - - -3 -4 -10 - - - - - - -location -error_message - - -12 - - -1 -2 -108 - - -5 -6 -10 - - - - - - -location -full_error_message - - -12 - - -1 -2 -108 - - -5414 -5415 -10 - - - - - - - - -files -59320 - - -id -59320 - - -name -59320 - - - - -id -name - - -12 - - -1 -2 -59320 - - - - - - -name -id - - -12 - - -1 -2 -59320 - - - - - - - - -folders -10817 - - -id -10817 - - -name -10817 - - - - -id -name - - -12 - - -1 -2 -10817 - - - - - - -name -id - - -12 - - -1 -2 -10817 - - - - - - - - -containerparent -70115 - - -parent -10817 - - -child -70115 - - - - -parent -child - - -12 - - -1 -2 -4931 - - -2 -3 -1387 - - -3 -4 -606 - - -4 -6 -997 - - -6 -10 -802 - - -10 -14 -856 - - -14 -30 -823 - - -30 -153 -411 - - - - - - -child -parent - - -12 - - -1 -2 -70115 - - - - - - - - -fileannotations -5090321 - - -id -4769 - - -kind -21 - - -name -53987 - - -value -44124 - - - - -id -kind - - -12 - - -1 -2 -130 - - -2 -3 -4638 - - - - - - -id -name - - -12 - - -1 -100 -357 - - -111 -222 -357 - - -224 -290 -357 - - -295 -448 -357 - - -448 -527 -357 - - -533 -623 -390 - - -623 -713 -357 - - -726 -901 -357 - - -901 -931 -75 - - -933 -934 -1365 - - -1080 -1671 -357 - - -1693 -2286 -75 - - - - - - -id -value - - -12 - - -1 -112 -357 - - -117 -272 -357 - - -272 -360 -357 - - -379 -633 -357 - - -634 -737 -357 - - -737 -952 -357 - - -952 -1069 -357 - - -1083 -1498 -249 - - -1498 -1499 -1365 - - -1501 -1871 -357 - - -1968 -4072 -292 - - - - - - -kind -id - - -12 - - -428 -429 -10 - - -440 -441 -10 - - - - - - -kind -name - - -12 - - -2 -3 -10 - - -4979 -4980 -10 - - - - - - -kind -value - - -12 - - -1 -2 -10 - - -4071 -4072 -10 - - - - - - -name -id - - -12 - - -1 -2 -8822 - - -2 -3 -5961 - - -3 -6 -4465 - - -6 -8 -4400 - - -8 -14 -4357 - - -14 -18 -3869 - - -18 -21 -4194 - - -21 -34 -4346 - - -34 -128 -4324 - - -129 -236 -4107 - - -236 -395 -4064 - - -395 -440 -1073 - - - - - - -name -kind - - -12 - - -1 -2 -53987 - - - - - - -name -value - - -12 - - -1 -2 -9863 - - -2 -3 -7955 - - -3 -4 -2460 - - -4 -6 -3912 - - -6 -10 -4823 - - -10 -14 -3446 - - -14 -18 -4443 - - -18 -23 -4151 - - -23 -44 -4346 - - -44 -97 -4107 - - -97 -405 -4053 - - -421 -1907 -422 - - - - - - -value -id - - -12 - - -1 -2 -6817 - - -2 -5 -2146 - - -5 -8 -3197 - - -8 -21 -3392 - - -21 -23 -2438 - - -23 -25 -3977 - - -25 -40 -3197 - - -40 -195 -3479 - - -195 -207 -3468 - - -207 -273 -3620 - - -273 -327 -3327 - - -328 -407 -3793 - - -407 -441 -1268 - - - - - - -value -kind - - -12 - - -1 -2 -44113 - - -2 -3 -10 - - - - - - -value -name - - -12 - - -1 -2 -6839 - - -2 -5 -2482 - - -5 -8 -3349 - - -8 -16 -3457 - - -16 -18 -2980 - - -18 -21 -3696 - - -21 -31 -3836 - - -31 -41 -3490 - - -41 -54 -3490 - - -54 -80 -3370 - - -80 -108 -3316 - - -108 -130 -3360 - - -130 -149 -455 - - - - - - - - -inmacroexpansion -60947411 - - -id -15711684 - - -inv -2534941 - - - - -id -inv - - -12 - - -1 -2 -3622961 - - -2 -3 -2447710 - - -3 -4 -1901765 - - -4 -5 -1934999 - - -5 -6 -1869000 - - -6 -7 -969866 - - -7 -8 -1533539 - - -8 -11 -1256082 - - -11 -6193 -175759 - - - - - - -inv -id - - -12 - - -1 -2 -617221 - - -2 -3 -370194 - - -3 -4 -158077 - - -4 -5 -257870 - - -5 -7 -184829 - - -7 -9 -150858 - - -9 -12 -222012 - - -12 -22 -203086 - - -22 -45 -191643 - - -45 -153127 -179147 - - - - - - - - -affectedbymacroexpansion -35536226 - - -id -4085077 - - -inv -3283853 - - - - -id -inv - - -12 - - -1 -2 -1342436 - - -2 -3 -719533 - - -3 -4 -683055 - - -4 -6 -321085 - - -6 -10 -313623 - - -10 -24 -308123 - - -24 -64 -310009 - - -64 -9803 -87208 - - - - - - -inv -id - - -12 - - -1 -2 -253292 - - -2 -3 -210096 - - -3 -4 -202616 - - -4 -5 -258141 - - -5 -6 -301644 - - -6 -7 -247926 - - -7 -8 -231166 - - -8 -9 -228049 - - -9 -10 -182555 - - -10 -12 -285738 - - -12 -16 -297490 - - -16 -23 -275437 - - -23 -60 -249014 - - -60 -526 -60681 - - - - - - - - -macroinvocations -34675701 - - -id -34675701 - - -macro_id -80282 - - -location -752316 - - -kind -21 - - - - -id -macro_id - - -12 - - -1 -2 -34675701 - - - - - - -id -location - - -12 - - -1 -2 -34675701 - - - - - - -id -kind - - -12 - - -1 -2 -34675701 - - - - - - -macro_id -id - - -12 - - -1 -2 -17136 - - -2 -3 -16778 - - -3 -4 -3761 - - -4 -6 -7034 - - -6 -11 -7392 - - -11 -21 -6405 - - -21 -47 -6188 - - -47 -151 -6069 - - -151 -1013 -6026 - - -1014 -196742 -3490 - - - - - - -macro_id -location - - -12 - - -1 -2 -42715 - - -2 -3 -10621 - - -3 -4 -5278 - - -4 -6 -6893 - - -6 -13 -6644 - - -13 -66 -6037 - - -66 -3614 -2091 - - - - - - -macro_id -kind - - -12 - - -1 -2 -74212 - - -2 -3 -6069 - - - - - - -location -id - - -12 - - -1 -2 -285069 - - -2 -3 -194240 - - -3 -4 -45143 - - -4 -5 -55916 - - -5 -9 -68457 - - -9 -26 -60523 - - -26 -257817 -42964 - - - - - - -location -macro_id - - -12 - - -1 -2 -704181 - - -2 -354 -48134 - - - - - - -location -kind - - -12 - - -1 -2 -752316 - - - - - - -kind -id - - -12 - - -21794 -21795 -10 - - -3177447 -3177448 -10 - - - - - - -kind -macro_id - - -12 - - -2221 -2222 -10 - - -5746 -5747 -10 - - - - - - -kind -location - - -12 - - -6578 -6579 -10 - - -62832 -62833 -10 - - - - - - - - -macroparent -31212468 - - -id -31212468 - - -parent_id -24288060 - - - - -id -parent_id - - -12 - - -1 -2 -31212468 - - - - - - -parent_id -id - - -12 - - -1 -2 -18677382 - - -2 -3 -4783954 - - -3 -88 -826723 - - - - - - - - -macrolocationbind -4019158 - - -id -2802505 - - -location -2006328 - - - - -id -location - - -12 - - -1 -2 -2201458 - - -2 -3 -339388 - - -3 -7 -231860 - - -7 -57 -29796 - - - - - - -location -id - - -12 - - -1 -2 -1604130 - - -2 -3 -171086 - - -3 -8 -155542 - - -8 -723 -75567 - - - - - - - - -macro_argument_unexpanded -91317451 - - -invocation -26939874 - - -argument_index -715 - - -text -309012 - - - - -invocation -argument_index - - -12 - - -1 -2 -7463526 - - -2 -3 -11300240 - - -3 -4 -6167062 - - -4 -67 -2009044 - - - - - - -invocation -text - - -12 - - -1 -2 -7530509 - - -2 -3 -11447007 - - -3 -4 -6003116 - - -4 -67 -1959240 - - - - - - -argument_index -invocation - - -12 - - -50779 -50780 -628 - - -50981 -185359 -54 - - -754342 -2485521 -32 - - - - - - -argument_index -text - - -12 - - -2 -3 -628 - - -13 -1004 -54 - - -6629 -19723 -32 - - - - - - -text -invocation - - -12 - - -1 -2 -37588 - - -2 -3 -61759 - - -3 -4 -14252 - - -4 -5 -41761 - - -5 -8 -25416 - - -8 -12 -15466 - - -12 -16 -20918 - - -16 -23 -25709 - - -23 -43 -23205 - - -43 -154 -23216 - - -154 -566476 -19715 - - - - - - -text -argument_index - - -12 - - -1 -2 -223418 - - -2 -3 -75415 - - -3 -9 -10177 - - - - - - - - -macro_argument_expanded -91317451 - - -invocation -26939874 - - -argument_index -715 - - -text -187228 - - - - -invocation -argument_index - - -12 - - -1 -2 -7463526 - - -2 -3 -11300240 - - -3 -4 -6167062 - - -4 -67 -2009044 - - - - - - -invocation -text - - -12 - - -1 -2 -10915238 - - -2 -3 -9757326 - - -3 -4 -5190905 - - -4 -9 -1076404 - - - - - - -argument_index -invocation - - -12 - - -50779 -50780 -628 - - -50981 -185359 -54 - - -754342 -2485521 -32 - - - - - - -argument_index -text - - -12 - - -1 -2 -617 - - -2 -76 -54 - - -869 -13996 -43 - - - - - - -text -invocation - - -12 - - -1 -2 -22717 - - -2 -3 -38694 - - -3 -4 -6449 - - -4 -5 -15293 - - -5 -6 -3468 - - -6 -7 -21883 - - -7 -9 -14599 - - -9 -15 -16225 - - -15 -31 -14914 - - -31 -97 -14198 - - -97 -559 -14057 - - -560 -1126278 -4725 - - - - - - -text -argument_index - - -12 - - -1 -2 -94513 - - -2 -3 -78559 - - -3 -6 -14079 - - -6 -66 -75 - - - - - - - - -functions -3658482 - - -id -3658482 - - -name -292298 - - -kind -75 - - - - -id -name - - -12 - - -1 -2 -3658482 - - - - - - -id -kind - - -12 - - -1 -2 -3658482 - - - - - - -name -id - - -12 - - -1 -2 -195541 - - -2 -3 -29091 - - -3 -5 -26912 - - -5 -12 -21948 - - -12 -123481 -18805 - - - - - - -name -kind - - -12 - - -1 -2 -290304 - - -2 -3 -1994 - - - - - - -kind -id - - -12 - - -32 -33 -10 - - -479 -480 -10 - - -2829 -2830 -10 - - -6206 -6207 -10 - - -66392 -66393 -10 - - -114718 -114719 -10 - - -146882 -146883 -10 - - - - - - -kind -name - - -12 - - -11 -12 -10 - - -42 -43 -10 - - -230 -231 -10 - - -1495 -1496 -10 - - -2829 -2830 -10 - - -3603 -3604 -10 - - -18942 -18943 -10 - - - - - - - - -function_entry_point -996664 - - -id -993781 - - -entry_point -996664 - - - - -id -entry_point - - -12 - - -1 -2 -991169 - - -2 -9 -2612 - - - - - - -entry_point -id - - -12 - - -1 -2 -996664 - - - - - - - - -function_return_type -3668529 - - -id -3658016 - - -return_type -1011394 - - - - -id -return_type - - -12 - - -1 -2 -3647990 - - -2 -6 -10025 - - - - - - -return_type -id - - -12 - - -1 -2 -295658 - - -2 -3 -654745 - - -3 -105613 -60989 - - - - - - - - -coroutine -2 - - -function -2 - - -traits -2 - - -handle -2 - - -promise -2 - - - - -function -traits - - -12 - - -1 -2 -2 - - - - - - -function -handle - - -12 - - -1 -2 -2 - - - - - - -function -promise - - -12 - - -1 -2 -2 - - - - - - -traits -function - - -12 - - -1 -2 -2 - - - - - - -traits -handle - - -12 - - -1 -2 -2 - - - - - - -traits -promise - - -12 - - -1 -2 -2 - - - - - - -handle -function - - -12 - - -1 -2 -2 - - - - - - -handle -traits - - -12 - - -1 -2 -2 - - - - - - -handle -promise - - -12 - - -1 -2 -2 - - - - - - -promise -function - - -12 - - -1 -2 -2 - - - - - - -promise -traits - - -12 - - -1 -2 -2 - - - - - - -promise -handle - - -12 - - -1 -2 -2 - - - - - - - - -coroutine_new -2 - - -function -2 - - -new -1 - - - - -function -new - - -12 - - -1 -2 -2 - - - - - - -new -function - - -12 - - -2 -3 -1 - - - - - - - - -coroutine_delete -2 - - -function -2 - - -delete -1 - - - - -function -delete - - -12 - - -1 -2 -2 - - - - - - -delete -function - - -12 - - -2 -3 -1 - - - - - - - - -purefunctions -20715 - - -id -20715 - - - - - -function_deleted -55526 - - -id -55526 - - - - - -function_defaulted -12778 - - -id -12778 - - - - - -member_function_this_type -517224 - - -id -517224 - - -this_type -169365 - - - - -id -this_type - - -12 - - -1 -2 -517224 - - - - - - -this_type -id - - -12 - - -1 -2 -61813 - - -2 -3 -44037 - - -3 -4 -22035 - - -4 -5 -14838 - - -5 -7 -13526 - - -7 -36 -12724 - - -40 -87 -390 - - - - - - - - -fun_decls -3733464 - - -id -3730234 - - -function -3566244 - - -type_id -998474 - - -name -261115 - - -location -786132 - - - - -id -function - - -12 - - -1 -2 -3730234 - - - - - - -id -type_id - - -12 - - -1 -2 -3727286 - - -2 -4 -2948 - - - - - - -id -name - - -12 - - -1 -2 -3730234 - - - - - - -id -location - - -12 - - -1 -2 -3730234 - - - - - - -function -id - - -12 - - -1 -2 -3431649 - - -2 -9 -134595 - - - - - - -function -type_id - - -12 - - -1 -2 -3549780 - - -2 -6 -16464 - - - - - - -function -name - - -12 - - -1 -2 -3566244 - - - - - - -function -location - - -12 - - -1 -2 -3479621 - - -2 -9 -86623 - - - - - - -type_id -id - - -12 - - -1 -2 -277048 - - -2 -3 -653141 - - -3 -110973 -68283 - - - - - - -type_id -function - - -12 - - -1 -2 -288743 - - -2 -3 -649532 - - -3 -104729 -60198 - - - - - - -type_id -name - - -12 - - -1 -2 -932715 - - -2 -8223 -65758 - - - - - - -type_id -location - - -12 - - -1 -2 -902215 - - -2 -6 -79209 - - -6 -24198 -17049 - - - - - - -name -id - - -12 - - -1 -2 -154159 - - -2 -3 -30023 - - -3 -4 -16344 - - -4 -6 -20062 - - -6 -13 -20929 - - -13 -9944 -19585 - - -123729 -123730 -10 - - - - - - -name -function - - -12 - - -1 -2 -164672 - - -2 -3 -29264 - - -3 -4 -14827 - - -4 -7 -22349 - - -7 -23 -19737 - - -23 -123465 -10264 - - - - - - -name -type_id - - -12 - - -1 -2 -228903 - - -2 -5 -20669 - - -5 -63247 -11543 - - - - - - -name -location - - -12 - - -1 -2 -168477 - - -2 -3 -43528 - - -3 -4 -16409 - - -4 -8 -20897 - - -8 -8921 -11803 - - - - - - -location -id - - -12 - - -1 -2 -516530 - - -2 -3 -130379 - - -3 -4 -50681 - - -4 -13 -61358 - - -13 -3043 -27183 - - - - - - -location -function - - -12 - - -1 -2 -531281 - - -2 -3 -143190 - - -3 -7 -65780 - - -7 -3043 -45880 - - - - - - -location -type_id - - -12 - - -1 -2 -681604 - - -2 -3 -62355 - - -3 -1522 -42173 - - - - - - -location -name - - -12 - - -1 -2 -742691 - - -2 -134 -43441 - - - - - - - - -fun_def -1230856 - - -id -1230856 - - - - - -fun_specialized -6411 - - -id -6411 - - - - - -fun_implicit -14 - - -id -14 - - - - - -fun_decl_specifiers -485928 - - -id -261005 - - -name -6 - - - - -id -name - - -12 - - -1 -2 -69347 - - -2 -3 -158393 - - -3 -4 -33264 - - - - - - -name -id - - -12 - - -24036 -24037 -1 - - -34427 -34428 -1 - - -79541 -79542 -1 - - -160143 -160144 -1 - - - - - - - - -fun_decl_throws -7 - - -fun_decl -7 - - -index -1 - - -type_id -2 - - - - -fun_decl -index - - -12 - - -1 -2 -7 - - - - - - -fun_decl -type_id - - -12 - - -1 -2 -7 - - - - - - -index -fun_decl - - -12 - - -7 -8 -1 - - - - - - -index -type_id - - -12 - - -2 -3 -1 - - - - - - -type_id -fun_decl - - -12 - - -1 -2 -1 - - -6 -7 -1 - - - - - - -type_id -index - - -12 - - -1 -2 -2 - - - - - - - - -fun_decl_empty_throws -1620964 - - -fun_decl -1620964 - - - - - -fun_decl_noexcept -32527 - - -fun_decl -31746 - - -constant -32407 - - - - -fun_decl -constant - - -12 - - -1 -2 -30966 - - -2 -3 -780 - - - - - - -constant -fun_decl - - -12 - - -1 -2 -32288 - - -2 -3 -119 - - - - - - - - -fun_decl_empty_noexcept -401889 - - -fun_decl -401889 - - - - - -fun_decl_typedef_type -173 - - -fun_decl -173 - - -typedeftype_id -86 - - - - -fun_decl -typedeftype_id - - -12 - - -1 -2 -173 - - - - - - -typedeftype_id -fun_decl - - -12 - - -2 -3 -86 - - - - - - - - -param_decl_bind -4596444 - - -id -4596444 - - -index -693 - - -fun_decl -3035277 - - - - -id -index - - -12 - - -1 -2 -4596444 - - - - - - -id -fun_decl - - -12 - - -1 -2 -4596444 - - - - - - -index -id - - -12 - - -1 -2 -346 - - -4 -5 -140 - - -6 -118 -54 - - -191 -616 -54 - - -886 -5115 -54 - - -14149 -280041 -43 - - - - - - -index -fun_decl - - -12 - - -1 -2 -346 - - -4 -5 -140 - - -6 -118 -54 - - -191 -616 -54 - - -886 -5115 -54 - - -14149 -280041 -43 - - - - - - -fun_decl -id - - -12 - - -1 -2 -2169165 - - -2 -3 -472882 - - -3 -4 -239871 - - -4 -65 -153357 - - - - - - -fun_decl -index - - -12 - - -1 -2 -2169165 - - -2 -3 -472882 - - -3 -4 -239871 - - -4 -65 -153357 - - - - - - - - -var_decls -5305568 - - -id -5296821 - - -variable -5071603 - - -type_id -1983812 - - -name -124829 - - -location -1218002 - - - - -id -variable - - -12 - - -1 -2 -5296821 - - - - - - -id -type_id - - -12 - - -1 -2 -5288258 - - -2 -4 -8562 - - - - - - -id -name - - -12 - - -1 -2 -5296821 - - - - - - -id -location - - -12 - - -1 -2 -5296777 - - -2 -3 -43 - - - - - - -variable -id - - -12 - - -1 -2 -4886293 - - -2 -9 -185309 - - - - - - -variable -type_id - - -12 - - -1 -2 -5036670 - - -2 -7 -34933 - - - - - - -variable -name - - -12 - - -1 -2 -5054239 - - -2 -3 -17363 - - - - - - -variable -location - - -12 - - -1 -2 -4964657 - - -2 -9 -106945 - - - - - - -type_id -id - - -12 - - -1 -2 -1561936 - - -2 -3 -226215 - - -3 -11 -155091 - - -11 -5924 -40569 - - - - - - -type_id -variable - - -12 - - -1 -2 -1585846 - - -2 -3 -217088 - - -3 -13 -149325 - - -13 -5424 -31551 - - - - - - -type_id -name - - -12 - - -1 -2 -1811043 - - -2 -5 -149422 - - -5 -772 -23346 - - - - - - -type_id -location - - -12 - - -1 -2 -1737523 - - -2 -4 -152685 - - -4 -3608 -93603 - - - - - - -name -id - - -12 - - -1 -2 -51483 - - -2 -3 -19054 - - -3 -4 -10784 - - -4 -5 -7597 - - -5 -8 -10394 - - -8 -15 -9397 - - -15 -47 -9418 - - -47 -165594 -6698 - - - - - - -name -variable - - -12 - - -1 -2 -54269 - - -2 -3 -18610 - - -3 -4 -11673 - - -4 -6 -11066 - - -6 -11 -10611 - - -11 -27 -9375 - - -27 -164566 -9223 - - - - - - -name -type_id - - -12 - - -1 -2 -75405 - - -2 -3 -16702 - - -3 -4 -8757 - - -4 -7 -10350 - - -7 -27 -9408 - - -27 -125771 -4205 - - - - - - -name -location - - -12 - - -1 -2 -71969 - - -2 -3 -18805 - - -3 -4 -6893 - - -4 -7 -11055 - - -7 -21 -9635 - - -21 -10073 -6470 - - - - - - -location -id - - -12 - - -1 -2 -881958 - - -2 -3 -147406 - - -3 -6 -112104 - - -6 -128414 -76532 - - - - - - -location -variable - - -12 - - -1 -2 -930147 - - -2 -3 -113232 - - -3 -6 -101472 - - -6 -128188 -73150 - - - - - - -location -type_id - - -12 - - -1 -2 -1043010 - - -2 -3 -84119 - - -3 -118352 -90871 - - - - - - -location -name - - -12 - - -1 -2 -1209135 - - -2 -52 -8866 - - - - - - - - -var_def -2408907 - - -id -2408907 - - - - - -var_decl_specifiers -309614 - - -id -309614 - - -name -4 - - - - -id -name - - -12 - - -1 -2 -309614 - - - - - - -name -id - - -12 - - -32 -33 -1 - - -38 -39 -1 - - -2971 -2972 -1 - - -306573 -306574 -1 - - - - - - - - -is_structured_binding -10 - - -id -10 - - - - - -type_decls -1316547 - - -id -1316547 - - -type_id -1285169 - - -location -1074107 - - - - -id -type_id - - -12 - - -1 -2 -1316547 - - - - - - -id -location - - -12 - - -1 -2 -1316547 - - - - - - -type_id -id - - -12 - - -1 -2 -1262343 - - -2 -24 -22826 - - - - - - -type_id -location - - -12 - - -1 -2 -1263622 - - -2 -24 -21547 - - - - - - -location -id - - -12 - - -1 -2 -1019295 - - -2 -506 -54811 - - - - - - -location -type_id - - -12 - - -1 -2 -1020758 - - -2 -506 -53348 - - - - - - - - -type_def -926754 - - -id -926754 - - - - - -type_decl_top -265548 - - -type_decl -265548 - - - - - -namespace_decls -135267 - - -id -135267 - - -namespace_id -7587 - - -location -120819 - - -bodylocation -121144 - - - - -id -namespace_id - - -12 - - -1 -2 -135267 - - - - - - -id -location - - -12 - - -1 -2 -135267 - - - - - - -id -bodylocation - - -12 - - -1 -2 -135267 - - - - - - -namespace_id -id - - -12 - - -1 -2 -3576 - - -2 -3 -1073 - - -3 -4 -411 - - -4 -7 -639 - - -7 -13 -585 - - -13 -27 -585 - - -28 -163 -574 - - -172 -3743 -140 - - - - - - -namespace_id -location - - -12 - - -1 -2 -3576 - - -2 -3 -1073 - - -3 -4 -411 - - -4 -7 -639 - - -7 -13 -585 - - -13 -27 -585 - - -28 -163 -574 - - -172 -3743 -140 - - - - - - -namespace_id -bodylocation - - -12 - - -1 -2 -3576 - - -2 -3 -1073 - - -3 -4 -411 - - -4 -7 -639 - - -7 -13 -585 - - -13 -27 -585 - - -28 -163 -574 - - -172 -3742 -140 - - - - - - -location -id - - -12 - - -1 -2 -112538 - - -2 -8 -8280 - - - - - - -location -namespace_id - - -12 - - -1 -2 -112538 - - -2 -8 -8280 - - - - - - -location -bodylocation - - -12 - - -1 -2 -120082 - - -2 -3 -737 - - - - - - -bodylocation -id - - -12 - - -1 -2 -113221 - - -2 -11 -7923 - - - - - - -bodylocation -namespace_id - - -12 - - -1 -2 -113221 - - -2 -9 -7923 - - - - - - -bodylocation -location - - -12 - - -1 -2 -120754 - - -2 -5 -390 - - - - - - - - -usings -287692 - - -id -287692 - - -element_id -45522 - - -location -23574 - - - - -id -element_id - - -12 - - -1 -2 -287692 - - - - - - -id -location - - -12 - - -1 -2 -287692 - - - - - - -element_id -id - - -12 - - -1 -2 -38596 - - -2 -4 -3706 - - -4 -127 -3219 - - - - - - -element_id -location - - -12 - - -1 -2 -38596 - - -2 -4 -3706 - - -4 -127 -3219 - - - - - - -location -id - - -12 - - -1 -2 -17851 - - -2 -3 -2200 - - -3 -18 -1777 - - -18 -382 -1745 - - - - - - -location -element_id - - -12 - - -1 -2 -17851 - - -2 -3 -2200 - - -3 -18 -1777 - - -18 -382 -1745 - - - - - - - - -using_container -452397 - - -parent -11022 - - -child -287692 - - - - -parent -child - - -12 - - -1 -2 -3154 - - -2 -4 -932 - - -4 -6 -411 - - -6 -7 -2698 - - -7 -17 -921 - - -19 -143 -758 - - -178 -179 -1246 - - -179 -202 -834 - - -202 -501 -65 - - - - - - -child -parent - - -12 - - -1 -2 -212991 - - -2 -3 -49782 - - -3 -11 -22869 - - -13 -47 -2048 - - - - - - - - -static_asserts -130452 - - -id -130452 - - -condition -130452 - - -message -29660 - - -location -16694 - - -enclosing -1721 - - - - -id -condition - - -12 - - -1 -2 -130452 - - - - - - -id -message - - -12 - - -1 -2 -130452 - - - - - - -id -location - - -12 - - -1 -2 -130452 - - - - - - -id -enclosing - - -12 - - -1 -2 -130452 - - - - - - -condition -id - - -12 - - -1 -2 -130452 - - - - - - -condition -message - - -12 - - -1 -2 -130452 - - - - - - -condition -location - - -12 - - -1 -2 -130452 - - - - - - -condition -enclosing - - -12 - - -1 -2 -130452 - - - - - - -message -id - - -12 - - -1 -2 -22073 - - -2 -3 -422 - - -3 -4 -2825 - - -4 -11 -1442 - - -12 -17 -2345 - - -17 -513 -552 - - - - - - -message -condition - - -12 - - -1 -2 -22073 - - -2 -3 -422 - - -3 -4 -2825 - - -4 -11 -1442 - - -12 -17 -2345 - - -17 -513 -552 - - - - - - -message -location - - -12 - - -1 -2 -27510 - - -2 -33 -2150 - - - - - - -message -enclosing - - -12 - - -1 -2 -23476 - - -2 -3 -181 - - -3 -4 -2650 - - -4 -11 -1299 - - -12 -21 -2052 - - - - - - -location -id - - -12 - - -1 -2 -2897 - - -2 -3 -2760 - - -3 -4 -1325 - - -5 -6 -3722 - - -6 -7 -175 - - -14 -15 -2033 - - -16 -17 -38 - - -17 -18 -3397 - - -19 -52 -344 - - - - - - -location -condition - - -12 - - -1 -2 -2897 - - -2 -3 -2760 - - -3 -4 -1325 - - -5 -6 -3722 - - -6 -7 -175 - - -14 -15 -2033 - - -16 -17 -38 - - -17 -18 -3397 - - -19 -52 -344 - - - - - - -location -message - - -12 - - -1 -2 -4410 - - -2 -3 -5976 - - -3 -4 -6119 - - -4 -7 -188 - - - - - - -location -enclosing - - -12 - - -1 -2 -3436 - - -2 -3 -6184 - - -3 -4 -1123 - - -4 -5 -3709 - - -5 -6 -188 - - -13 -14 -2033 - - -16 -21 -19 - - - - - - -enclosing -id - - -12 - - -1 -2 -1169 - - -2 -3 -129 - - -3 -7 -136 - - -9 -108 -136 - - -170 -347 -129 - - -348 -10697 -19 - - - - - - -enclosing -condition - - -12 - - -1 -2 -1169 - - -2 -3 -129 - - -3 -7 -136 - - -9 -108 -136 - - -170 -347 -129 - - -348 -10697 -19 - - - - - - -enclosing -message - - -12 - - -1 -2 -1325 - - -2 -5 -136 - - -5 -180 -129 - - -211 -2870 -129 - - - - - - -enclosing -location - - -12 - - -1 -2 -1312 - - -2 -5 -149 - - -5 -180 -129 - - -211 -1886 -129 - - - - - - - - -params -4589800 - - -id -4572935 - - -function -3007660 - - -index -693 - - -type_id -1834606 - - - - -id -function - - -12 - - -1 -2 -4572273 - - -2 -69 -661 - - - - - - -id -index - - -12 - - -1 -2 -4572935 - - - - - - -id -type_id - - -12 - - -1 -2 -4558064 - - -2 -4 -14870 - - - - - - -function -id - - -12 - - -1 -2 -2140887 - - -2 -3 -469349 - - -3 -4 -241595 - - -4 -65 -155828 - - - - - - -function -index - - -12 - - -1 -2 -2140887 - - -2 -3 -469349 - - -3 -4 -241595 - - -4 -65 -155828 - - - - - - -function -type_id - - -12 - - -1 -2 -2255896 - - -2 -3 -465458 - - -3 -5 -251350 - - -5 -20 -34954 - - - - - - -index -id - - -12 - - -1 -2 -346 - - -4 -5 -140 - - -6 -118 -54 - - -191 -616 -54 - - -884 -5095 -54 - - -14377 -277321 -43 - - - - - - -index -function - - -12 - - -1 -2 -346 - - -4 -5 -140 - - -6 -118 -54 - - -191 -616 -54 - - -884 -5095 -54 - - -14377 -277493 -43 - - - - - - -index -type_id - - -12 - - -1 -2 -346 - - -2 -3 -140 - - -4 -37 -54 - - -38 -104 -54 - - -171 -1179 -54 - - -2870 -151119 -43 - - - - - - -type_id -id - - -12 - - -1 -2 -1486737 - - -2 -3 -184518 - - -3 -14 -137781 - - -14 -5175 -25568 - - - - - - -type_id -function - - -12 - - -1 -2 -1506355 - - -2 -3 -177679 - - -3 -23 -138074 - - -23 -4690 -12497 - - - - - - -type_id -index - - -12 - - -1 -2 -1724311 - - -2 -65 -110294 - - - - - - - - -overrides -158806 - - -new -124352 - - -old -15440 - - - - -new -old - - -12 - - -1 -2 -89904 - - -2 -3 -34441 - - -3 -4 -6 - - - - - - -old -new - - -12 - - -1 -2 -8113 - - -2 -3 -2013 - - -3 -4 -870 - - -4 -5 -1260 - - -5 -10 -1227 - - -10 -43 -1162 - - -44 -218 -792 - - - - - - - - -membervariables -308142 - - -id -300035 - - -type_id -56417 - - -name -94717 - - - - -id -type_id - - -12 - - -1 -2 -292000 - - -2 -5 -8035 - - - - - - -id -name - - -12 - - -1 -2 -300035 - - - - - - -type_id -id - - -12 - - -1 -2 -40463 - - -2 -3 -7041 - - -3 -6 -4586 - - -6 -423 -4235 - - -460 -3062 -90 - - - - - - -type_id -name - - -12 - - -1 -2 -44789 - - -2 -3 -5326 - - -3 -9 -4462 - - -9 -1352 -1838 - - - - - - -name -id - - -12 - - -1 -2 -63303 - - -2 -3 -16272 - - -3 -5 -8288 - - -5 -1294 -6853 - - - - - - -name -type_id - - -12 - - -1 -2 -75353 - - -2 -3 -12998 - - -3 -421 -6366 - - - - - - - - -globalvariables -301151 - - -id -301143 - - -type_id -1460 - - -name -295146 - - - - -id -type_id - - -12 - - -1 -2 -301135 - - -2 -3 -8 - - - - - - -id -name - - -12 - - -1 -2 -301143 - - - - - - -type_id -id - - -12 - - -1 -2 -1013 - - -2 -3 -167 - - -3 -7 -118 - - -7 -64 -110 - - -66 -169462 -52 - - - - - - -type_id -name - - -12 - - -1 -2 -1049 - - -2 -3 -141 - - -3 -7 -117 - - -7 -102 -110 - - -105 -168513 -43 - - - - - - -name -id - - -12 - - -1 -2 -291383 - - -2 -33 -3763 - - - - - - -name -type_id - - -12 - - -1 -2 -294545 - - -2 -12 -601 - - - - - - - - -localvariables -520470 - - -id -520392 - - -type_id -47453 - - -name -75119 - - - - -id -type_id - - -12 - - -1 -2 -520314 - - -2 -3 -77 - - - - - - -id -name - - -12 - - -1 -2 -520392 - - - - - - -type_id -id - - -12 - - -1 -2 -26432 - - -2 -3 -6749 - - -3 -4 -2851 - - -4 -6 -4053 - - -6 -13 -3800 - - -13 -3196 -3559 - - -4920 -4921 -6 - - - - - - -type_id -name - - -12 - - -1 -2 -35643 - - -2 -3 -4865 - - -3 -5 -4261 - - -5 -1158 -2682 - - - - - - -name -id - - -12 - - -1 -2 -42892 - - -2 -3 -12894 - - -3 -4 -5079 - - -4 -7 -6710 - - -7 -31 -5696 - - -31 -6112 -1844 - - - - - - -name -type_id - - -12 - - -1 -2 -63634 - - -2 -3 -6379 - - -3 -819 -5105 - - - - - - - - -autoderivation -19481 - - -var -19481 - - -derivation_type -32 - - - - -var -derivation_type - - -12 - - -1 -2 -19481 - - - - - - -derivation_type -var - - -12 - - -20 -21 -6 - - -39 -40 -6 - - -161 -162 -6 - - -475 -476 -6 - - -2304 -2305 -6 - - - - - - - - -enumconstants -93691 - - -id -93691 - - -parent -7996 - - -index -7567 - - -type_id -7853 - - -name -72787 - - -location -75749 - - - - -id -parent - - -12 - - -1 -2 -93691 - - - - - - -id -index - - -12 - - -1 -2 -93691 - - - - - - -id -type_id - - -12 - - -1 -2 -93691 - - - - - - -id -name - - -12 - - -1 -2 -93691 - - - - - - -id -location - - -12 - - -1 -2 -93691 - - - - - - -parent -id - - -12 - - -1 -2 -1591 - - -2 -3 -818 - - -3 -4 -2448 - - -4 -5 -578 - - -5 -6 -578 - - -6 -9 -727 - - -9 -16 -610 - - -16 -392 -604 - - -426 -1166 -38 - - - - - - -parent -index - - -12 - - -1 -2 -1591 - - -2 -3 -831 - - -3 -4 -2494 - - -4 -5 -571 - - -5 -6 -584 - - -6 -9 -701 - - -9 -17 -623 - - -17 -1166 -597 - - - - - - -parent -type_id - - -12 - - -1 -2 -7255 - - -2 -3 -740 - - - - - - -parent -name - - -12 - - -1 -2 -1591 - - -2 -3 -831 - - -3 -4 -2494 - - -4 -5 -571 - - -5 -6 -584 - - -6 -9 -701 - - -9 -17 -623 - - -17 -1166 -597 - - - - - - -parent -location - - -12 - - -1 -2 -1630 - - -2 -3 -831 - - -3 -4 -2448 - - -4 -5 -578 - - -5 -6 -558 - - -6 -9 -701 - - -9 -16 -610 - - -16 -427 -604 - - -466 -1166 -32 - - - - - - -index -id - - -12 - - -1 -2 -2604 - - -2 -3 -928 - - -3 -4 -922 - - -4 -7 -571 - - -7 -10 -688 - - -10 -11 -350 - - -11 -12 -552 - - -12 -30 -597 - - -30 -1253 -350 - - - - - - -index -parent - - -12 - - -1 -2 -2604 - - -2 -3 -928 - - -3 -4 -922 - - -4 -7 -571 - - -7 -9 -675 - - -9 -11 -363 - - -11 -12 -552 - - -12 -29 -597 - - -29 -1232 -350 - - - - - - -index -type_id - - -12 - - -1 -2 -2604 - - -2 -3 -928 - - -3 -4 -922 - - -4 -7 -571 - - -7 -9 -675 - - -9 -11 -363 - - -11 -12 -552 - - -12 -28 -597 - - -28 -1210 -350 - - - - - - -index -name - - -12 - - -1 -2 -2604 - - -2 -3 -928 - - -3 -4 -922 - - -4 -7 -571 - - -7 -10 -688 - - -10 -11 -350 - - -11 -12 -552 - - -12 -28 -597 - - -28 -674 -350 - - - - - - -index -location - - -12 - - -1 -2 -2604 - - -2 -3 -928 - - -3 -4 -922 - - -4 -7 -571 - - -7 -10 -688 - - -10 -11 -350 - - -11 -12 -552 - - -12 -28 -597 - - -28 -774 -350 - - - - - - -type_id -id - - -12 - - -1 -2 -1591 - - -2 -3 -799 - - -3 -4 -2422 - - -4 -5 -558 - - -5 -6 -558 - - -6 -9 -701 - - -9 -16 -597 - - -16 -470 -591 - - -479 -1166 -32 - - - - - - -type_id -parent - - -12 - - -1 -2 -7847 - - -137 -138 -6 - - - - - - -type_id -index - - -12 - - -1 -2 -1591 - - -2 -3 -811 - - -3 -4 -2468 - - -4 -5 -552 - - -5 -6 -565 - - -6 -9 -675 - - -9 -17 -610 - - -17 -1166 -578 - - - - - - -type_id -name - - -12 - - -1 -2 -1591 - - -2 -3 -811 - - -3 -4 -2468 - - -4 -5 -552 - - -5 -6 -565 - - -6 -9 -675 - - -9 -17 -610 - - -17 -1166 -578 - - - - - - -type_id -location - - -12 - - -1 -2 -1630 - - -2 -3 -811 - - -3 -4 -2422 - - -4 -5 -558 - - -5 -6 -539 - - -6 -9 -675 - - -9 -16 -597 - - -16 -470 -591 - - -621 -1166 -25 - - - - - - -name -id - - -12 - - -1 -2 -65440 - - -2 -3 -6827 - - -3 -239 -519 - - - - - - -name -parent - - -12 - - -1 -2 -66083 - - -2 -3 -6184 - - -3 -239 -519 - - - - - - -name -index - - -12 - - -1 -2 -67772 - - -2 -13 -5014 - - - - - - -name -type_id - - -12 - - -1 -2 -61049 - - -2 -3 -11218 - - -3 -239 -519 - - - - - - -name -location - - -12 - - -1 -2 -70318 - - -2 -23 -2468 - - - - - - -location -id - - -12 - - -1 -2 -70468 - - -2 -229 -5281 - - - - - - -location -parent - - -12 - - -1 -2 -70578 - - -2 -229 -5170 - - - - - - -location -index - - -12 - - -1 -2 -72157 - - -2 -17 -3592 - - - - - - -location -type_id - - -12 - - -1 -2 -65544 - - -2 -3 -9951 - - -3 -229 -253 - - - - - - -location -name - - -12 - - -1 -2 -75580 - - -2 -27 -168 - - - - - - - - -builtintypes -509 - - -id -509 - - -name -509 - - -kind -509 - - -size -75 - - -sign -32 - - -alignment -54 - - - - -id -name - - -12 - - -1 -2 -509 - - - - - - -id -kind - - -12 - - -1 -2 -509 - - - - - - -id -size - - -12 - - -1 -2 -509 - - - - - - -id -sign - - -12 - - -1 -2 -509 - - - - - - -id -alignment - - -12 - - -1 -2 -509 - - - - - - -name -id - - -12 - - -1 -2 -509 - - - - - - -name -kind - - -12 - - -1 -2 -509 - - - - - - -name -size - - -12 - - -1 -2 -509 - - - - - - -name -sign - - -12 - - -1 -2 -509 - - - - - - -name -alignment - - -12 - - -1 -2 -509 - - - - - - -kind -id - - -12 - - -1 -2 -509 - - - - - - -kind -name - - -12 - - -1 -2 -509 - - - - - - -kind -size - - -12 - - -1 -2 -509 - - - - - - -kind -sign - - -12 - - -1 -2 -509 - - - - - - -kind -alignment - - -12 - - -1 -2 -509 - - - - - - -size -id - - -12 - - -1 -2 -10 - - -2 -3 -10 - - -4 -5 -10 - - -7 -8 -10 - - -9 -10 -10 - - -11 -12 -10 - - -13 -14 -10 - - - - - - -size -name - - -12 - - -1 -2 -10 - - -2 -3 -10 - - -4 -5 -10 - - -7 -8 -10 - - -9 -10 -10 - - -11 -12 -10 - - -13 -14 -10 - - - - - - -size -kind - - -12 - - -1 -2 -10 - - -2 -3 -10 - - -4 -5 -10 - - -7 -8 -10 - - -9 -10 -10 - - -11 -12 -10 - - -13 -14 -10 - - - - - - -size -sign - - -12 - - -1 -2 -21 - - -3 -4 -54 - - - - - - -size -alignment - - -12 - - -1 -2 -54 - - -2 -3 -21 - - - - - - -sign -id - - -12 - - -6 -7 -10 - - -12 -13 -10 - - -29 -30 -10 - - - - - - -sign -name - - -12 - - -6 -7 -10 - - -12 -13 -10 - - -29 -30 -10 - - - - - - -sign -kind - - -12 - - -6 -7 -10 - - -12 -13 -10 - - -29 -30 -10 - - - - - - -sign -size - - -12 - - -5 -6 -21 - - -7 -8 -10 - - - - - - -sign -alignment - - -12 - - -5 -6 -32 - - - - - - -alignment -id - - -12 - - -4 -5 -10 - - -8 -9 -10 - - -10 -11 -10 - - -12 -13 -10 - - -13 -14 -10 - - - - - - -alignment -name - - -12 - - -4 -5 -10 - - -8 -9 -10 - - -10 -11 -10 - - -12 -13 -10 - - -13 -14 -10 - - - - - - -alignment -kind - - -12 - - -4 -5 -10 - - -8 -9 -10 - - -10 -11 -10 - - -12 -13 -10 - - -13 -14 -10 - - - - - - -alignment -size - - -12 - - -1 -2 -10 - - -2 -3 -43 - - - - - - -alignment -sign - - -12 - - -3 -4 -54 - - - - - - - - -derivedtypes -4408457 - - -id -4408457 - - -name -2176199 - - -kind -86 - - -type_id -2578132 - - - - -id -name - - -12 - - -1 -2 -4408457 - - - - - - -id -kind - - -12 - - -1 -2 -4408457 - - - - - - -id -type_id - - -12 - - -1 -2 -4408457 - - - - - - -name -id - - -12 - - -1 -2 -1573891 - - -2 -3 -488328 - - -3 -45171 -113980 - - - - - - -name -kind - - -12 - - -1 -2 -2176167 - - -2 -3 -32 - - - - - - -name -type_id - - -12 - - -1 -2 -1574130 - - -2 -3 -488100 - - -3 -45153 -113969 - - - - - - -kind -id - - -12 - - -21 -22 -10 - - -62 -63 -10 - - -2069 -2070 -10 - - -31133 -31134 -10 - - -45223 -45224 -10 - - -61016 -61017 -10 - - -96858 -96859 -10 - - -170348 -170349 -10 - - - - - - -kind -name - - -12 - - -1 -2 -10 - - -13 -14 -10 - - -39 -40 -10 - - -1155 -1156 -10 - - -17432 -17433 -10 - - -40934 -40935 -10 - - -48321 -48322 -10 - - -92888 -92889 -10 - - - - - - -kind -type_id - - -12 - - -12 -13 -10 - - -21 -22 -10 - - -983 -984 -10 - - -31133 -31134 -10 - - -45223 -45224 -10 - - -61016 -61017 -10 - - -96527 -96528 -10 - - -170348 -170349 -10 - - - - - - -type_id -id - - -12 - - -1 -2 -1521486 - - -2 -3 -365026 - - -3 -4 -620527 - - -4 -202 -71091 - - - - - - -type_id -name - - -12 - - -1 -2 -1522689 - - -2 -3 -364874 - - -3 -4 -619476 - - -4 -198 -71091 - - - - - - -type_id -kind - - -12 - - -1 -2 -1523003 - - -2 -3 -366143 - - -3 -4 -619433 - - -4 -7 -69552 - - - - - - - - -pointerishsize -3335520 - - -id -3335520 - - -size -21 - - -alignment -10 - - - - -id -size - - -12 - - -1 -2 -3335520 - - - - - - -id -alignment - - -12 - - -1 -2 -3335520 - - - - - - -size -id - - -12 - - -21 -22 -10 - - -307720 -307721 -10 - - - - - - -size -alignment - - -12 - - -1 -2 -21 - - - - - - -alignment -id - - -12 - - -307741 -307742 -10 - - - - - - -alignment -size - - -12 - - -2 -3 -10 - - - - - - - - -arraysizes -16995 - - -id -16995 - - -num_elements -2135 - - -bytesize -2482 - - -alignment -75 - - - - -id -num_elements - - -12 - - -1 -2 -16995 - - - - - - -id -bytesize - - -12 - - -1 -2 -16995 - - - - - - -id -alignment - - -12 - - -1 -2 -16995 - - - - - - -num_elements -id - - -12 - - -1 -2 -162 - - -2 -3 -1257 - - -3 -4 -75 - - -4 -5 -173 - - -5 -13 -162 - - -13 -25 -162 - - -38 -116 -140 - - - - - - -num_elements -bytesize - - -12 - - -1 -2 -1571 - - -2 -3 -216 - - -3 -4 -119 - - -4 -6 -162 - - -6 -11 -65 - - - - - - -num_elements -alignment - - -12 - - -1 -2 -1571 - - -2 -3 -238 - - -3 -4 -140 - - -4 -7 -162 - - -7 -8 -21 - - - - - - -bytesize -id - - -12 - - -1 -2 -151 - - -2 -3 -1387 - - -3 -4 -108 - - -4 -6 -205 - - -6 -9 -195 - - -9 -18 -205 - - -21 -56 -195 - - -59 -75 -32 - - - - - - -bytesize -num_elements - - -12 - - -1 -2 -1885 - - -2 -3 -346 - - -3 -6 -216 - - -6 -7 -32 - - - - - - -bytesize -alignment - - -12 - - -1 -2 -1929 - - -2 -3 -281 - - -3 -5 -227 - - -5 -7 -43 - - - - - - -alignment -id - - -12 - - -18 -19 -21 - - -33 -34 -10 - - -50 -51 -10 - - -181 -182 -10 - - -407 -408 -10 - - -861 -862 -10 - - - - - - -alignment -num_elements - - -12 - - -4 -5 -10 - - -5 -6 -10 - - -13 -14 -10 - - -16 -17 -10 - - -39 -40 -10 - - -41 -42 -10 - - -190 -191 -10 - - - - - - -alignment -bytesize - - -12 - - -1 -2 -10 - - -2 -3 -10 - - -14 -15 -10 - - -17 -18 -10 - - -41 -42 -10 - - -54 -55 -10 - - -191 -192 -10 - - - - - - - - -typedefbase -1798090 - - -id -1798090 - - -type_id -837313 - - - - -id -type_id - - -12 - - -1 -2 -1798090 - - - - - - -type_id -id - - -12 - - -1 -2 -648849 - - -2 -3 -86937 - - -3 -6 -68695 - - -6 -5503 -32830 - - - - - - - - -decltypes -46454 - - -id -46454 - - -expr -42932 - - -base_type -8530 - - -parentheses_would_change_meaning -21 - - - - -id -expr - - -12 - - -1 -2 -46454 - - - - - - -id -base_type - - -12 - - -1 -2 -46454 - - - - - - -id -parentheses_would_change_meaning - - -12 - - -1 -2 -46454 - - - - - - -expr -id - - -12 - - -1 -2 -39691 - - -2 -4 -3240 - - - - - - -expr -base_type - - -12 - - -1 -2 -39691 - - -2 -4 -3240 - - - - - - -expr -parentheses_would_change_meaning - - -12 - - -1 -2 -42932 - - - - - - -base_type -id - - -12 - - -1 -2 -5755 - - -2 -3 -2492 - - -3 -274 -281 - - - - - - -base_type -expr - - -12 - - -1 -2 -2286 - - -2 -3 -5636 - - -3 -2451 -606 - - - - - - -base_type -parentheses_would_change_meaning - - -12 - - -1 -2 -8530 - - - - - - -parentheses_would_change_meaning -id - - -12 - - -8 -9 -10 - - -1356 -1357 -10 - - - - - - -parentheses_would_change_meaning -expr - - -12 - - -8 -9 -10 - - -3953 -3954 -10 - - - - - - -parentheses_would_change_meaning -base_type - - -12 - - -8 -9 -10 - - -779 -780 -10 - - - - - - - - -usertypes -4144306 - - -id -4144306 - - -name -868886 - - -kind -119 - - - - -id -name - - -12 - - -1 -2 -4144306 - - - - - - -id -kind - - -12 - - -1 -2 -4144306 - - - - - - -name -id - - -12 - - -1 -2 -570463 - - -2 -3 -192539 - - -3 -7 -68500 - - -7 -32725 -37382 - - - - - - -name -kind - - -12 - - -1 -2 -816860 - - -2 -10 -52025 - - - - - - -kind -id - - -12 - - -23 -24 -10 - - -372 -373 -10 - - -776 -777 -10 - - -1938 -1939 -10 - - -4229 -4230 -10 - - -16782 -16783 -10 - - -17797 -17798 -10 - - -20548 -20549 -10 - - -75592 -75593 -10 - - -95191 -95192 -10 - - -149113 -149114 -10 - - - - - - -kind -name - - -12 - - -16 -17 -10 - - -38 -39 -21 - - -418 -419 -10 - - -560 -561 -10 - - -780 -781 -10 - - -2853 -2854 -10 - - -4550 -4551 -10 - - -9138 -9139 -10 - - -11663 -11664 -10 - - -55440 -55441 -10 - - - - - - - - -usertypesize -1370156 - - -id -1370156 - - -size -1463 - - -alignment -86 - - - - -id -size - - -12 - - -1 -2 -1370156 - - - - - - -id -alignment - - -12 - - -1 -2 -1370156 - - - - - - -size -id - - -12 - - -1 -2 -422 - - -2 -3 -195 - - -3 -4 -65 - - -4 -5 -86 - - -5 -8 -119 - - -8 -12 -108 - - -12 -17 -119 - - -19 -38 -119 - - -42 -261 -119 - - -284 -99362 -108 - - - - - - -size -alignment - - -12 - - -1 -2 -1203 - - -2 -3 -173 - - -3 -6 -86 - - - - - - -alignment -id - - -12 - - -1 -2 -10 - - -3 -4 -10 - - -7 -8 -10 - - -50 -51 -10 - - -54 -55 -10 - - -2327 -2328 -10 - - -10108 -10109 -10 - - -113863 -113864 -10 - - - - - - -alignment -size - - -12 - - -1 -2 -21 - - -3 -4 -10 - - -8 -9 -10 - - -12 -13 -10 - - -17 -18 -10 - - -25 -26 -10 - - -106 -107 -10 - - - - - - - - -usertype_final -1312 - - -id -1312 - - - - - -usertype_uuid -4826 - - -id -4826 - - -uuid -4826 - - - - -id -uuid - - -12 - - -1 -2 -4826 - - - - - - -uuid -id - - -12 - - -1 -2 -4826 - - - - - - - - -mangled_name -4141065 - - -id -4141065 - - -mangled_name -478020 - - - - -id -mangled_name - - -12 - - -1 -2 -4141065 - - - - - - -mangled_name -id - - -12 - - -1 -2 -288667 - - -2 -3 -61563 - - -3 -4 -32949 - - -4 -7 -36537 - - -7 -24 -36634 - - -24 -8580 -21666 - - - - - - - - -is_pod_class -582213 - - -id -582213 - - - - - -is_standard_layout_class -1145425 - - -id -1145425 - - - - - -is_complete -1348901 - - -id -1348901 - - - - - -is_class_template -222714 - - -id -222714 - - - - - -class_instantiation -1144049 - - -to -1142499 - - -from -67232 - - - - -to -from - - -12 - - -1 -2 -1141036 - - -2 -4 -1463 - - - - - - -from -to - - -12 - - -1 -2 -19726 - - -2 -3 -11857 - - -3 -4 -6774 - - -4 -5 -4563 - - -5 -7 -5571 - - -7 -11 -5982 - - -11 -20 -5137 - - -20 -84 -5050 - - -84 -4845 -2568 - - - - - - - - -class_template_argument -3000322 - - -type_id -1376323 - - -index -1213 - - -arg_type -850742 - - - - -type_id -index - - -12 - - -1 -2 -560264 - - -2 -3 -428660 - - -3 -4 -242126 - - -4 -7 -121372 - - -7 -113 -23899 - - - - - - -type_id -arg_type - - -12 - - -1 -2 -586190 - - -2 -3 -440746 - - -3 -4 -255425 - - -4 -113 -93960 - - - - - - -index -type_id - - -12 - - -1 -2 -10 - - -2 -3 -769 - - -3 -26 -97 - - -29 -64 -97 - - -69 -435 -97 - - -616 -9358 -97 - - -13712 -123907 -43 - - - - - - -index -arg_type - - -12 - - -1 -2 -10 - - -2 -3 -769 - - -3 -14 -108 - - -14 -26 -97 - - -29 -148 -97 - - -198 -3602 -97 - - -11971 -41372 -32 - - - - - - -arg_type -type_id - - -12 - - -1 -2 -516183 - - -2 -3 -185136 - - -3 -4 -56047 - - -4 -11 -66603 - - -11 -11852 -26771 - - - - - - -arg_type -index - - -12 - - -1 -2 -737629 - - -2 -3 -94426 - - -3 -22 -18685 - - - - - - - - -class_template_argument_value -342536 - - -type_id -221229 - - -index -151 - - -arg_value -325172 - - - - -type_id -index - - -12 - - -1 -2 -199129 - - -2 -3 -13548 - - -3 -14 -8551 - - - - - - -type_id -arg_value - - -12 - - -1 -2 -187640 - - -2 -3 -16724 - - -3 -37 -16594 - - -44 -171 -270 - - - - - - -index -type_id - - -12 - - -8 -9 -54 - - -20 -21 -10 - - -25 -26 -10 - - -206 -207 -10 - - -389 -390 -10 - - -552 -553 -10 - - -1310 -1311 -10 - - -5430 -5431 -10 - - -5675 -5676 -10 - - -9813 -9814 -10 - - - - - - -index -arg_value - - -12 - - -8 -9 -54 - - -20 -21 -10 - - -42 -43 -10 - - -311 -312 -10 - - -514 -515 -10 - - -715 -716 -10 - - -1597 -1598 -10 - - -6347 -6348 -10 - - -8321 -8322 -10 - - -12094 -12095 -10 - - - - - - -arg_value -type_id - - -12 - - -1 -2 -308123 - - -2 -4 -17049 - - - - - - -arg_value -index - - -12 - - -1 -2 -325172 - - - - - - - - -is_proxy_class_for -45836 - - -id -45836 - - -templ_param_id -45836 - - - - -id -templ_param_id - - -12 - - -1 -2 -45836 - - - - - - -templ_param_id -id - - -12 - - -1 -2 -45836 - - - - - - - - -type_mentions -1674881 - - -id -1674881 - - -type_id -67096 - - -location -1644422 - - -kind -12 - - - - -id -type_id - - -12 - - -1 -2 -1674881 - - - - - - -id -location - - -12 - - -1 -2 -1674881 - - - - - - -id -kind - - -12 - - -1 -2 -1674881 - - - - - - -type_id -id - - -12 - - -1 -2 -30024 - - -2 -3 -12283 - - -3 -4 -3631 - - -4 -7 -6054 - - -7 -13 -5138 - - -13 -35 -5183 - - -35 -9490 -4781 - - - - - - -type_id -location - - -12 - - -1 -2 -30024 - - -2 -3 -12283 - - -3 -4 -3631 - - -4 -7 -6054 - - -7 -13 -5138 - - -13 -35 -5183 - - -35 -9490 -4781 - - - - - - -type_id -kind - - -12 - - -1 -2 -65856 - - -2 -3 -1240 - - - - - - -location -id - - -12 - - -1 -2 -1614300 - - -2 -5 -30121 - - - - - - -location -type_id - - -12 - - -1 -2 -1614300 - - -2 -5 -30121 - - - - - - -location -kind - - -12 - - -1 -2 -1644422 - - - - - - -kind -id - - -12 - - -685 -686 -6 - - -257149 -257150 -6 - - - - - - -kind -type_id - - -12 - - -207 -208 -6 - - -10313 -10314 -6 - - - - - - -kind -location - - -12 - - -677 -678 -6 - - -252468 -252469 -6 - - - - - - - - -is_function_template -972255 - - -id -972255 - - - - - -function_instantiation -700030 - - -to -700030 - - -from -127821 - - - - -to -from - - -12 - - -1 -2 -700030 - - - - - - -from -to - - -12 - - -1 -2 -60295 - - -2 -3 -30478 - - -3 -4 -7261 - - -4 -5 -8714 - - -5 -10 -9884 - - -10 -71 -9592 - - -71 -653 -1593 - - - - - - - - -function_template_argument -1888193 - - -function_id -1042035 - - -index -216 - - -arg_type -334493 - - - - -function_id -index - - -12 - - -1 -2 -576761 - - -2 -3 -287605 - - -3 -4 -126271 - - -4 -21 -51397 - - - - - - -function_id -arg_type - - -12 - - -1 -2 -591014 - - -2 -3 -285318 - - -3 -4 -109644 - - -4 -21 -56057 - - - - - - -index -function_id - - -12 - - -4 -5 -10 - - -7 -8 -10 - - -17 -18 -10 - - -39 -40 -10 - - -65 -66 -10 - - -152 -153 -10 - - -241 -242 -10 - - -328 -329 -10 - - -425 -426 -10 - - -523 -524 -10 - - -758 -759 -10 - - -1011 -1012 -10 - - -1520 -1521 -10 - - -1705 -1706 -10 - - -2571 -2572 -10 - - -2915 -2916 -10 - - -5729 -5730 -10 - - -18257 -18258 -10 - - -44058 -44059 -10 - - -90976 -90977 -10 - - - - - - -index -arg_type - - -12 - - -4 -5 -10 - - -7 -8 -10 - - -14 -15 -10 - - -22 -23 -10 - - -32 -33 -10 - - -54 -55 -10 - - -60 -61 -10 - - -62 -63 -10 - - -78 -79 -10 - - -91 -92 -10 - - -140 -141 -10 - - -214 -215 -10 - - -242 -243 -10 - - -317 -318 -10 - - -521 -522 -10 - - -694 -695 -10 - - -1488 -1489 -10 - - -3726 -3727 -10 - - -8711 -8712 -10 - - -17522 -17523 -10 - - - - - - -arg_type -function_id - - -12 - - -1 -2 -223483 - - -2 -3 -44590 - - -3 -6 -27346 - - -6 -19 -25308 - - -19 -2030 -13765 - - - - - - -arg_type -index - - -12 - - -1 -2 -311147 - - -2 -12 -23346 - - - - - - - - -function_template_argument_value -197655 - - -function_id -105829 - - -index -151 - - -arg_value -170363 - - - - -function_id -index - - -12 - - -1 -2 -100377 - - -2 -14 -5451 - - - - - - -function_id -arg_value - - -12 - - -1 -2 -83967 - - -2 -3 -15987 - - -3 -119 -5874 - - - - - - -index -function_id - - -12 - - -3 -4 -65 - - -5 -6 -10 - - -6 -7 -10 - - -111 -112 -10 - - -445 -446 -10 - - -861 -862 -10 - - -2152 -2153 -10 - - -2453 -2454 -10 - - -4262 -4263 -10 - - - - - - -index -arg_value - - -12 - - -5 -6 -65 - - -7 -8 -10 - - -8 -9 -10 - - -169 -170 -10 - - -408 -409 -10 - - -1024 -1025 -10 - - -2547 -2548 -10 - - -4912 -4913 -10 - - -6613 -6614 -10 - - - - - - -arg_value -function_id - - -12 - - -1 -2 -143569 - - -2 -3 -26294 - - -3 -4 -498 - - - - - - -arg_value -index - - -12 - - -1 -2 -170363 - - - - - - - - -is_variable_template -17602 - - -id -17602 - - - - - -variable_instantiation -35388 - - -to -35388 - - -from -6394 - - - - -to -from - - -12 - - -1 -2 -35388 - - - - - - -from -to - - -12 - - -1 -2 -2211 - - -2 -3 -1885 - - -3 -4 -357 - - -4 -5 -726 - - -5 -9 -531 - - -9 -21 -487 - - -24 -288 -195 - - - - - - - - -variable_template_argument -5476 - - -variable_id -844 - - -index -32 - - -arg_type -4196 - - - - -variable_id -index - - -12 - - -1 -2 -682 - - -2 -3 -123 - - -3 -5 -38 - - - - - - -variable_id -arg_type - - -12 - - -1 -2 -370 - - -2 -3 -129 - - -3 -4 -64 - - -4 -6 -71 - - -6 -8 -71 - - -8 -13 -64 - - -13 -85 -64 - - -202 -203 -6 - - - - - - -index -variable_id - - -12 - - -3 -4 -6 - - -6 -7 -6 - - -10 -11 -6 - - -20 -21 -6 - - -125 -126 -6 - - - - - - -index -arg_type - - -12 - - -21 -22 -6 - - -83 -84 -6 - - -115 -116 -6 - - -139 -140 -6 - - -322 -323 -6 - - - - - - -arg_type -variable_id - - -12 - - -1 -2 -3475 - - -2 -3 -474 - - -3 -11 -246 - - - - - - -arg_type -index - - -12 - - -1 -2 -3982 - - -2 -4 -214 - - - - - - - - -variable_template_argument_value -136 - - -variable_id -19 - - -index -12 - - -arg_value -136 - - - - -variable_id -index - - -12 - - -1 -2 -12 - - -2 -3 -6 - - - - - - -variable_id -arg_value - - -12 - - -3 -4 -12 - - -15 -16 -6 - - - - - - -index -variable_id - - -12 - - -1 -2 -6 - - -3 -4 -6 - - - - - - -index -arg_value - - -12 - - -6 -7 -6 - - -15 -16 -6 - - - - - - -arg_value -variable_id - - -12 - - -1 -2 -136 - - - - - - -arg_value -index - - -12 - - -1 -2 -136 - - - - - - - - -routinetypes -421539 - - -id -421539 - - -return_type -173397 - - - - -id -return_type - - -12 - - -1 -2 -421539 - - - - - - -return_type -id - - -12 - - -1 -2 -139917 - - -2 -3 -17580 - - -3 -10 -13342 - - -10 -8267 -2557 - - - - - - - - -routinetypeargs -704387 - - -routine -344519 - - -index -346 - - -type_id -202391 - - - - -routine -index - - -12 - - -1 -2 -158418 - - -2 -3 -94112 - - -3 -4 -53066 - - -4 -6 -31421 - - -6 -33 -7500 - - - - - - -routine -type_id - - -12 - - -1 -2 -182632 - - -2 -3 -94925 - - -3 -4 -46563 - - -4 -22 -20398 - - - - - - -index -routine - - -12 - - -1 -2 -119 - - -2 -7 -21 - - -10 -16 -21 - - -19 -33 -21 - - -51 -72 -21 - - -90 -111 -21 - - -134 -193 -21 - - -262 -356 -21 - - -464 -693 -21 - - -1438 -3592 -21 - - -8487 -17171 -21 - - -31786 -31787 -10 - - - - - - -index -type_id - - -12 - - -1 -2 -119 - - -2 -5 -21 - - -6 -10 -21 - - -11 -22 -21 - - -32 -36 -21 - - -37 -41 -21 - - -43 -82 -21 - - -124 -183 -21 - - -248 -346 -21 - - -466 -1095 -21 - - -2669 -6025 -21 - - -13431 -13432 -10 - - - - - - -type_id -routine - - -12 - - -1 -2 -120526 - - -2 -3 -40265 - - -3 -4 -12963 - - -4 -7 -16420 - - -7 -1325 -12215 - - - - - - -type_id -index - - -12 - - -1 -2 -151709 - - -2 -3 -38835 - - -3 -33 -11846 - - - - - - - - -ptrtomembers -12486 - - -id -12486 - - -type_id -9288 - - -class_id -6286 - - - - -id -type_id - - -12 - - -1 -2 -12486 - - - - - - -id -class_id - - -12 - - -1 -2 -12486 - - - - - - -type_id -id - - -12 - - -1 -2 -8931 - - -2 -111 -357 - - - - - - -type_id -class_id - - -12 - - -1 -2 -8931 - - -2 -111 -357 - - - - - - -class_id -id - - -12 - - -1 -2 -5278 - - -2 -3 -509 - - -8 -65 -498 - - - - - - -class_id -type_id - - -12 - - -1 -2 -5278 - - -2 -3 -509 - - -8 -65 -498 - - - - - - - - -specifiers -498 - - -id -498 - - -str -498 - - - - -id -str - - -12 - - -1 -2 -498 - - - - - - -str -id - - -12 - - -1 -2 -498 - - - - - - - - -typespecifiers -1316038 - - -type_id -1309231 - - -spec_id -75 - - - - -type_id -spec_id - - -12 - - -1 -2 -1302424 - - -2 -3 -6806 - - - - - - -spec_id -type_id - - -12 - - -102 -103 -10 - - -222 -223 -10 - - -598 -599 -10 - - -957 -958 -10 - - -2363 -2364 -10 - - -20785 -20786 -10 - - -96393 -96394 -10 - - - - - - - - -funspecifiers -11898581 - - -func_id -3610802 - - -spec_id -173 - - - - -func_id -spec_id - - -12 - - -1 -2 -332055 - - -2 -3 -428379 - - -3 -4 -865569 - - -4 -5 -1867415 - - -5 -8 -117383 - - - - - - -spec_id -func_id - - -12 - - -50 -51 -10 - - -181 -182 -10 - - -491 -492 -10 - - -592 -593 -10 - - -662 -663 -10 - - -5721 -5722 -10 - - -9634 -9635 -10 - - -10714 -10715 -10 - - -12941 -12942 -10 - - -15383 -15384 -10 - - -28391 -28392 -10 - - -34167 -34168 -10 - - -160563 -160564 -10 - - -240969 -240970 -10 - - -271992 -271993 -10 - - -305333 -305334 -10 - - - - - - - - -varspecifiers -1110252 - - -var_id -923337 - - -spec_id -64 - - - - -var_id -spec_id - - -12 - - -1 -2 -784946 - - -2 -3 -91515 - - -3 -5 -46874 - - - - - - -spec_id -var_id - - -12 - - -17 -18 -6 - - -160 -161 -6 - - -446 -447 -6 - - -5881 -5882 -6 - - -8410 -8411 -6 - - -8752 -8753 -6 - - -11326 -11327 -6 - - -13439 -13440 -6 - - -42420 -42421 -6 - - -80063 -80064 -6 - - - - - - - - -attributes -414234 - - -id -414234 - - -kind -1 - - -name -55 - - -name_space -1 - - -location -90620 - - - - -id -kind - - -12 - - -1 -2 -414234 - - - - - - -id -name - - -12 - - -1 -2 -414234 - - - - - - -id -name_space - - -12 - - -1 -2 -414234 - - - - - - -id -location - - -12 - - -1 -2 -414234 - - - - - - -kind -id - - -12 - - -254158 -254159 -1 - - - - - - -kind -name - - -12 - - -34 -35 -1 - - - - - - -kind -name_space - - -12 - - -1 -2 -1 - - - - - - -kind -location - - -12 - - -55601 -55602 -1 - - - - - - -name -id - - -12 - - -1 -2 -3 - - -4 -5 -3 - - -6 -10 -4 - - -25 -42 -4 - - -46 -61 -4 - - -75 -164 -4 - - -225 -444 -4 - - -648 -780 -4 - - -807 -1148 -4 - - -3562 -12538 -4 - - -26224 -35247 -4 - - -41457 -49796 -4 - - - - - - -name -kind - - -12 - - -1 -2 -55 - - - - - - -name -name_space - - -12 - - -1 -2 -55 - - - - - - -name -location - - -12 - - -1 -3 -4 - - -4 -7 -4 - - -9 -26 -4 - - -32 -50 -4 - - -58 -75 -4 - - -151 -235 -4 - - -440 -628 -4 - - -645 -776 -4 - - -818 -3958 -4 - - -11143 -16981 -4 - - -19805 -21504 -4 - - -22415 -22416 -1 - - - - - - -name_space -id - - -12 - - -254158 -254159 -1 - - - - - - -name_space -kind - - -12 - - -1 -2 -1 - - - - - - -name_space -name - - -12 - - -34 -35 -1 - - - - - - -name_space -location - - -12 - - -55601 -55602 -1 - - - - - - -location -id - - -12 - - -1 -2 -26763 - - -2 -3 -5319 - - -3 -4 -30032 - - -4 -8 -7396 - - -8 -9 -17719 - - -9 -73 -3388 - - - - - - -location -kind - - -12 - - -1 -2 -90620 - - - - - - -location -name - - -12 - - -1 -2 -28450 - - -2 -3 -4685 - - -3 -4 -49730 - - -4 -9 -7373 - - -9 -10 -379 - - - - - - -location -name_space - - -12 - - -1 -2 -90620 - - - - - - - - -attribute_args -152801 - - -id -152801 - - -kind -3 - - -attribute -151500 - - -index -6 - - -location -57431 - - - - -id -kind - - -12 - - -1 -2 -152801 - - - - - - -id -attribute - - -12 - - -1 -2 -152801 - - - - - - -id -index - - -12 - - -1 -2 -152801 - - - - - - -id -location - - -12 - - -1 -2 -152801 - - - - - - -kind -id - - -12 - - -3879 -3880 -1 - - -89859 -89860 -1 - - - - - - -kind -attribute - - -12 - - -3879 -3880 -1 - - -89377 -89378 -1 - - - - - - -kind -index - - -12 - - -1 -2 -1 - - -4 -5 -1 - - - - - - -kind -location - - -12 - - -3807 -3808 -1 - - -34991 -34992 -1 - - - - - - -attribute -id - - -12 - - -1 -2 -150721 - - -2 -5 -779 - - - - - - -attribute -kind - - -12 - - -1 -2 -151010 - - -2 -3 -490 - - - - - - -attribute -index - - -12 - - -1 -2 -150721 - - -2 -5 -779 - - - - - - -attribute -location - - -12 - - -1 -2 -150726 - - -2 -5 -774 - - - - - - -index -id - - -12 - - -1 -2 -1 - - -319 -320 -1 - - -478 -479 -1 - - -92940 -92941 -1 - - - - - - -index -kind - - -12 - - -1 -2 -4 - - -2 -3 -1 - - - - - - -index -attribute - - -12 - - -1 -2 -1 - - -319 -320 -1 - - -478 -479 -1 - - -92955 -92956 -1 - - - - - - -index -location - - -12 - - -1 -2 -1 - - -252 -253 -1 - - -410 -411 -1 - - -34581 -34582 -1 - - - - - - -location -id - - -12 - - -1 -2 -27328 - - -2 -3 -8439 - - -3 -5 -2889 - - -5 -6 -17621 - - -6 -37 -1152 - - - - - - -location -kind - - -12 - - -1 -2 -51629 - - -2 -3 -5802 - - - - - - -location -attribute - - -12 - - -1 -2 -27314 - - -2 -3 -8455 - - -3 -5 -2888 - - -5 -6 -17621 - - -6 -37 -1152 - - - - - - -location -index - - -12 - - -1 -2 -57427 - - -3 -4 -4 - - - - - - - - -attribute_arg_value -152776 - - -arg -152776 - - -value -2190 - - - - -arg -value - - -12 - - -1 -2 -152776 - - - - - - -value -arg - - -12 - - -1 -2 -1732 - - -2 -3 -156 - - -3 -10 -167 - - -10 -23976 -133 - - - - - - - - -attribute_arg_type -54 - - -arg -54 - - -type_id -32 - - - - -arg -type_id - - -12 - - -1 -2 -54 - - - - - - -type_id -arg - - -12 - - -1 -2 -10 - - -2 -3 -21 - - - - - - - - -attribute_arg_name -6 - - -arg -6 - - -name -5 - - - - -arg -name - - -12 - - -1 -2 -6 - - - - - - -name -arg - - -12 - - -1 -2 -4 - - -2 -3 -1 - - - - - - - - -typeattributes -19097 - - -type_id -17732 - - -spec_id -19097 - - - - -type_id -spec_id - - -12 - - -1 -2 -17038 - - -2 -34 -693 - - - - - - -spec_id -type_id - - -12 - - -1 -2 -19097 - - - - - - - - -funcattributes -300785 - - -func_id -162277 - - -spec_id -300785 - - - - -func_id -spec_id - - -12 - - -1 -2 -88595 - - -2 -3 -12432 - - -3 -4 -59266 - - -4 -14 -1983 - - - - - - -spec_id -func_id - - -12 - - -1 -2 -300785 - - - - - - - - -varattributes -371223 - - -var_id -322421 - - -spec_id -371223 - - - - -var_id -spec_id - - -12 - - -1 -2 -273655 - - -2 -3 -48763 - - -14 -15 -3 - - - - - - -spec_id -var_id - - -12 - - -1 -2 -371223 - - - - - - - - -stmtattributes -986 - - -stmt_id -986 - - -spec_id -986 - - - - -stmt_id -spec_id - - -12 - - -1 -2 -986 - - - - - - -spec_id -stmt_id - - -12 - - -1 -2 -986 - - - - - - - - -unspecifiedtype -9002061 - - -type_id -9002061 - - -unspecified_type_id -4949385 - - - - -type_id -unspecified_type_id - - -12 - - -1 -2 -9002061 - - - - - - -unspecified_type_id -type_id - - -12 - - -1 -2 -2701086 - - -2 -3 -1937281 - - -3 -7950 -311017 - - - - - - - - -member -5094949 - - -parent -804764 - - -index -2644 - - -child -5079548 - - - - -parent -index - - -12 - - -1 -3 -70343 - - -3 -4 -381479 - - -4 -5 -94416 - - -5 -7 -68793 - - -7 -9 -59396 - - -9 -15 -63850 - - -15 -47 -60469 - - -47 -245 -6015 - - - - - - -parent -child - - -12 - - -1 -3 -69812 - - -3 -4 -375930 - - -4 -5 -97841 - - -5 -7 -68685 - - -7 -9 -59461 - - -9 -15 -64772 - - -15 -42 -60555 - - -42 -281 -7706 - - - - - - -index -parent - - -12 - - -1 -2 -487 - - -2 -5 -238 - - -5 -10 -227 - - -10 -64 -205 - - -65 -137 -205 - - -144 -213 -205 - - -219 -295 -205 - - -299 -393 -216 - - -393 -649 -205 - - -649 -3628 -205 - - -3644 -31598 -205 - - -65753 -73573 -32 - - - - - - -index -child - - -12 - - -1 -2 -476 - - -2 -5 -195 - - -5 -9 -205 - - -9 -22 -205 - - -25 -132 -205 - - -132 -199 -205 - - -199 -279 -205 - - -279 -366 -205 - - -382 -480 -205 - - -489 -1630 -205 - - -1771 -8155 -205 - - -8939 -74519 -119 - - - - - - -child -parent - - -12 - - -1 -2 -5079548 - - - - - - -child -index - - -12 - - -1 -2 -5064362 - - -2 -7 -15185 - - - - - - - - -enclosingfunction -123615 - - -child -123615 - - -parent -70570 - - - - -child -parent - - -12 - - -1 -2 -123615 - - - - - - -parent -child - - -12 - - -1 -2 -37892 - - -2 -3 -20832 - - -3 -4 -6459 - - -4 -7 -5310 - - -7 -45 -75 - - - - - - - - -derivations -385706 - - -derivation -385706 - - -sub -360192 - - -index -65 - - -super -232945 - - -location -85961 - - - - -derivation -sub - - -12 - - -1 -2 -385706 - - - - - - -derivation -index - - -12 - - -1 -2 -385706 - - - - - - -derivation -super - - -12 - - -1 -2 -385706 - - - - - - -derivation -location - - -12 - - -1 -2 -385706 - - - - - - -sub -derivation - - -12 - - -1 -2 -337886 - - -2 -7 -22306 - - - - - - -sub -index - - -12 - - -1 -2 -347392 - - -2 -7 -12800 - - - - - - -sub -super - - -12 - - -1 -2 -337897 - - -2 -7 -22295 - - - - - - -sub -location - - -12 - - -1 -2 -347381 - - -2 -7 -12811 - - - - - - -index -derivation - - -12 - - -1 -2 -10 - - -4 -5 -10 - - -44 -45 -10 - - -234 -235 -10 - - -1182 -1183 -10 - - -34121 -34122 -10 - - - - - - -index -sub - - -12 - - -1 -2 -10 - - -4 -5 -10 - - -44 -45 -10 - - -234 -235 -10 - - -1181 -1182 -10 - - -33232 -33233 -10 - - - - - - -index -super - - -12 - - -1 -2 -10 - - -3 -4 -10 - - -29 -30 -10 - - -84 -85 -10 - - -652 -653 -10 - - -20767 -20768 -10 - - - - - - -index -location - - -12 - - -1 -2 -10 - - -4 -5 -10 - - -17 -18 -10 - - -51 -52 -10 - - -255 -256 -10 - - -7606 -7607 -10 - - - - - - -super -derivation - - -12 - - -1 -2 -218324 - - -2 -1142 -14621 - - - - - - -super -sub - - -12 - - -1 -2 -218335 - - -2 -1142 -14610 - - - - - - -super -index - - -12 - - -1 -2 -232501 - - -2 -4 -444 - - - - - - -super -location - - -12 - - -1 -2 -225673 - - -2 -439 -7272 - - - - - - -location -derivation - - -12 - - -1 -2 -65574 - - -2 -3 -8291 - - -3 -7 -6535 - - -7 -795 -5560 - - - - - - -location -sub - - -12 - - -1 -2 -67785 - - -2 -3 -6297 - - -3 -8 -6958 - - -8 -795 -4920 - - - - - - -location -index - - -12 - - -1 -2 -85940 - - -2 -4 -21 - - - - - - -location -super - - -12 - - -1 -2 -68479 - - -2 -3 -8107 - - -3 -9 -6449 - - -9 -795 -2926 - - - - - - - - -derspecifiers -388058 - - -der_id -385674 - - -spec_id -43 - - - - -der_id -spec_id - - -12 - - -1 -2 -383289 - - -2 -3 -2384 - - - - - - -spec_id -der_id - - -12 - - -220 -221 -10 - - -263 -264 -10 - - -987 -988 -10 - - -34333 -34334 -10 - - - - - - - - -direct_base_offsets -306931 - - -der_id -306931 - - -offset -195 - - - - -der_id -offset - - -12 - - -1 -2 -306931 - - - - - - -offset -der_id - - -12 - - -1 -2 -32 - - -2 -3 -21 - - -4 -5 -21 - - -5 -6 -10 - - -6 -7 -10 - - -7 -8 -21 - - -8 -9 -10 - - -10 -11 -10 - - -11 -12 -10 - - -21 -22 -10 - - -86 -87 -10 - - -214 -215 -10 - - -27928 -27929 -10 - - - - - - - - -virtual_base_offsets -6264 - - -sub -3468 - - -super -476 - - -offset -238 - - - - -sub -super - - -12 - - -1 -2 -2731 - - -2 -4 -303 - - -4 -7 -249 - - -7 -11 -184 - - - - - - -sub -offset - - -12 - - -1 -2 -2926 - - -2 -4 -292 - - -4 -8 -249 - - - - - - -super -sub - - -12 - - -1 -2 -75 - - -2 -3 -43 - - -3 -4 -54 - - -4 -5 -86 - - -5 -7 -32 - - -8 -13 -43 - - -13 -15 -43 - - -15 -23 -43 - - -24 -60 -43 - - -196 -197 -10 - - - - - - -super -offset - - -12 - - -1 -2 -270 - - -2 -3 -75 - - -4 -6 -32 - - -6 -8 -43 - - -8 -10 -43 - - -14 -15 -10 - - - - - - -offset -sub - - -12 - - -2 -3 -32 - - -4 -5 -10 - - -5 -6 -21 - - -6 -8 -21 - - -8 -9 -32 - - -10 -12 -21 - - -14 -19 -21 - - -20 -27 -21 - - -28 -31 -21 - - -36 -97 -21 - - -97 -98 -10 - - - - - - -offset -super - - -12 - - -1 -2 -75 - - -2 -3 -32 - - -3 -4 -43 - - -5 -7 -21 - - -7 -10 -21 - - -12 -14 -21 - - -21 -29 -21 - - - - - - - - -frienddecls -237444 - - -id -237444 - - -type_id -26966 - - -decl_id -48405 - - -location -7218 - - - - -id -type_id - - -12 - - -1 -2 -237444 - - - - - - -id -decl_id - - -12 - - -1 -2 -237444 - - - - - - -id -location - - -12 - - -1 -2 -237444 - - - - - - -type_id -id - - -12 - - -1 -2 -6145 - - -2 -3 -10112 - - -3 -5 -1961 - - -5 -6 -899 - - -6 -8 -2286 - - -8 -19 -2091 - - -21 -43 -2081 - - -43 -162 -1387 - - - - - - -type_id -decl_id - - -12 - - -1 -2 -6145 - - -2 -3 -10112 - - -3 -5 -1961 - - -5 -6 -899 - - -6 -8 -2286 - - -8 -19 -2091 - - -21 -43 -2081 - - -43 -162 -1387 - - - - - - -type_id -location - - -12 - - -1 -2 -25405 - - -2 -31 -1560 - - - - - - -decl_id -id - - -12 - - -1 -2 -33242 - - -2 -3 -4931 - - -3 -7 -3966 - - -7 -23 -3761 - - -23 -394 -2503 - - - - - - -decl_id -type_id - - -12 - - -1 -2 -33242 - - -2 -3 -4931 - - -3 -7 -3966 - - -7 -23 -3761 - - -23 -394 -2503 - - - - - - -decl_id -location - - -12 - - -1 -2 -47874 - - -2 -46 -531 - - - - - - -location -id - - -12 - - -1 -2 -6167 - - -2 -3 -932 - - -3 -21129 -119 - - - - - - -location -type_id - - -12 - - -1 -2 -6785 - - -2 -2097 -433 - - - - - - -location -decl_id - - -12 - - -1 -2 -6178 - - -2 -3 -921 - - -3 -3830 -119 - - - - - - - - -comments -1561817 - - -id -1561817 - - -contents -774990 - - -location -1561817 - - - - -id -contents - - -12 - - -1 -2 -1561817 - - - - - - -id -location - - -12 - - -1 -2 -1561817 - - - - - - -contents -id - - -12 - - -1 -2 -656176 - - -2 -3 -74223 - - -3 -10738 -44590 - - - - - - -contents -location - - -12 - - -1 -2 -656176 - - -2 -3 -74223 - - -3 -10738 -44590 - - - - - - -location -id - - -12 - - -1 -2 -1561817 - - - - - - -location -contents - - -12 - - -1 -2 -1561817 - - - - - - - - -commentbinding -704994 - - -id -611185 - - -element -676553 - - - - -id -element - - -12 - - -1 -2 -550520 - - -2 -3 -48514 - - -3 -97 -12150 - - - - - - -element -id - - -12 - - -1 -2 -648112 - - -2 -3 -28440 - - - - - - - - -exprconv -6470964 - - -converted -6470955 - - -conversion -6470964 - - - - -converted -conversion - - -12 - - -1 -2 -6470947 - - -2 -4 -8 - - - - - - -conversion -converted - - -12 - - -1 -2 -6470964 - - - - - - - - -compgenerated -6859342 - - -id -6859342 - - - - - -synthetic_destructor_call -58919 - - -element -45858 - - -i -303 - - -destructor_call -48893 - - - - -element -i - - -12 - - -1 -2 -36526 - - -2 -3 -6687 - - -3 -29 -2644 - - - - - - -element -destructor_call - - -12 - - -1 -2 -36526 - - -2 -3 -6687 - - -3 -29 -2644 - - - - - - -i -element - - -12 - - -1 -2 -227 - - -2 -8 -21 - - -23 -48 -21 - - -244 -862 -21 - - -4231 -4232 -10 - - - - - - -i -destructor_call - - -12 - - -1 -2 -227 - - -2 -8 -21 - - -22 -42 -21 - - -187 -667 -21 - - -3565 -3566 -10 - - - - - - -destructor_call -element - - -12 - - -1 -2 -43116 - - -2 -3 -3576 - - -3 -26 -2200 - - - - - - -destructor_call -i - - -12 - - -1 -2 -48893 - - - - - - - - -namespaces -7597 - - -id -7597 - - -name -4086 - - - - -id -name - - -12 - - -1 -2 -7597 - - - - - - -name -id - - -12 - - -1 -2 -3435 - - -2 -3 -411 - - -3 -139 -238 - - - - - - - - -namespace_inline -151 - - -id -151 - - - - - -namespacembrs -1584090 - - -parentid -7077 - - -memberid -1584090 - - - - -parentid -memberid - - -12 - - -1 -2 -726 - - -2 -3 -791 - - -3 -4 -346 - - -4 -5 -520 - - -5 -7 -552 - - -7 -12 -574 - - -12 -19 -531 - - -19 -34 -541 - - -36 -52 -574 - - -52 -105 -531 - - -105 -230 -541 - - -231 -744 -531 - - -778 -39452 -314 - - - - - - -memberid -parentid - - -12 - - -1 -2 -1584090 - - - - - - - - -exprparents -13432189 - - -expr_id -13432000 - - -child_index -3118 - - -parent_id -9515340 - - - - -expr_id -child_index - - -12 - - -1 -2 -13431994 - - -2 -3 -6 - - - - - - -expr_id -parent_id - - -12 - - -1 -2 -13431818 - - -2 -4 -181 - - - - - - -child_index -expr_id - - -12 - - -1 -2 -71 - - -2 -3 -643 - - -3 -4 -1649 - - -4 -46 -240 - - -46 -56 -233 - - -56 -3654 -233 - - -6420 -1188854 -45 - - - - - - -child_index -parent_id - - -12 - - -1 -2 -71 - - -2 -3 -643 - - -3 -4 -1649 - - -4 -31 -240 - - -31 -41 -233 - - -41 -3639 -233 - - -6405 -1188867 -45 - - - - - - -parent_id -expr_id - - -12 - - -1 -2 -6748421 - - -2 -3 -2184263 - - -3 -1681 -582655 - - - - - - -parent_id -child_index - - -12 - - -1 -2 -6748441 - - -2 -3 -2184243 - - -3 -480 -582655 - - - - - - - - -expr_isload -5009424 - - -expr_id -5009424 - - - - - -conversionkinds -4246766 - - -expr_id -4246766 - - -kind -6 - - - - -expr_id -kind - - -12 - - -1 -2 -4246766 - - - - - - -kind -expr_id - - -12 - - -2189 -2190 -1 - - -3368 -3369 -1 - - -13714 -13715 -1 - - -26502 -26503 -1 - - -45529 -45530 -1 - - -4155464 -4155465 -1 - - - - - - - - -iscall -2293539 - - -caller -2293539 - - -kind -32 - - - - -caller -kind - - -12 - - -1 -2 -2293539 - - - - - - -kind -caller - - -12 - - -1386 -1387 -10 - - -6427 -6428 -10 - - -203793 -203794 -10 - - - - - - - - -numtemplatearguments -162776 - - -expr_id -162776 - - -num -43 - - - - -expr_id -num - - -12 - - -1 -2 -162776 - - - - - - -num -expr_id - - -12 - - -3 -4 -10 - - -41 -42 -10 - - -669 -670 -10 - - -14305 -14306 -10 - - - - - - - - -specialnamequalifyingelements -10 - - -id -10 - - -name -10 - - - - -id -name - - -12 - - -1 -2 -10 - - - - - - -name -id - - -12 - - -1 -2 -10 - - - - - - - - -namequalifiers -1119060 - - -id -1119060 - - -qualifiableelement -1119060 - - -qualifyingelement -38800 - - -location -504119 - - - - -id -qualifiableelement - - -12 - - -1 -2 -1119060 - - - - - - -id -qualifyingelement - - -12 - - -1 -2 -1119060 - - - - - - -id -location - - -12 - - -1 -2 -1119060 - - - - - - -qualifiableelement -id - - -12 - - -1 -2 -1119060 - - - - - - -qualifiableelement -qualifyingelement - - -12 - - -1 -2 -1119060 - - - - - - -qualifiableelement -location - - -12 - - -1 -2 -1119060 - - - - - - -qualifyingelement -id - - -12 - - -1 -2 -18890 - - -2 -3 -8035 - - -3 -4 -4975 - - -4 -11 -3079 - - -11 -121 -2910 - - -124 -24963 -909 - - - - - - -qualifyingelement -qualifiableelement - - -12 - - -1 -2 -18890 - - -2 -3 -8035 - - -3 -4 -4975 - - -4 -11 -3079 - - -11 -121 -2910 - - -124 -24963 -909 - - - - - - -qualifyingelement -location - - -12 - - -1 -2 -24749 - - -2 -3 -4670 - - -3 -4 -3709 - - -4 -11 -3027 - - -11 -16750 -2643 - - - - - - -location -id - - -12 - - -1 -2 -380150 - - -2 -3 -56638 - - -3 -7 -41762 - - -7 -381 -25568 - - - - - - -location -qualifiableelement - - -12 - - -1 -2 -380150 - - -2 -3 -56638 - - -3 -7 -41762 - - -7 -381 -25568 - - - - - - -location -qualifyingelement - - -12 - - -1 -2 -444298 - - -2 -3 -44477 - - -3 -190 -15343 - - - - - - - - -varbind -5425985 - - -expr -5425862 - - -var -1530372 - - - - -expr -var - - -12 - - -1 -2 -5425738 - - -2 -3 -123 - - - - - - -var -expr - - -12 - - -1 -2 -678893 - - -2 -3 -308409 - - -3 -4 -232367 - - -4 -5 -92671 - - -5 -9 -132849 - - -9 -6150 -85181 - - - - - - - - -funbind -2412732 - - -expr -2116341 - - -fun -433346 - - - - -expr -fun - - -12 - - -1 -2 -1820189 - - -2 -3 -295975 - - -3 -5 -175 - - - - - - -fun -expr - - -12 - - -1 -2 -251653 - - -2 -3 -75463 - - -3 -4 -31180 - - -4 -7 -33850 - - -7 -37 -33376 - - -37 -6664 -7821 - - - - - - - - -expr_allocator -29979 - - -expr -29979 - - -func -119 - - -form -10 - - - - -expr -func - - -12 - - -1 -2 -29979 - - - - - - -expr -form - - -12 - - -1 -2 -29979 - - - - - - -func -expr - - -12 - - -1 -2 -32 - - -3 -4 -10 - - -5 -6 -10 - - -6 -7 -10 - - -7 -8 -21 - - -42 -43 -10 - - -1327 -1328 -10 - - -1366 -1367 -10 - - - - - - -func -form - - -12 - - -1 -2 -119 - - - - - - -form -expr - - -12 - - -2766 -2767 -10 - - - - - - -form -func - - -12 - - -11 -12 -10 - - - - - - - - -expr_deallocator -32917 - - -expr -32917 - - -func -130 - - -form -21 - - - - -expr -func - - -12 - - -1 -2 -32917 - - - - - - -expr -form - - -12 - - -1 -2 -32917 - - - - - - -func -expr - - -12 - - -1 -2 -32 - - -2 -3 -21 - - -3 -4 -10 - - -6 -7 -10 - - -7 -8 -21 - - -118 -119 -10 - - -1274 -1275 -10 - - -1615 -1616 -10 - - - - - - -func -form - - -12 - - -1 -2 -130 - - - - - - -form -expr - - -12 - - -1284 -1285 -10 - - -1753 -1754 -10 - - - - - - -form -func - - -12 - - -4 -5 -10 - - -8 -9 -10 - - - - - - - - -expr_cond_two_operand -612 - - -cond -612 - - - - - -expr_cond_guard -154485 - - -cond -154485 - - -guard -154485 - - - - -cond -guard - - -12 - - -1 -2 -154485 - - - - - - -guard -cond - - -12 - - -1 -2 -154485 - - - - - - - - -expr_cond_true -154485 - - -cond -154485 - - -true -154485 - - - - -cond -true - - -12 - - -1 -2 -154485 - - - - - - -true -cond - - -12 - - -1 -2 -154485 - - - - - - - - -expr_cond_false -154485 - - -cond -154485 - - -false -154485 - - - - -cond -false - - -12 - - -1 -2 -154485 - - - - - - -false -cond - - -12 - - -1 -2 -154485 - - - - - - - - -values -8774622 - - -id -8774622 - - -str -651637 - - - - -id -str - - -12 - - -1 -2 -8774622 - - - - - - -str -id - - -12 - - -1 -2 -540186 - - -2 -3 -65496 - - -3 -4040441 -45955 - - - - - - - - -valuetext -4778502 - - -id -4778502 - - -text -706785 - - - - -id -text - - -12 - - -1 -2 -4778502 - - - - - - -text -id - - -12 - - -1 -2 -529394 - - -2 -3 -102965 - - -3 -7 -57061 - - -7 -427516 -17365 - - - - - - - - -valuebind -9496119 - - -val -8768412 - - -expr -9496119 - - - - -val -expr - - -12 - - -1 -2 -8041464 - - -2 -3 -726192 - - -3 -6 -756 - - - - - - -expr -val - - -12 - - -1 -2 -9496119 - - - - - - - - -fieldoffsets -250750 - - -id -250750 - - -byteoffset -8983 - - -bitoffset -51 - - - - -id -byteoffset - - -12 - - -1 -2 -250750 - - - - - - -id -bitoffset - - -12 - - -1 -2 -250750 - - - - - - -byteoffset -id - - -12 - - -1 -2 -6106 - - -2 -3 -779 - - -3 -6 -747 - - -6 -17 -675 - - -17 -11719 -675 - - - - - - -byteoffset -bitoffset - - -12 - - -1 -2 -8542 - - -2 -9 -441 - - - - - - -bitoffset -id - - -12 - - -83 -84 -6 - - -87 -88 -6 - - -102 -103 -6 - - -122 -123 -6 - - -127 -128 -6 - - -153 -154 -6 - - -195 -196 -6 - - -37732 -37733 -6 - - - - - - -bitoffset -byteoffset - - -12 - - -40 -41 -6 - - -44 -45 -6 - - -45 -46 -6 - - -52 -53 -6 - - -54 -55 -6 - - -58 -59 -6 - - -66 -67 -6 - - -1383 -1384 -6 - - - - - - - - -bitfield -13845 - - -id -13845 - - -bits -68 - - -declared_bits -68 - - - - -id -bits - - -12 - - -1 -2 -13845 - - - - - - -id -declared_bits - - -12 - - -1 -2 -13845 - - - - - - -bits -id - - -12 - - -1 -2 -14 - - -2 -3 -8 - - -3 -4 -8 - - -4 -5 -6 - - -5 -6 -3 - - -6 -7 -4 - - -8 -14 -4 - - -17 -36 -4 - - -37 -94 -4 - - -97 -152 -4 - - -2106 -5611 -3 - - - - - - -bits -declared_bits - - -12 - - -1 -2 -68 - - - - - - -declared_bits -id - - -12 - - -1 -2 -14 - - -2 -3 -8 - - -3 -4 -8 - - -4 -5 -6 - - -5 -6 -3 - - -6 -7 -4 - - -8 -14 -4 - - -17 -36 -4 - - -37 -94 -4 - - -97 -152 -4 - - -2106 -5611 -3 - - - - - - -declared_bits -bits - - -12 - - -1 -2 -68 - - - - - - - - -initialisers -1662175 - - -init -1662175 - - -var -641756 - - -expr -1662175 - - -location -318179 - - - - -init -var - - -12 - - -1 -2 -1662175 - - - - - - -init -expr - - -12 - - -1 -2 -1662175 - - - - - - -init -location - - -12 - - -1 -2 -1662175 - - - - - - -var -init - - -12 - - -1 -2 -555333 - - -2 -16 -28660 - - -16 -17 -48973 - - -17 -53 -8789 - - - - - - -var -expr - - -12 - - -1 -2 -555333 - - -2 -16 -28660 - - -16 -17 -48973 - - -17 -53 -8789 - - - - - - -var -location - - -12 - - -1 -2 -641743 - - -2 -3 -12 - - - - - - -expr -init - - -12 - - -1 -2 -1662175 - - - - - - -expr -var - - -12 - - -1 -2 -1662175 - - - - - - -expr -location - - -12 - - -1 -2 -1662175 - - - - - - -location -init - - -12 - - -1 -2 -245703 - - -2 -3 -23690 - - -3 -7 -24210 - - -7 -65 -24048 - - -67 -109109 -526 - - - - - - -location -var - - -12 - - -1 -2 -268251 - - -2 -3 -24931 - - -3 -22 -23885 - - -22 -12503 -1110 - - - - - - -location -expr - - -12 - - -1 -2 -245703 - - -2 -3 -23690 - - -3 -7 -24210 - - -7 -65 -24048 - - -67 -109109 -526 - - - - - - - - -expr_ancestor -65325 - - -exp -64631 - - -ancestor -46563 - - - - -exp -ancestor - - -12 - - -1 -2 -64002 - - -2 -4 -628 - - - - - - -ancestor -exp - - -12 - - -1 -2 -34543 - - -2 -3 -9592 - - -3 -29 -2427 - - - - - - - - -exprs -18461258 - - -id -18461258 - - -kind -1094 - - -location -3585917 - - - - -id -kind - - -12 - - -1 -2 -18461258 - - - - - - -id -location - - -12 - - -1 -2 -18461258 - - - - - - -kind -id - - -12 - - -2 -14 -86 - - -15 -50 -86 - - -50 -90 -86 - - -90 -223 -86 - - -306 -472 -86 - - -484 -715 -86 - - -866 -2036 -86 - - -2167 -2960 -86 - - -3202 -4443 -86 - - -4720 -6423 -86 - - -6723 -13439 -86 - - -17876 -100489 -86 - - -114342 -428357 -54 - - - - - - -kind -location - - -12 - - -1 -4 -97 - - -4 -14 -97 - - -14 -24 -86 - - -24 -38 -86 - - -38 -134 -86 - - -144 -259 -86 - - -270 -481 -86 - - -481 -1076 -86 - - -1099 -1408 -86 - - -1427 -2051 -86 - - -2060 -4561 -86 - - -5889 -59193 -86 - - -60309 -118611 -32 - - - - - - -location -id - - -12 - - -1 -2 -1649719 - - -2 -3 -725837 - - -3 -4 -318788 - - -4 -5 -272431 - - -5 -9 -311028 - - -9 -45 -269006 - - -45 -143462 -39106 - - - - - - -location -kind - - -12 - - -1 -2 -2542158 - - -2 -3 -786154 - - -3 -30 -257604 - - - - - - - - -expr_types -18609954 - - -id -18457486 - - -typeid -1280368 - - -value_category -32 - - - - -id -typeid - - -12 - - -1 -2 -18306730 - - -2 -4 -150755 - - - - - - -id -value_category - - -12 - - -1 -2 -18457486 - - - - - - -typeid -id - - -12 - - -1 -2 -468861 - - -2 -3 -252672 - - -3 -4 -107476 - - -4 -5 -88617 - - -5 -8 -114110 - - -8 -13 -96724 - - -13 -36 -97331 - - -36 -126306 -54572 - - - - - - -typeid -value_category - - -12 - - -1 -2 -1115749 - - -2 -3 -155026 - - -3 -4 -9592 - - - - - - -value_category -id - - -12 - - -7302 -7303 -10 - - -383285 -383286 -10 - - -1312333 -1312334 -10 - - - - - - -value_category -typeid - - -12 - - -1649 -1650 -10 - - -32129 -32130 -10 - - -100424 -100425 -10 - - - - - - - - -new_allocated_type -31757 - - -expr -31757 - - -type_id -16323 - - - - -expr -type_id - - -12 - - -1 -2 -31757 - - - - - - -type_id -expr - - -12 - - -1 -2 -10220 - - -2 -3 -3674 - - -3 -5 -1387 - - -5 -107 -1040 - - - - - - - - -new_array_allocated_type -5287 - - -expr -5287 - - -type_id -2273 - - - - -expr -type_id - - -12 - - -1 -2 -5287 - - - - - - -type_id -expr - - -12 - - -1 -2 -32 - - -2 -3 -2013 - - -3 -7 -175 - - -8 -15 -51 - - - - - - - - -aggregate_field_init -4011083 - - -aggregate -849492 - - -initializer -4010900 - - -field -2207 - - - - -aggregate -initializer - - -12 - - -1 -2 -6536 - - -2 -3 -501609 - - -3 -4 -11344 - - -4 -5 -88845 - - -5 -12 -49882 - - -12 -13 -191083 - - -13 -42 -193 - - - - - - -aggregate -field - - -12 - - -1 -2 -6535 - - -2 -3 -501577 - - -3 -4 -11344 - - -4 -5 -88851 - - -5 -12 -49908 - - -12 -13 -191083 - - -13 -42 -194 - - - - - - -initializer -aggregate - - -12 - - -1 -2 -4010900 - - - - - - -initializer -field - - -12 - - -1 -2 -4010717 - - -2 -3 -183 - - - - - - -field -aggregate - - -12 - - -1 -2 -814 - - -2 -3 -194 - - -3 -7 -194 - - -7 -13 -174 - - -13 -22 -176 - - -22 -47 -168 - - -49 -113 -166 - - -115 -410 -168 - - -417 -288626 -153 - - - - - - -field -initializer - - -12 - - -1 -2 -814 - - -2 -3 -194 - - -3 -7 -194 - - -7 -13 -174 - - -13 -22 -176 - - -22 -47 -168 - - -49 -113 -166 - - -115 -410 -168 - - -417 -288626 -153 - - - - - - - - -aggregate_array_init -731690 - - -aggregate -65759 - - -initializer -731690 - - -element_index -17485 - - - - -aggregate -initializer - - -12 - - -1 -2 -7541 - - -2 -3 -7819 - - -3 -4 -17355 - - -4 -5 -8024 - - -5 -6 -5817 - - -6 -8 -5016 - - -8 -11 -5394 - - -11 -22 -5004 - - -22 -17486 -3789 - - - - - - -aggregate -element_index - - -12 - - -1 -2 -7541 - - -2 -3 -7819 - - -3 -4 -17355 - - -4 -5 -8024 - - -5 -6 -5817 - - -6 -8 -5016 - - -8 -11 -5394 - - -11 -22 -5004 - - -22 -17486 -3789 - - - - - - -initializer -aggregate - - -12 - - -1 -2 -731690 - - - - - - -initializer -element_index - - -12 - - -1 -2 -731690 - - - - - - -element_index -aggregate - - -12 - - -1 -2 -6580 - - -2 -3 -2653 - - -3 -5 -1308 - - -5 -6 -1488 - - -7 -9 -1059 - - -9 -15 -1388 - - -15 -27 -1379 - - -27 -198 -1316 - - -202 -65759 -314 - - - - - - -element_index -initializer - - -12 - - -1 -2 -6580 - - -2 -3 -2653 - - -3 -5 -1308 - - -5 -6 -1488 - - -7 -9 -1059 - - -9 -15 -1388 - - -15 -27 -1379 - - -27 -198 -1316 - - -202 -65759 -314 - - - - - - - - -condition_decl_bind -6947 - - -expr -6947 - - -decl -6947 - - - - -expr -decl - - -12 - - -1 -2 -6947 - - - - - - -decl -expr - - -12 - - -1 -2 -6947 - - - - - - - - -typeid_bind -4368 - - -expr -4368 - - -type_id -2319 - - - - -expr -type_id - - -12 - - -1 -2 -4368 - - - - - - -type_id -expr - - -12 - - -1 -2 -1159 - - -2 -3 -888 - - -3 -6 -205 - - -6 -17 -65 - - - - - - - - -uuidof_bind -844 - - -expr -844 - - -type_id -643 - - - - -expr -type_id - - -12 - - -1 -2 -844 - - - - - - -type_id -expr - - -12 - - -1 -2 -474 - - -2 -3 -136 - - -3 -4 -32 - - - - - - - - -sizeof_bind -157116 - - -expr -157116 - - -type_id -2704 - - - - -expr -type_id - - -12 - - -1 -2 -157116 - - - - - - -type_id -expr - - -12 - - -1 -2 -1063 - - -2 -3 -356 - - -3 -4 -202 - - -4 -9 -202 - - -9 -32 -129 - - -34 -36 -233 - - -36 -68 -202 - - -68 -114 -202 - - -119 -6844 -110 - - - - - - - - -code_block -15 - - -block -15 - - -routine -15 - - - - -block -routine - - -12 - - -1 -2 -15 - - - - - - -routine -block - - -12 - - -1 -2 -15 - - - - - - - - -lambdas -12660 - - -expr -12660 - - -default_capture -19 - - -has_explicit_return_type -12 - - - - -expr -default_capture - - -12 - - -1 -2 -12660 - - - - - - -expr -has_explicit_return_type - - -12 - - -1 -2 -12660 - - - - - - -default_capture -expr - - -12 - - -278 -279 -6 - - -700 -701 -6 - - -971 -972 -6 - - - - - - -default_capture -has_explicit_return_type - - -12 - - -2 -3 -19 - - - - - - -has_explicit_return_type -expr - - -12 - - -832 -833 -6 - - -1117 -1118 -6 - - - - - - -has_explicit_return_type -default_capture - - -12 - - -3 -4 -12 - - - - - - - - -lambda_capture -21618 - - -id -21618 - - -lambda -10153 - - -index -110 - - -field -21618 - - -captured_by_reference -12 - - -is_implicit -12 - - -location -13849 - - - - -id -lambda - - -12 - - -1 -2 -21618 - - - - - - -id -index - - -12 - - -1 -2 -21618 - - - - - - -id -field - - -12 - - -1 -2 -21618 - - - - - - -id -captured_by_reference - - -12 - - -1 -2 -21618 - - - - - - -id -is_implicit - - -12 - - -1 -2 -21618 - - - - - - -id -location - - -12 - - -1 -2 -21618 - - - - - - -lambda -id - - -12 - - -1 -2 -5131 - - -2 -3 -2345 - - -3 -4 -1247 - - -4 -6 -909 - - -6 -18 -519 - - - - - - -lambda -index - - -12 - - -1 -2 -5131 - - -2 -3 -2345 - - -3 -4 -1247 - - -4 -6 -909 - - -6 -18 -519 - - - - - - -lambda -field - - -12 - - -1 -2 -5131 - - -2 -3 -2345 - - -3 -4 -1247 - - -4 -6 -909 - - -6 -18 -519 - - - - - - -lambda -captured_by_reference - - -12 - - -1 -2 -9691 - - -2 -3 -461 - - - - - - -lambda -is_implicit - - -12 - - -1 -2 -10133 - - -2 -3 -19 - - - - - - -lambda -location - - -12 - - -1 -2 -5606 - - -2 -3 -2468 - - -3 -4 -1026 - - -4 -7 -811 - - -7 -18 -240 - - - - - - -index -id - - -12 - - -1 -2 -6 - - -2 -3 -6 - - -3 -4 -6 - - -4 -5 -6 - - -6 -7 -6 - - -10 -11 -6 - - -12 -13 -6 - - -16 -17 -6 - - -18 -19 -6 - - -23 -24 -6 - - -45 -46 -6 - - -80 -81 -6 - - -140 -141 -6 - - -220 -221 -6 - - -412 -413 -6 - - -773 -774 -6 - - -1563 -1564 -6 - - - - - - -index -lambda - - -12 - - -1 -2 -6 - - -2 -3 -6 - - -3 -4 -6 - - -4 -5 -6 - - -6 -7 -6 - - -10 -11 -6 - - -12 -13 -6 - - -16 -17 -6 - - -18 -19 -6 - - -23 -24 -6 - - -45 -46 -6 - - -80 -81 -6 - - -140 -141 -6 - - -220 -221 -6 - - -412 -413 -6 - - -773 -774 -6 - - -1563 -1564 -6 - - - - - - -index -field - - -12 - - -1 -2 -6 - - -2 -3 -6 - - -3 -4 -6 - - -4 -5 -6 - - -6 -7 -6 - - -10 -11 -6 - - -12 -13 -6 - - -16 -17 -6 - - -18 -19 -6 - - -23 -24 -6 - - -45 -46 -6 - - -80 -81 -6 - - -140 -141 -6 - - -220 -221 -6 - - -412 -413 -6 - - -773 -774 -6 - - -1563 -1564 -6 - - - - - - -index -captured_by_reference - - -12 - - -1 -2 -25 - - -2 -3 -84 - - - - - - -index -is_implicit - - -12 - - -1 -2 -64 - - -2 -3 -45 - - - - - - -index -location - - -12 - - -1 -2 -6 - - -2 -3 -6 - - -3 -4 -6 - - -4 -5 -6 - - -6 -7 -6 - - -9 -10 -6 - - -11 -12 -6 - - -14 -15 -6 - - -16 -17 -6 - - -21 -22 -6 - - -40 -41 -6 - - -64 -65 -6 - - -99 -100 -6 - - -176 -177 -6 - - -349 -350 -6 - - -589 -590 -6 - - -932 -933 -6 - - - - - - -field -id - - -12 - - -1 -2 -21618 - - - - - - -field -lambda - - -12 - - -1 -2 -21618 - - - - - - -field -index - - -12 - - -1 -2 -21618 - - - - - - -field -captured_by_reference - - -12 - - -1 -2 -21618 - - - - - - -field -is_implicit - - -12 - - -1 -2 -21618 - - - - - - -field -location - - -12 - - -1 -2 -21618 - - - - - - -captured_by_reference -id - - -12 - - -1201 -1202 -6 - - -2127 -2128 -6 - - - - - - -captured_by_reference -lambda - - -12 - - -613 -614 -6 - - -1021 -1022 -6 - - - - - - -captured_by_reference -index - - -12 - - -13 -14 -6 - - -17 -18 -6 - - - - - - -captured_by_reference -field - - -12 - - -1201 -1202 -6 - - -2127 -2128 -6 - - - - - - -captured_by_reference -is_implicit - - -12 - - -2 -3 -12 - - - - - - -captured_by_reference -location - - -12 - - -544 -545 -6 - - -1591 -1592 -6 - - - - - - -is_implicit -id - - -12 - - -848 -849 -6 - - -2480 -2481 -6 - - - - - - -is_implicit -lambda - - -12 - - -637 -638 -6 - - -929 -930 -6 - - - - - - -is_implicit -index - - -12 - - -7 -8 -6 - - -17 -18 -6 - - - - - - -is_implicit -field - - -12 - - -848 -849 -6 - - -2480 -2481 -6 - - - - - - -is_implicit -captured_by_reference - - -12 - - -2 -3 -12 - - - - - - -is_implicit -location - - -12 - - -330 -331 -6 - - -1802 -1803 -6 - - - - - - -location -id - - -12 - - -1 -2 -12485 - - -2 -6 -1039 - - -6 -68 -324 - - - - - - -location -lambda - - -12 - - -1 -2 -12926 - - -2 -68 -922 - - - - - - -location -index - - -12 - - -1 -2 -13316 - - -2 -8 -532 - - - - - - -location -field - - -12 - - -1 -2 -12485 - - -2 -6 -1039 - - -6 -68 -324 - - - - - - -location -captured_by_reference - - -12 - - -1 -2 -13829 - - -2 -3 -19 - - - - - - -location -is_implicit - - -12 - - -1 -2 -13849 - - - - - - - - -fold -4 - - -expr -4 - - -operator -4 - - -is_left_fold -2 - - - - -expr -operator - - -12 - - -1 -2 -4 - - - - - - -expr -is_left_fold - - -12 - - -1 -2 -4 - - - - - - -operator -expr - - -12 - - -1 -2 -4 - - - - - - -operator -is_left_fold - - -12 - - -1 -2 -4 - - - - - - -is_left_fold -expr - - -12 - - -2 -3 -2 - - - - - - -is_left_fold -operator - - -12 - - -2 -3 -2 - - - - - - - - -stmts -4651977 - - -id -4651977 - - -kind -116 - - -location -2016407 - - - - -id -kind - - -12 - - -1 -2 -4651977 - - - - - - -id -location - - -12 - - -1 -2 -4651977 - - - - - - -kind -id - - -12 - - -26 -27 -6 - - -553 -554 -6 - - -828 -829 -6 - - -1443 -1444 -6 - - -1582 -1583 -6 - - -1908 -1909 -6 - - -2445 -2446 -6 - - -3327 -3328 -6 - - -3570 -3571 -6 - - -4942 -4943 -6 - - -15732 -15733 -6 - - -15997 -15998 -6 - - -20983 -20984 -6 - - -68504 -68505 -6 - - -87453 -87454 -6 - - -109229 -109230 -6 - - -182456 -182457 -6 - - -195155 -195156 -6 - - - - - - -kind -location - - -12 - - -26 -27 -6 - - -414 -415 -6 - - -785 -786 -6 - - -1053 -1054 -6 - - -1285 -1286 -6 - - -1329 -1330 -6 - - -1370 -1371 -6 - - -2027 -2028 -6 - - -2301 -2302 -6 - - -2430 -2431 -6 - - -6908 -6909 -6 - - -8367 -8368 -6 - - -10976 -10977 -6 - - -36004 -36005 -6 - - -42618 -42619 -6 - - -45224 -45225 -6 - - -80548 -80549 -6 - - -96139 -96140 -6 - - - - - - -location -id - - -12 - - -1 -2 -1715650 - - -2 -4 -176807 - - -4 -1671 -123949 - - - - - - -location -kind - - -12 - - -1 -2 -1952279 - - -2 -10 -64128 - - - - - - - - -type_vla -1 - - -type_id -1 - - -decl -1 - - - - -type_id -decl - - -12 - - -1 -2 -1 - - - - - - -decl -type_id - - -12 - - -1 -2 -1 - - - - - - - - -variable_vla -8 - - -var -8 - - -decl -8 - - - - -var -decl - - -12 - - -1 -2 -8 - - - - - - -decl -var - - -12 - - -1 -2 -8 - - - - - - - - -if_then -524673 - - -if_stmt -524673 - - -then_id -524673 - - - - -if_stmt -then_id - - -12 - - -1 -2 -524673 - - - - - - -then_id -if_stmt - - -12 - - -1 -2 -524673 - - - - - - - - -if_else -148314 - - -if_stmt -148314 - - -else_id -148314 - - - - -if_stmt -else_id - - -12 - - -1 -2 -148314 - - - - - - -else_id -if_stmt - - -12 - - -1 -2 -148314 - - - - - - - - -constexpr_if_then -3 - - -constexpr_if_stmt -3 - - -then_id -3 - - - - -constexpr_if_stmt -then_id - - -12 - - -1 -2 -3 - - - - - - -then_id -constexpr_if_stmt - - -12 - - -1 -2 -3 - - - - - - - - -constexpr_if_else -1 - - -constexpr_if_stmt -1 - - -else_id -1 - - - - -constexpr_if_stmt -else_id - - -12 - - -1 -2 -1 - - - - - - -else_id -constexpr_if_stmt - - -12 - - -1 -2 -1 - - - - - - - - -while_body -30641 - - -while_stmt -30641 - - -body_id -30641 - - - - -while_stmt -body_id - - -12 - - -1 -2 -30641 - - - - - - -body_id -while_stmt - - -12 - - -1 -2 -30641 - - - - - - - - -do_body -149931 - - -do_stmt -149931 - - -body_id -149931 - - - - -do_stmt -body_id - - -12 - - -1 -2 -149931 - - - - - - -body_id -do_stmt - - -12 - - -1 -2 -149931 - - - - - - - - -switch_case -271721 - - -switch_stmt -53308 - - -index -264 - - -case_id -271721 - - - - -switch_stmt -index - - -12 - - -1 -5 -4059 - - -5 -6 -47188 - - -6 -163 -2060 - - - - - - -switch_stmt -case_id - - -12 - - -1 -5 -4059 - - -5 -6 -47188 - - -6 -163 -2060 - - - - - - -index -switch_stmt - - -12 - - -1 -2 -138 - - -2 -5 -22 - - -6 -17 -24 - - -17 -36 -21 - - -36 -86 -21 - - -91 -474 -21 - - -606 -32709 -14 - - - - - - -index -case_id - - -12 - - -1 -2 -138 - - -2 -5 -22 - - -6 -17 -24 - - -17 -36 -21 - - -36 -86 -21 - - -91 -474 -21 - - -606 -32709 -14 - - - - - - -case_id -switch_stmt - - -12 - - -1 -2 -271721 - - - - - - -case_id -index - - -12 - - -1 -2 -271721 - - - - - - - - -switch_body -53308 - - -switch_stmt -53308 - - -body_id -53308 - - - - -switch_stmt -body_id - - -12 - - -1 -2 -53308 - - - - - - -body_id -switch_stmt - - -12 - - -1 -2 -53308 - - - - - - - - -for_initialization -29667 - - -for_stmt -29667 - - -init_id -29667 - - - - -for_stmt -init_id - - -12 - - -1 -2 -29667 - - - - - - -init_id -for_stmt - - -12 - - -1 -2 -29667 - - - - - - - - -for_condition -31505 - - -for_stmt -31505 - - -condition_id -31505 - - - - -for_stmt -condition_id - - -12 - - -1 -2 -31505 - - - - - - -condition_id -for_stmt - - -12 - - -1 -2 -31505 - - - - - - - - -for_update -29407 - - -for_stmt -29407 - - -update_id -29407 - - - - -for_stmt -update_id - - -12 - - -1 -2 -29407 - - - - - - -update_id -for_stmt - - -12 - - -1 -2 -29407 - - - - - - - - -for_body -32103 - - -for_stmt -32103 - - -body_id -32103 - - - - -for_stmt -body_id - - -12 - - -1 -2 -32103 - - - - - - -body_id -for_stmt - - -12 - - -1 -2 -32103 - - - - - - - - -stmtparents -4113351 - - -id -4113351 - - -index -12615 - - -parent -1738665 - - - - -id -index - - -12 - - -1 -2 -4113351 - - - - - - -id -parent - - -12 - - -1 -2 -4113351 - - - - - - -index -id - - -12 - - -1 -2 -3962 - - -2 -3 -1078 - - -3 -4 -513 - - -4 -5 -1474 - - -7 -8 -1032 - - -8 -12 -818 - - -12 -29 -1110 - - -29 -37 -896 - - -37 -74 -961 - - -74 -192180 -766 - - - - - - -index -parent - - -12 - - -1 -2 -3962 - - -2 -3 -1078 - - -3 -4 -513 - - -4 -5 -1474 - - -7 -8 -1032 - - -8 -12 -818 - - -12 -29 -1110 - - -29 -37 -896 - - -37 -74 -961 - - -74 -192180 -766 - - - - - - -parent -id - - -12 - - -1 -2 -990323 - - -2 -3 -382079 - - -3 -4 -108209 - - -4 -6 -113841 - - -6 -17 -131575 - - -17 -1943 -12634 - - - - - - -parent -index - - -12 - - -1 -2 -990323 - - -2 -3 -382079 - - -3 -4 -108209 - - -4 -6 -113841 - - -6 -17 -131575 - - -17 -1943 -12634 - - - - - - - - -ishandler -21612 - - -block -21612 - - - - - -stmt_decl_bind -531383 - - -stmt -524523 - - -num -51 - - -decl -531383 - - - - -stmt -num - - -12 - - -1 -2 -519092 - - -2 -9 -5430 - - - - - - -stmt -decl - - -12 - - -1 -2 -519073 - - -2 -9 -5450 - - - - - - -num -stmt - - -12 - - -1 -2 -6 - - -4 -5 -6 - - -7 -8 -6 - - -9 -10 -6 - - -24 -25 -6 - - -172 -173 -6 - - -836 -837 -6 - - -80746 -80747 -6 - - - - - - -num -decl - - -12 - - -1 -2 -6 - - -4 -5 -6 - - -7 -8 -6 - - -9 -10 -6 - - -24 -25 -6 - - -172 -173 -6 - - -836 -837 -6 - - -80749 -80750 -6 - - - - - - -decl -stmt - - -12 - - -1 -2 -531383 - - - - - - -decl -num - - -12 - - -1 -2 -531383 - - - - - - - - -stmt_decl_entry_bind -498005 - - -stmt -454241 - - -num -444 - - -decl_entry -474016 - - - - -stmt -num - - -12 - - -1 -2 -422673 - - -2 -274 -31568 - - - - - - -stmt -decl_entry - - -12 - - -1 -2 -422673 - - -2 -15 -31568 - - - - - - -num -stmt - - -12 - - -8 -9 -6 - - -11 -12 -213 - - -13 -14 -1 - - -15 -16 -190 - - -17 -278706 -32 - - - - - - -num -decl_entry - - -12 - - -8 -9 -6 - - -11 -12 -213 - - -13 -14 -190 - - -15 -267734 -34 - - - - - - -decl_entry -stmt - - -12 - - -1 -2 -462337 - - -2 -17 -11679 - - - - - - -decl_entry -num - - -12 - - -1 -2 -473936 - - -2 -273 -79 - - - - - - - - -blockscope -1309621 - - -block -1309621 - - -enclosing -1173021 - - - - -block -enclosing - - -12 - - -1 -2 -1309621 - - - - - - -enclosing -block - - -12 - - -1 -2 -1093573 - - -2 -509 -79447 - - - - - - - - -jumpinfo -351037 - - -id -351037 - - -str -5914 - - -target -81577 - - - - -id -str - - -12 - - -1 -2 -351037 - - - - - - -id -target - - -12 - - -1 -2 -351037 - - - - - - -str -id - - -12 - - -2 -3 -3212 - - -3 -4 -796 - - -4 -5 -686 - - -5 -7 -487 - - -7 -15 -459 - - -15 -181398 -272 - - - - - - -str -target - - -12 - - -1 -2 -4703 - - -2 -3 -674 - - -3 -12 -456 - - -12 -38931 -79 - - - - - - -target -id - - -12 - - -1 -2 -254 - - -2 -3 -19879 - - -3 -4 -7102 - - -4 -5 -3572 - - -5 -6 -38447 - - -6 -7 -10579 - - -7 -166 -1742 - - - - - - -target -str - - -12 - - -1 -2 -81577 - - - - - - - - -preprocdirects -1308115 - - -id -1308115 - - -kind -140 - - -location -1301872 - - - - -id -kind - - -12 - - -1 -2 -1308115 - - - - - - -id -location - - -12 - - -1 -2 -1308115 - - - - - - -kind -id - - -12 - - -4 -5 -10 - - -8 -9 -10 - - -500 -501 -10 - - -967 -968 -10 - - -1755 -1756 -10 - - -1881 -1882 -10 - - -5258 -5259 -10 - - -5570 -5571 -10 - - -7598 -7599 -10 - - -14233 -14234 -10 - - -26512 -26513 -10 - - -27401 -27402 -10 - - -29002 -29003 -10 - - - - - - -kind -location - - -12 - - -4 -5 -10 - - -7 -8 -10 - - -500 -501 -10 - - -967 -968 -10 - - -1755 -1756 -10 - - -1881 -1882 -10 - - -5258 -5259 -10 - - -5570 -5571 -10 - - -7598 -7599 -10 - - -14233 -14234 -10 - - -26170 -26171 -10 - - -27401 -27402 -10 - - -28769 -28770 -10 - - - - - - -location -id - - -12 - - -1 -2 -1301546 - - -2 -235 -325 - - - - - - -location -kind - - -12 - - -1 -2 -1301872 - - - - - - - - -preprocpair -374369 - - -begin -296991 - - -elseelifend -374369 - - - - -begin -elseelifend - - -12 - - -1 -2 -235829 - - -2 -3 -53911 - - -3 -53 -7251 - - - - - - -elseelifend -begin - - -12 - - -1 -2 -374369 - - - - - - - - -preproctrue -164618 - - -branch -164618 - - - - - -preprocfalse -117730 - - -branch -117730 - - - - - -preproctext -954122 - - -id -954122 - - -head -458142 - - -body -173528 - - - - -id -head - - -12 - - -1 -2 -954122 - - - - - - -id -body - - -12 - - -1 -2 -954122 - - - - - - -head -id - - -12 - - -1 -2 -341918 - - -2 -3 -77258 - - -3 -19 -34369 - - -19 -752 -4595 - - - - - - -head -body - - -12 - - -1 -2 -436714 - - -2 -38 -21428 - - - - - - -body -id - - -12 - - -1 -2 -163079 - - -2 -64816 -10448 - - - - - - -body -head - - -12 - - -1 -2 -164542 - - -2 -21810 -8985 - - - - - - - - -includes -287443 - - -id -287443 - - -included -53966 - - - - -id -included - - -12 - - -1 -2 -287443 - - - - - - -included -id - - -12 - - -1 -2 -26576 - - -2 -3 -8855 - - -3 -4 -4563 - - -4 -6 -4790 - - -6 -11 -4140 - - -11 -41 -4064 - - -41 -763 -975 - - - - - - - - -link_targets -574 - - -id -574 - - -binary -574 - - - - -id -binary - - -12 - - -1 -2 -574 - - - - - - -binary -id - - -12 - - -1 -2 -574 - - - - - - - - -link_parent -18584884 - - -element -5164827 - - -link_target -574 - - - - -element -link_target - - -12 - - -1 -2 -1543684 - - -2 -3 -1943264 - - -3 -4 -754223 - - -4 -6 -422385 - - -6 -29 -402680 - - -29 -45 -98589 - - - - - - -link_target -element - - -12 - - -2 -3 -86 - - -5 -559 -43 - - -2834 -6256 -43 - - -6663 -8713 -43 - - -10268 -13146 -43 - - -13433 -20518 -43 - - -25549 -27566 -43 - - -27680 -33162 -43 - - -34917 -40444 -43 - - -42525 -46022 -43 - - -47794 -58086 -43 - - -58594 -139377 -43 - - -388296 -388297 -10 - - - - - - - - -xmlEncoding -39724 - - -id -39724 - - -encoding -1 - - - - -id -encoding - - -12 - - -1 -2 -39724 - - - - - - -encoding -id - - -12 - - -39724 -39725 -1 - - - - - - - - -xmlDTDs -1 - - -id -1 - - -root -1 - - -publicId -1 - - -systemId -1 - - -fileid -1 - - - - -id -root - - -12 - - -1 -2 -1 - - - - - - -id -publicId - - -12 - - -1 -2 -1 - - - - - - -id -systemId - - -12 - - -1 -2 -1 - - - - - - -id -fileid - - -12 - - -1 -2 -1 - - - - - - -root -id - - -12 - - -1 -2 -1 - - - - - - -root -publicId - - -12 - - -1 -2 -1 - - - - - - -root -systemId - - -12 - - -1 -2 -1 - - - - - - -root -fileid - - -12 - - -1 -2 -1 - - - - - - -publicId -id - - -12 - - -1 -2 -1 - - - - - - -publicId -root - - -12 - - -1 -2 -1 - - - - - - -publicId -systemId - - -12 - - -1 -2 -1 - - - - - - -publicId -fileid - - -12 - - -1 -2 -1 - - - - - - -systemId -id - - -12 - - -1 -2 -1 - - - - - - -systemId -root - - -12 - - -1 -2 -1 - - - - - - -systemId -publicId - - -12 - - -1 -2 -1 - - - - - - -systemId -fileid - - -12 - - -1 -2 -1 - - - - - - -fileid -id - - -12 - - -1 -2 -1 - - - - - - -fileid -root - - -12 - - -1 -2 -1 - - - - - - -fileid -publicId - - -12 - - -1 -2 -1 - - - - - - -fileid -systemId - - -12 - - -1 -2 -1 - - - - - - - - -xmlElements -1270313 - - -id -1270313 - - -name -4655 - - -parentid -578021 - - -idx -35122 - - -fileid -39721 - - - - -id -name - - -12 - - -1 -2 -1270313 - - - - - - -id -parentid - - -12 - - -1 -2 -1270313 - - - - - - -id -idx - - -12 - - -1 -2 -1270313 - - - - - - -id -fileid - - -12 - - -1 -2 -1270313 - - - - - - -name -id - - -12 - - -1 -2 -420 - - -2 -5 -156 - - -5 -6 -3832 - - -6 -310317 -247 - - - - - - -name -parentid - - -12 - - -1 -2 -456 - - -2 -5 -150 - - -5 -6 -3829 - - -6 -161565 -220 - - - - - - -name -idx - - -12 - - -1 -2 -4358 - - -2 -35123 -297 - - - - - - -name -fileid - - -12 - - -1 -2 -486 - - -2 -5 -133 - - -5 -6 -3831 - - -6 -14503 -205 - - - - - - -parentid -id - - -12 - - -1 -2 -371969 - - -2 -3 -62095 - - -3 -4 -104113 - - -4 -35123 -39844 - - - - - - -parentid -name - - -12 - - -1 -2 -500482 - - -2 -3 -17866 - - -3 -4 -49117 - - -4 -45 -10556 - - - - - - -parentid -idx - - -12 - - -1 -2 -371969 - - -2 -3 -62095 - - -3 -4 -104113 - - -4 -35123 -39844 - - - - - - -parentid -fileid - - -12 - - -1 -2 -578021 - - - - - - -idx -id - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -578022 -2083 - - - - - - -idx -name - - -12 - - -1 -2 -18457 - - -2 -3 -6533 - - -3 -4 -6178 - - -4 -8 -2624 - - -8 -4397 -1330 - - - - - - -idx -parentid - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -578022 -2083 - - - - - - -idx -fileid - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -39722 -2083 - - - - - - -fileid -id - - -12 - - -1 -2 -20457 - - -2 -3 -3115 - - -3 -7 -3026 - - -7 -8 -3588 - - -8 -9 -2220 - - -9 -11 -3099 - - -11 -19 -3087 - - -19 -114506 -1129 - - - - - - -fileid -name - - -12 - - -1 -2 -20459 - - -2 -3 -3458 - - -3 -5 -2569 - - -5 -7 -2172 - - -7 -8 -6158 - - -8 -9 -3501 - - -9 -46 -1404 - - - - - - -fileid -parentid - - -12 - - -1 -2 -20457 - - -2 -3 -3870 - - -3 -5 -2152 - - -5 -6 -2876 - - -6 -7 -2720 - - -7 -8 -4132 - - -8 -14 -3096 - - -14 -31079 -418 - - - - - - -fileid -idx - - -12 - - -1 -2 -25894 - - -2 -3 -5301 - - -3 -4 -3787 - - -4 -6 -3268 - - -6 -35123 -1471 - - - - - - - - -xmlAttrs -1202020 - - -id -1202020 - - -elementid -760198 - - -name -3649 - - -value -121803 - - -idx -2000 - - -fileid -39448 - - - - -id -elementid - - -12 - - -1 -2 -1202020 - - - - - - -id -name - - -12 - - -1 -2 -1202020 - - - - - - -id -value - - -12 - - -1 -2 -1202020 - - - - - - -id -idx - - -12 - - -1 -2 -1202020 - - - - - - -id -fileid - - -12 - - -1 -2 -1202020 - - - - - - -elementid -id - - -12 - - -1 -2 -425697 - - -2 -3 -249659 - - -3 -4 -66474 - - -4 -2001 -18368 - - - - - - -elementid -name - - -12 - - -1 -2 -425778 - - -2 -3 -249579 - - -3 -4 -66475 - - -4 -2001 -18366 - - - - - - -elementid -value - - -12 - - -1 -2 -466237 - - -2 -3 -266291 - - -3 -46 -27670 - - - - - - -elementid -idx - - -12 - - -1 -2 -425697 - - -2 -3 -249659 - - -3 -4 -66474 - - -4 -2001 -18368 - - - - - - -elementid -fileid - - -12 - - -1 -2 -760198 - - - - - - -name -id - - -12 - - -1 -2 -3467 - - -2 -262475 -182 - - - - - - -name -elementid - - -12 - - -1 -2 -3467 - - -2 -262475 -182 - - - - - - -name -value - - -12 - - -1 -2 -3501 - - -2 -54146 -148 - - - - - - -name -idx - - -12 - - -1 -2 -3531 - - -2 -11 -118 - - - - - - -name -fileid - - -12 - - -1 -2 -3491 - - -2 -21768 -158 - - - - - - -value -id - - -12 - - -1 -2 -72032 - - -2 -3 -42366 - - -3 -199269 -7405 - - - - - - -value -elementid - - -12 - - -1 -2 -72036 - - -2 -3 -42374 - - -3 -199269 -7393 - - - - - - -value -name - - -12 - - -1 -2 -116722 - - -2 -2041 -5081 - - - - - - -value -idx - - -12 - - -1 -2 -117957 - - -2 -2001 -3846 - - - - - - -value -fileid - - -12 - - -1 -2 -86306 - - -2 -3 -28570 - - -3 -4175 -6927 - - - - - - -idx -id - - -12 - - -1 -2 -1955 - - -2 -760199 -45 - - - - - - -idx -elementid - - -12 - - -1 -2 -1955 - - -2 -760199 -45 - - - - - - -idx -name - - -12 - - -1 -2 -1955 - - -2 -189 -45 - - - - - - -idx -value - - -12 - - -1 -2 -1955 - - -2 -116643 -45 - - - - - - -idx -fileid - - -12 - - -1 -2 -1955 - - -2 -39449 -45 - - - - - - -fileid -id - - -12 - - -1 -2 -22884 - - -2 -4 -2565 - - -4 -6 -2294 - - -6 -7 -3299 - - -7 -9 -3272 - - -9 -16 -3143 - - -16 -129952 -1991 - - - - - - -fileid -elementid - - -12 - - -1 -2 -23890 - - -2 -4 -2131 - - -4 -5 -1971 - - -5 -6 -4096 - - -6 -8 -3519 - - -8 -16 -3137 - - -16 -106600 -704 - - - - - - -fileid -name - - -12 - - -1 -2 -22946 - - -2 -3 -2338 - - -3 -4 -2726 - - -4 -5 -2824 - - -5 -6 -2994 - - -6 -7 -3876 - - -7 -2002 -1744 - - - - - - -fileid -value - - -12 - - -1 -2 -22916 - - -2 -4 -2772 - - -4 -5 -2112 - - -5 -6 -3510 - - -6 -8 -1993 - - -8 -11 -3365 - - -11 -50357 -2780 - - - - - - -fileid -idx - - -12 - - -1 -2 -26133 - - -2 -3 -9699 - - -3 -5 -3511 - - -5 -2001 -105 - - - - - - - - -xmlNs -71201 - - -id -4185 - - -prefixName -958 - - -URI -4185 - - -fileid -39544 - - - - -id -prefixName - - -12 - - -1 -2 -2602 - - -2 -3 -1553 - - -3 -872 -30 - - - - - - -id -URI - - -12 - - -1 -2 -4185 - - - - - - -id -fileid - - -12 - - -1 -6 -274 - - -6 -7 -3825 - - -7 -24905 -86 - - - - - - -prefixName -id - - -12 - - -1 -2 -915 - - -2 -4054 -43 - - - - - - -prefixName -URI - - -12 - - -1 -2 -915 - - -2 -4054 -43 - - - - - - -prefixName -fileid - - -12 - - -1 -2 -828 - - -2 -5 -73 - - -5 -24903 -57 - - - - - - -URI -id - - -12 - - -1 -2 -4185 - - - - - - -URI -prefixName - - -12 - - -1 -2 -2602 - - -2 -3 -1553 - - -3 -872 -30 - - - - - - -URI -fileid - - -12 - - -1 -6 -274 - - -6 -7 -3825 - - -7 -24905 -86 - - - - - - -fileid -id - - -12 - - -1 -2 -11655 - - -2 -3 -26146 - - -3 -8 -1743 - - - - - - -fileid -prefixName - - -12 - - -1 -2 -11653 - - -2 -3 -25982 - - -3 -31 -1909 - - - - - - -fileid -URI - - -12 - - -1 -2 -11655 - - -2 -3 -26146 - - -3 -8 -1743 - - - - - - - - -xmlHasNs -1139730 - - -elementId -1139730 - - -nsId -4136 - - -fileid -39537 - - - - -elementId -nsId - - -12 - - -1 -2 -1139730 - - - - - - -elementId -fileid - - -12 - - -1 -2 -1139730 - - - - - - -nsId -elementId - - -12 - - -1 -5 -234 - - -5 -6 -3824 - - -6 -643289 -78 - - - - - - -nsId -fileid - - -12 - - -1 -5 -257 - - -5 -6 -3823 - - -6 -24759 -56 - - - - - - -fileid -elementId - - -12 - - -1 -2 -3669 - - -2 -3 -20429 - - -3 -7 -2536 - - -7 -8 -3473 - - -8 -9 -2258 - - -9 -11 -3036 - - -11 -18 -2966 - - -18 -147552 -1170 - - - - - - -fileid -nsId - - -12 - - -1 -2 -18261 - - -2 -3 -21032 - - -3 -8 -244 - - - - - - - - -xmlComments -26812 - - -id -26812 - - -text -22933 - - -parentid -26546 - - -fileid -26368 - - - - -id -text - - -12 - - -1 -2 -26812 - - - - - - -id -parentid - - -12 - - -1 -2 -26812 - - - - - - -id -fileid - - -12 - - -1 -2 -26812 - - - - - - -text -id - - -12 - - -1 -2 -21517 - - -2 -62 -1416 - - - - - - -text -parentid - - -12 - - -1 -2 -21519 - - -2 -62 -1414 - - - - - - -text -fileid - - -12 - - -1 -2 -21522 - - -2 -62 -1411 - - - - - - -parentid -id - - -12 - - -1 -2 -26379 - - -2 -17 -167 - - - - - - -parentid -text - - -12 - - -1 -2 -26379 - - -2 -17 -167 - - - - - - -parentid -fileid - - -12 - - -1 -2 -26546 - - - - - - -fileid -id - - -12 - - -1 -2 -26161 - - -2 -17 -207 - - - - - - -fileid -text - - -12 - - -1 -2 -26165 - - -2 -17 -203 - - - - - - -fileid -parentid - - -12 - - -1 -2 -26223 - - -2 -10 -145 - - - - - - - - -xmlChars -439958 - - -id -439958 - - -text -100518 - - -parentid -433851 - - -idx -4 - - -isCDATA -1 - - -fileid -26494 - - - - -id -text - - -12 - - -1 -2 -439958 - - - - - - -id -parentid - - -12 - - -1 -2 -439958 - - - - - - -id -idx - - -12 - - -1 -2 -439958 - - - - - - -id -isCDATA - - -12 - - -1 -2 -439958 - - - - - - -id -fileid - - -12 - - -1 -2 -439958 - - - - - - -text -id - - -12 - - -1 -2 -60389 - - -2 -4 -3811 - - -4 -5 -29257 - - -5 -23171 -7061 - - - - - - -text -parentid - - -12 - - -1 -2 -60389 - - -2 -4 -3811 - - -4 -5 -29257 - - -5 -23171 -7061 - - - - - - -text -idx - - -12 - - -1 -2 -100517 - - -2 -3 -1 - - - - - - -text -isCDATA - - -12 - - -1 -2 -100518 - - - - - - -text -fileid - - -12 - - -1 -2 -61284 - - -2 -4 -4205 - - -4 -5 -28328 - - -5 -351 -6701 - - - - - - -parentid -id - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -text - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -idx - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -isCDATA - - -12 - - -1 -2 -433851 - - - - - - -parentid -fileid - - -12 - - -1 -2 -433851 - - - - - - -idx -id - - -12 - - -80 -81 -1 - - -1892 -1893 -1 - - -4135 -4136 -1 - - -433851 -433852 -1 - - - - - - -idx -text - - -12 - - -1 -2 -1 - - -3 -4 -1 - - -16 -17 -1 - - -100499 -100500 -1 - - - - - - -idx -parentid - - -12 - - -80 -81 -1 - - -1892 -1893 -1 - - -4135 -4136 -1 - - -433851 -433852 -1 - - - - - - -idx -isCDATA - - -12 - - -1 -2 -4 - - - - - - -idx -fileid - - -12 - - -4 -5 -1 - - -46 -47 -1 - - -97 -98 -1 - - -26494 -26495 -1 - - - - - - -isCDATA -id - - -12 - - -439958 -439959 -1 - - - - - - -isCDATA -text - - -12 - - -100518 -100519 -1 - - - - - - -isCDATA -parentid - - -12 - - -433851 -433852 -1 - - - - - - -isCDATA -idx - - -12 - - -4 -5 -1 - - - - - - -isCDATA -fileid - - -12 - - -26494 -26495 -1 - - - - - - -fileid -id - - -12 - - -1 -2 -25303 - - -2 -35123 -1191 - - - - - - -fileid -text - - -12 - - -1 -2 -25765 - - -2 -35123 -729 - - - - - - -fileid -parentid - - -12 - - -1 -2 -25312 - - -2 -35123 -1182 - - - - - - -fileid -idx - - -12 - - -1 -2 -26397 - - -2 -5 -97 - - - - - - -fileid -isCDATA - - -12 - - -1 -2 -26494 - - - - - - - - -xmllocations -3051056 - - -xmlElement -2982460 - - -location -3051056 - - - - -xmlElement -location - - -12 - - -1 -2 -2978326 - - -2 -24903 -4134 - - - - - - -location -xmlElement - - -12 - - -1 -2 -3051056 - - - - - - - - + + + @compilation + 9980 + + + @externalDataElement + 65 + + + @external_package + 4 + + + @svnentry + 575525 + + + @location_stmt + 3805462 + + + @diagnostic + 632933 + + + @file + 124189 + + + @folder + 15994 + + + @location_expr + 13128112 + + + @location_default + 30128761 + + + @macroinvocation + 33895024 + + + @function + 4726273 + + + @fun_decl + 5096962 + + + @var_decl + 8543232 + + + @type_decl + 3283977 + + + @namespace_decl + 306979 + + + @using + 374921 + + + @static_assert + 130414 + + + @parameter + 6660155 + + + @membervariable + 1050083 + + + @globalvariable + 300708 + + + @localvariable + 581698 + + + @enumconstant + 240613 + + + @builtintype + 22109 + + + @derivedtype + 4413446 + + + @decltype + 31047 + + + @usertype + 5342989 + + + @mangledname + 1730792 + + + @type_mention + 4011508 + + + @routinetype + 546982 + + + @ptrtomember + 38103 + + + @specifier + 24932 + + + @gnuattribute + 664228 + + + @stdattribute + 469328 + + + @alignas + 8937 + + + @declspec + 238544 + + + @msattribute + 3 + + + @attribute_arg_token + 25402 + + + @attribute_arg_constant + 326469 + + + @attribute_arg_type + 470 + + + @attribute_arg_empty + 1 + + + @derivation + 402388 + + + @frienddecl + 715075 + + + @comment + 9004230 + + + @namespace + 12701 + + + @specialnamequalifyingelement + 470 + + + @namequalifier + 1618961 + + + @value + 10646146 + + + @initialiser + 1731850 + + + @lambdacapture + 28224 + + + @stmt_expr + 1480414 + + + @stmt_if + 723174 + + + @stmt_while + 30207 + + + @stmt_label + 53046 + + + @stmt_return + 1306346 + + + @stmt_block + 1446530 + + + @stmt_end_test_while + 148604 + + + @stmt_for + 61324 + + + @stmt_switch_case + 191408 + + + @stmt_switch + 20901 + + + @stmt_try_block + 42701 + + + @stmt_decl + 608508 + + + @stmt_empty + 193487 + + + @stmt_continue + 22507 + + + @stmt_break + 102234 + + + @stmt_range_based_for + 8467 + + + @stmt_handler + 59432 + + + @stmt_constexpr_if + 52508 + + + @stmt_goto + 110490 + + + @stmt_asm + 110589 + + + @stmt_microsoft_try + 163 + + + @stmt_set_vla_size + 26 + + + @stmt_vla_decl + 21 + + + @stmt_assigned_goto + 9059 + + + @stmt_co_return + 2 + + + @delete_array_expr + 1410 + + + @new_array_expr + 5099 + + + @ctordirectinit + 112813 + + + @ctorvirtualinit + 6534 + + + @ctorfieldinit + 200789 + + + @ctordelegatinginit + 3347 + + + @dtordirectdestruct + 41715 + + + @dtorvirtualdestruct + 4122 + + + @dtorfielddestruct + 41644 + + + @static_cast + 211822 + + + @reinterpret_cast + 30813 + + + @const_cast + 35320 + + + @dynamic_cast + 1040 + + + @c_style_cast + 4209393 + + + @lambdaexpr + 21639 + + + @param_ref + 375289 + + + @errorexpr + 46823 + + + @address_of + 438806 + + + @reference_to + 1596143 + + + @indirect + 292115 + + + @ref_indirect + 1934537 + + + @array_to_pointer + 1424883 + + + @vacuous_destructor_call + 8138 + + + @parexpr + 3572547 + + + @arithnegexpr + 650874 + + + @complementexpr + 27787 + + + @notexpr + 277992 + + + @postincrexpr + 61774 + + + @postdecrexpr + 41860 + + + @preincrexpr + 70307 + + + @predecrexpr + 26108 + + + @conditionalexpr + 654502 + + + @addexpr + 400358 + + + @subexpr + 339340 + + + @mulexpr + 305891 + + + @divexpr + 133731 + + + @remexpr + 15819 + + + @paddexpr + 86505 + + + @psubexpr + 49681 + + + @pdiffexpr + 35529 + + + @lshiftexpr + 562988 + + + @rshiftexpr + 141617 + + + @andexpr + 491818 + + + @orexpr + 146267 + + + @xorexpr + 53938 + + + @eqexpr + 468873 + + + @neexpr + 300411 + + + @gtexpr + 100669 + + + @ltexpr + 106314 + + + @geexpr + 58989 + + + @leexpr + 212141 + + + @assignexpr + 933419 + + + @assignaddexpr + 68222 + + + @assignsubexpr + 11157 + + + @assignmulexpr + 7170 + + + @assigndivexpr + 4972 + + + @assignremexpr + 419 + + + @assignlshiftexpr + 2704 + + + @assignrshiftexpr + 4495 + + + @assignandexpr + 4852 + + + @assignorexpr + 23851 + + + @assignxorexpr + 21804 + + + @assignpaddexpr + 13577 + + + @andlogicalexpr + 249008 + + + @orlogicalexpr + 864018 + + + @commaexpr + 181539 + + + @subscriptexpr + 367915 + + + @callexpr + 309063 + + + @vastartexpr + 3703 + + + @vaendexpr + 2822 + + + @vacopyexpr + 140 + + + @varaccess + 6006364 + + + @thisaccess + 1125933 + + + @new_expr + 47598 + + + @delete_expr + 11732 + + + @throw_expr + 21765 + + + @condition_decl + 38595 + + + @braced_init_list + 1008 + + + @type_id + 36430 + + + @runtime_sizeof + 289268 + + + @runtime_alignof + 48550 + + + @sizeof_pack + 5644 + + + @routineexpr + 3047613 + + + @type_operand + 1126029 + + + @isemptyexpr + 2305 + + + @ispodexpr + 636 + + + @hastrivialdestructor + 470 + + + @literal + 4350894 + + + @aggregateliteral + 913874 + + + @istrivialexpr + 940 + + + @istriviallycopyableexpr + 3763 + + + @isconstructibleexpr + 2724 + + + @isfinalexpr + 2096 + + + @noexceptexpr + 23574 + + + @builtinaddressof + 13282 + + + @temp_init + 760683 + + + @assume + 3200 + + + @unaryplusexpr + 2903 + + + @conjugation + 1 + + + @realpartexpr + 69 + + + @imagpartexpr + 69 + + + @jmulexpr + 1 + + + @jdivexpr + 1 + + + @fjaddexpr + 1 + + + @jfaddexpr + 1 + + + @fjsubexpr + 1 + + + @jfsubexpr + 1 + + + @minexpr + 1 + + + @maxexpr + 1 + + + @assignpsubexpr + 1148 + + + @virtfunptrexpr + 1 + + + @vaargexpr + 950 + + + @expr_stmt + 94929 + + + @offsetofexpr + 20103 + + + @hasassignexpr + 2 + + + @hascopyexpr + 2 + + + @hasnothrowassign + 3 + + + @hasnothrowconstr + 3 + + + @hasnothrowcopy + 5 + + + @hastrivialassign + 2 + + + @hastrivialconstr + 3 + + + @hastrivialcopy + 2 + + + @hasuserdestr + 3 + + + @hasvirtualdestr + 3 + + + @isabstractexpr + 18 + + + @isbaseofexpr + 37 + + + @isclassexpr + 1835 + + + @isconvtoexpr + 1152 + + + @isenumexpr + 1257 + + + @ispolyexpr + 3 + + + @isunionexpr + 5 + + + @typescompexpr + 562415 + + + @intaddrexpr + 1 + + + @uuidof + 19994 + + + @foldexpr + 4 + + + @noopexpr + 37 + + + @istriviallyconstructibleexpr + 2829 + + + @isdestructibleexpr + 4 + + + @isnothrowdestructibleexpr + 5 + + + @istriviallydestructibleexpr + 5 + + + @istriviallyassignableexpr + 524 + + + @isnothrowassignableexpr + 2096 + + + @isstandardlayoutexpr + 838 + + + @isliteraltypeexpr + 2 + + + @hastrivialmoveconstructorexpr + 3 + + + @hastrivialmoveassignexpr + 3 + + + @hasnothrowmoveassignexpr + 4 + + + @isnothrowconstructibleexpr + 4821 + + + @hasfinalizerexpr + 1 + + + @isdelegateexpr + 1 + + + @isinterfaceclassexpr + 1 + + + @isrefarrayexpr + 1 + + + @isrefclassexpr + 1 + + + @issealedexpr + 1 + + + @issimplevalueclassexpr + 1 + + + @isvalueclassexpr + 1 + + + @builtinshufflevector + 1 + + + @builtinchooseexpr + 9136 + + + @vec_fill + 1 + + + @builtinconvertvector + 1 + + + @builtincomplex + 4 + + + @spaceshipexpr + 1 + + + @co_await + 6 + + + @co_yield + 1 + + + @ppd_if + 672225 + + + @ppd_ifdef + 265314 + + + @ppd_ifndef + 268607 + + + @ppd_elif + 25402 + + + @ppd_else + 210746 + + + @ppd_endif + 1206147 + + + @ppd_plain_include + 313767 + + + @ppd_define + 2437824 + + + @ppd_undef + 262021 + + + @ppd_pragma + 312641 + + + @ppd_include_next + 1881 + + + @ppd_line + 27780 + + + @ppd_error + 46 + + + @ppd_objc_import + 2 + + + @ppd_warning + 1 + + + @link_target + 1471 + + + @xmldtd + 1 + + + @xmlelement + 1270313 + + + @xmlattribute + 1202020 + + + @xmlnamespace + 4185 + + + @xmlcomment + 26812 + + + @xmlcharacters + 439958 + + + + + compilations + 9980 + + + id + 9980 + + + cwd + 11 + + + + + id + cwd + + + 12 + + + 1 + 2 + 9980 + + + + + + + cwd + id + + + 12 + + + 863 + 864 + 11 + + + + + + + + + compilation_args + 656151 + + + id + 5544 + + + num + 713 + + + arg + 34651 + + + + + id + num + + + 12 + + + 23 + 69 + 489 + + + 71 + 102 + 276 + + + 126 + 127 + 3889 + + + 127 + 129 + 58 + + + 131 + 132 + 819 + + + 134 + 135 + 10 + + + + + + + id + arg + + + 12 + + + 23 + 57 + 489 + + + 57 + 106 + 292 + + + 106 + 107 + 3852 + + + 107 + 109 + 79 + + + 109 + 110 + 819 + + + 111 + 112 + 10 + + + + + + + num + id + + + 12 + + + 2 + 168 + 42 + + + 898 + 899 + 133 + + + 911 + 930 + 58 + + + 930 + 938 + 58 + + + 938 + 951 + 58 + + + 970 + 989 + 37 + + + 999 + 1000 + 74 + + + 1001 + 1013 + 58 + + + 1018 + 1040 + 63 + + + 1041 + 1042 + 5 + + + 1042 + 1043 + 122 + + + + + + + num + arg + + + 12 + + + 1 + 5 + 63 + + + 5 + 6 + 63 + + + 6 + 8 + 58 + + + 8 + 13 + 53 + + + 13 + 14 + 31 + + + 14 + 15 + 47 + + + 15 + 16 + 42 + + + 16 + 18 + 63 + + + 18 + 22 + 58 + + + 22 + 26 + 58 + + + 27 + 36 + 58 + + + 36 + 169 + 58 + + + 169 + 819 + 53 + + + + + + + arg + id + + + 12 + + + 1 + 2 + 32576 + + + 2 + 1043 + 2075 + + + + + + + arg + num + + + 12 + + + 1 + 2 + 33438 + + + 2 + 56 + 1213 + + + + + + + + + compilation_compiling_files + 11495 + + + id + 1988 + + + num + 3301 + + + file + 9984 + + + + + id + num + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 119 + + + 3 + 4 + 119 + + + 4 + 5 + 238 + + + 5 + 8 + 119 + + + 8 + 9 + 119 + + + 9 + 13 + 159 + + + 21 + 84 + 119 + + + + + + + id + file + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 119 + + + 3 + 4 + 119 + + + 4 + 5 + 238 + + + 5 + 8 + 119 + + + 8 + 9 + 119 + + + 9 + 13 + 159 + + + 21 + 84 + 119 + + + + + + + num + id + + + 12 + + + 1 + 2 + 1750 + + + 2 + 3 + 715 + + + 3 + 4 + 357 + + + 4 + 13 + 278 + + + 13 + 51 + 198 + + + + + + + num + file + + + 12 + + + 1 + 2 + 1750 + + + 2 + 3 + 715 + + + 3 + 4 + 357 + + + 4 + 13 + 278 + + + 13 + 49 + 198 + + + + + + + file + id + + + 12 + + + 1 + 2 + 8989 + + + 2 + 4 + 835 + + + 4 + 6 + 159 + + + + + + + file + num + + + 12 + + + 1 + 2 + 9148 + + + 2 + 4 + 795 + + + 4 + 5 + 39 + + + + + + + + + compilation_time + 45982 + + + id + 1988 + + + num + 3301 + + + kind + 159 + + + seconds + 10779 + + + + + id + num + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 119 + + + 3 + 4 + 119 + + + 4 + 5 + 238 + + + 5 + 8 + 119 + + + 8 + 9 + 119 + + + 9 + 13 + 159 + + + 21 + 84 + 119 + + + + + + + id + kind + + + 12 + + + 4 + 5 + 1988 + + + + + + + id + seconds + + + 12 + + + 3 + 4 + 596 + + + 4 + 5 + 397 + + + 6 + 9 + 159 + + + 9 + 10 + 79 + + + 10 + 11 + 159 + + + 11 + 16 + 159 + + + 17 + 19 + 119 + + + 19 + 22 + 159 + + + 26 + 97 + 159 + + + + + + + num + id + + + 12 + + + 1 + 2 + 1750 + + + 2 + 3 + 715 + + + 3 + 4 + 357 + + + 4 + 13 + 278 + + + 13 + 51 + 198 + + + + + + + num + kind + + + 12 + + + 4 + 5 + 3301 + + + + + + + num + seconds + + + 12 + + + 3 + 4 + 1153 + + + 4 + 5 + 596 + + + 5 + 6 + 119 + + + 6 + 7 + 556 + + + 7 + 8 + 79 + + + 8 + 9 + 318 + + + 11 + 28 + 278 + + + 28 + 98 + 198 + + + + + + + kind + id + + + 12 + + + 50 + 51 + 159 + + + + + + + kind + num + + + 12 + + + 83 + 84 + 159 + + + + + + + kind + seconds + + + 12 + + + 3 + 4 + 79 + + + 132 + 133 + 39 + + + 141 + 142 + 39 + + + + + + + seconds + id + + + 12 + + + 1 + 2 + 5887 + + + 2 + 3 + 2505 + + + 3 + 4 + 1431 + + + 4 + 7 + 835 + + + 29 + 45 + 119 + + + + + + + seconds + num + + + 12 + + + 1 + 2 + 5369 + + + 2 + 3 + 2625 + + + 3 + 4 + 875 + + + 4 + 5 + 715 + + + 5 + 7 + 914 + + + 7 + 64 + 278 + + + + + + + seconds + kind + + + 12 + + + 1 + 2 + 10461 + + + 2 + 3 + 318 + + + + + + + + + diagnostic_for + 968526 + + + diagnostic + 632828 + + + compilation + 1991 + + + file_number + 104 + + + file_number_diagnostic_number + 104912 + + + + + diagnostic + compilation + + + 12 + + + 1 + 2 + 405919 + + + 2 + 3 + 151656 + + + 3 + 4 + 42237 + + + 4 + 8 + 33014 + + + + + + + diagnostic + file_number + + + 12 + + + 1 + 2 + 632828 + + + + + + + diagnostic + file_number_diagnostic_number + + + 12 + + + 1 + 2 + 561454 + + + 2 + 3 + 71164 + + + 3 + 4 + 209 + + + + + + + compilation + diagnostic + + + 12 + + + 37 + 38 + 104 + + + 38 + 39 + 104 + + + 77 + 78 + 104 + + + 79 + 80 + 104 + + + 198 + 199 + 104 + + + 222 + 223 + 104 + + + 352 + 353 + 104 + + + 353 + 354 + 104 + + + 359 + 360 + 104 + + + 418 + 419 + 104 + + + 570 + 571 + 104 + + + 756 + 757 + 628 + + + 1001 + 1002 + 209 + + + + + + + compilation + file_number + + + 12 + + + 1 + 2 + 1991 + + + + + + + compilation + file_number_diagnostic_number + + + 12 + + + 37 + 38 + 104 + + + 38 + 39 + 104 + + + 77 + 78 + 104 + + + 79 + 80 + 104 + + + 198 + 199 + 104 + + + 222 + 223 + 104 + + + 352 + 353 + 104 + + + 353 + 354 + 104 + + + 359 + 360 + 104 + + + 418 + 419 + 104 + + + 570 + 571 + 104 + + + 756 + 757 + 628 + + + 1001 + 1002 + 209 + + + + + + + file_number + diagnostic + + + 12 + + + 6038 + 6039 + 104 + + + + + + + file_number + compilation + + + 12 + + + 19 + 20 + 104 + + + + + + + file_number + file_number_diagnostic_number + + + 12 + + + 1001 + 1002 + 104 + + + + + + + file_number_diagnostic_number + diagnostic + + + 12 + + + 2 + 3 + 25677 + + + 5 + 6 + 5974 + + + 6 + 7 + 6183 + + + 7 + 8 + 17083 + + + 8 + 9 + 9327 + + + 9 + 10 + 22428 + + + 10 + 11 + 14358 + + + 11 + 13 + 3877 + + + + + + + file_number_diagnostic_number + compilation + + + 12 + + + 2 + 3 + 25677 + + + 8 + 9 + 19494 + + + 9 + 10 + 15930 + + + 10 + 13 + 6917 + + + 13 + 14 + 13624 + + + 14 + 15 + 2515 + + + 15 + 16 + 12472 + + + 16 + 20 + 8279 + + + + + + + file_number_diagnostic_number + file_number + + + 12 + + + 1 + 2 + 104912 + + + + + + + + + compilation_finished + 9980 + + + id + 9980 + + + cpu_seconds + 7181 + + + elapsed_seconds + 115 + + + + + id + cpu_seconds + + + 12 + + + 1 + 2 + 9980 + + + + + + + id + elapsed_seconds + + + 12 + + + 1 + 2 + 9980 + + + + + + + cpu_seconds + id + + + 12 + + + 1 + 2 + 5666 + + + 2 + 3 + 1063 + + + 3 + 14 + 451 + + + + + + + cpu_seconds + elapsed_seconds + + + 12 + + + 1 + 2 + 6661 + + + 2 + 3 + 520 + + + + + + + elapsed_seconds + id + + + 12 + + + 1 + 2 + 11 + + + 3 + 4 + 11 + + + 4 + 5 + 11 + + + 7 + 8 + 11 + + + 18 + 19 + 11 + + + 27 + 28 + 11 + + + 83 + 84 + 11 + + + 190 + 191 + 11 + + + 258 + 259 + 11 + + + 272 + 273 + 11 + + + + + + + elapsed_seconds + cpu_seconds + + + 12 + + + 1 + 2 + 11 + + + 3 + 4 + 11 + + + 4 + 5 + 11 + + + 7 + 8 + 11 + + + 18 + 19 + 11 + + + 25 + 26 + 11 + + + 79 + 80 + 11 + + + 135 + 136 + 11 + + + 169 + 170 + 11 + + + 225 + 226 + 11 + + + + + + + + + externalData + 130 + + + id + 65 + + + path + 10 + + + column + 21 + + + value + 130 + + + + + id + path + + + 12 + + + 1 + 2 + 65 + + + + + + + id + column + + + 12 + + + 2 + 3 + 65 + + + + + + + id + value + + + 12 + + + 2 + 3 + 65 + + + + + + + path + id + + + 12 + + + 6 + 7 + 10 + + + + + + + path + column + + + 12 + + + 2 + 3 + 10 + + + + + + + path + value + + + 12 + + + 12 + 13 + 10 + + + + + + + column + id + + + 12 + + + 6 + 7 + 21 + + + + + + + column + path + + + 12 + + + 1 + 2 + 21 + + + + + + + column + value + + + 12 + + + 6 + 7 + 21 + + + + + + + value + id + + + 12 + + + 1 + 2 + 130 + + + + + + + value + path + + + 12 + + + 1 + 2 + 130 + + + + + + + value + column + + + 12 + + + 1 + 2 + 130 + + + + + + + + + sourceLocationPrefix + 470 + + + prefix + 470 + + + + + + external_packages + 4 + + + id + 4 + + + namespace + 1 + + + package_name + 4 + + + version + 4 + + + + + id + namespace + + + 12 + + + 1 + 2 + 4 + + + + + + + id + package_name + + + 12 + + + 1 + 2 + 4 + + + + + + + id + version + + + 12 + + + 1 + 2 + 4 + + + + + + + namespace + id + + + 12 + + + 4 + 5 + 1 + + + + + + + namespace + package_name + + + 12 + + + 4 + 5 + 1 + + + + + + + namespace + version + + + 12 + + + 4 + 5 + 1 + + + + + + + package_name + id + + + 12 + + + 1 + 2 + 4 + + + + + + + package_name + namespace + + + 12 + + + 1 + 2 + 4 + + + + + + + package_name + version + + + 12 + + + 1 + 2 + 4 + + + + + + + version + id + + + 12 + + + 1 + 2 + 4 + + + + + + + version + namespace + + + 12 + + + 1 + 2 + 4 + + + + + + + version + package_name + + + 12 + + + 1 + 2 + 4 + + + + + + + + + header_to_external_package + 92 + + + fileid + 92 + + + package + 4 + + + + + fileid + package + + + 12 + + + 1 + 2 + 92 + + + + + + + package + fileid + + + 12 + + + 1 + 2 + 1 + + + 5 + 6 + 1 + + + 6 + 7 + 1 + + + 80 + 81 + 1 + + + + + + + + + svnentries + 575525 + + + id + 575525 + + + revision + 575525 + + + author + 19539 + + + revisionDate + 547759 + + + changeSize + 1 + + + + + id + revision + + + 12 + + + 1 + 2 + 575525 + + + + + + + id + author + + + 12 + + + 1 + 2 + 575525 + + + + + + + id + revisionDate + + + 12 + + + 1 + 2 + 575525 + + + + + + + id + changeSize + + + 12 + + + 1 + 2 + 575525 + + + + + + + revision + id + + + 12 + + + 1 + 2 + 575525 + + + + + + + revision + author + + + 12 + + + 1 + 2 + 575525 + + + + + + + revision + revisionDate + + + 12 + + + 1 + 2 + 575525 + + + + + + + revision + changeSize + + + 12 + + + 1 + 2 + 575525 + + + + + + + author + id + + + 12 + + + 1 + 2 + 7913 + + + 2 + 3 + 2531 + + + 3 + 4 + 1388 + + + 4 + 6 + 1523 + + + 6 + 10 + 1529 + + + 10 + 20 + 1509 + + + 20 + 52 + 1488 + + + 52 + 568 + 1466 + + + 569 + 16582 + 192 + + + + + + + author + revision + + + 12 + + + 1 + 2 + 7913 + + + 2 + 3 + 2531 + + + 3 + 4 + 1388 + + + 4 + 6 + 1523 + + + 6 + 10 + 1529 + + + 10 + 20 + 1509 + + + 20 + 52 + 1488 + + + 52 + 568 + 1466 + + + 569 + 16582 + 192 + + + + + + + author + revisionDate + + + 12 + + + 1 + 2 + 7996 + + + 2 + 3 + 2509 + + + 3 + 4 + 1379 + + + 4 + 6 + 1520 + + + 6 + 10 + 1529 + + + 10 + 20 + 1507 + + + 20 + 52 + 1474 + + + 52 + 662 + 1466 + + + 663 + 16573 + 159 + + + + + + + author + changeSize + + + 12 + + + 1 + 2 + 19539 + + + + + + + revisionDate + id + + + 12 + + + 1 + 2 + 531878 + + + 2 + 100 + 15881 + + + + + + + revisionDate + revision + + + 12 + + + 1 + 2 + 531878 + + + 2 + 100 + 15881 + + + + + + + revisionDate + author + + + 12 + + + 1 + 2 + 542505 + + + 2 + 17 + 5254 + + + + + + + revisionDate + changeSize + + + 12 + + + 1 + 2 + 547759 + + + + + + + changeSize + id + + + 12 + + + 575525 + 575526 + 1 + + + + + + + changeSize + revision + + + 12 + + + 575525 + 575526 + 1 + + + + + + + changeSize + author + + + 12 + + + 19539 + 19540 + 1 + + + + + + + changeSize + revisionDate + + + 12 + + + 547759 + 547760 + 1 + + + + + + + + + svnaffectedfiles + 1314068 + + + id + 531628 + + + file + 90924 + + + action + 1 + + + + + id + file + + + 12 + + + 1 + 2 + 337698 + + + 2 + 3 + 77525 + + + 3 + 4 + 43024 + + + 4 + 7 + 46689 + + + 7 + 16635 + 26692 + + + + + + + id + action + + + 12 + + + 1 + 2 + 531628 + + + + + + + file + id + + + 12 + + + 1 + 2 + 11819 + + + 2 + 3 + 18230 + + + 3 + 4 + 9501 + + + 4 + 5 + 6656 + + + 5 + 6 + 5012 + + + 6 + 8 + 7103 + + + 8 + 11 + 6788 + + + 11 + 16 + 6996 + + + 16 + 26 + 7180 + + + 26 + 54 + 6824 + + + 54 + 3572 + 4815 + + + + + + + file + action + + + 12 + + + 1 + 2 + 90924 + + + + + + + action + id + + + 12 + + + 531628 + 531629 + 1 + + + + + + + action + file + + + 12 + + + 90924 + 90925 + 1 + + + + + + + + + svnentrymsg + 575525 + + + id + 575525 + + + message + 568305 + + + + + id + message + + + 12 + + + 1 + 2 + 575525 + + + + + + + message + id + + + 12 + + + 1 + 2 + 565381 + + + 2 + 142 + 2924 + + + + + + + + + svnchurn + 46790 + + + commit + 22361 + + + file + 16124 + + + addedLines + 910 + + + deletedLines + 787 + + + + + commit + file + + + 12 + + + 1 + 2 + 15208 + + + 2 + 3 + 3101 + + + 3 + 4 + 1746 + + + 4 + 8 + 1774 + + + 8 + 246 + 532 + + + + + + + commit + addedLines + + + 12 + + + 1 + 2 + 16074 + + + 2 + 3 + 3323 + + + 3 + 4 + 1561 + + + 4 + 118 + 1403 + + + + + + + commit + deletedLines + + + 12 + + + 1 + 2 + 16799 + + + 2 + 3 + 3286 + + + 3 + 5 + 1763 + + + 5 + 113 + 513 + + + + + + + file + commit + + + 12 + + + 1 + 2 + 8618 + + + 2 + 3 + 2956 + + + 3 + 4 + 1426 + + + 4 + 6 + 1364 + + + 6 + 12 + 1210 + + + 12 + 448 + 550 + + + + + + + file + addedLines + + + 12 + + + 1 + 2 + 9240 + + + 2 + 3 + 3129 + + + 3 + 4 + 1393 + + + 4 + 6 + 1239 + + + 6 + 59 + 1123 + + + + + + + file + deletedLines + + + 12 + + + 1 + 2 + 9525 + + + 2 + 3 + 3192 + + + 3 + 4 + 1401 + + + 4 + 7 + 1387 + + + 7 + 70 + 619 + + + + + + + addedLines + commit + + + 12 + + + 1 + 2 + 446 + + + 2 + 3 + 133 + + + 3 + 4 + 70 + + + 4 + 6 + 68 + + + 6 + 12 + 70 + + + 12 + 57 + 69 + + + 57 + 6874 + 54 + + + + + + + addedLines + file + + + 12 + + + 1 + 2 + 445 + + + 2 + 3 + 132 + + + 3 + 4 + 69 + + + 4 + 6 + 68 + + + 6 + 12 + 73 + + + 12 + 58 + 69 + + + 58 + 6663 + 54 + + + + + + + addedLines + deletedLines + + + 12 + + + 1 + 2 + 621 + + + 2 + 3 + 96 + + + 3 + 7 + 81 + + + 7 + 34 + 70 + + + 34 + 727 + 42 + + + + + + + deletedLines + commit + + + 12 + + + 1 + 2 + 439 + + + 2 + 3 + 116 + + + 3 + 4 + 48 + + + 4 + 8 + 67 + + + 8 + 28 + 60 + + + 28 + 6794 + 57 + + + + + + + deletedLines + file + + + 12 + + + 1 + 2 + 437 + + + 2 + 3 + 113 + + + 3 + 4 + 49 + + + 4 + 7 + 61 + + + 7 + 19 + 60 + + + 19 + 770 + 60 + + + 985 + 7318 + 7 + + + + + + + deletedLines + addedLines + + + 12 + + + 1 + 2 + 545 + + + 2 + 3 + 72 + + + 3 + 7 + 69 + + + 7 + 30 + 60 + + + 30 + 871 + 41 + + + + + + + + + locations_default + 30128761 + + + id + 30128761 + + + container + 140184 + + + startLine + 2114992 + + + startColumn + 37162 + + + endLine + 2117814 + + + endColumn + 48452 + + + + + id + container + + + 12 + + + 1 + 2 + 30128761 + + + + + + + id + startLine + + + 12 + + + 1 + 2 + 30128761 + + + + + + + id + startColumn + + + 12 + + + 1 + 2 + 30128761 + + + + + + + id + endLine + + + 12 + + + 1 + 2 + 30128761 + + + + + + + id + endColumn + + + 12 + + + 1 + 2 + 30128761 + + + + + + + container + id + + + 12 + + + 1 + 2 + 16464 + + + 2 + 12 + 10819 + + + 13 + 20 + 11760 + + + 21 + 36 + 11289 + + + 36 + 55 + 11289 + + + 55 + 77 + 10819 + + + 77 + 102 + 10819 + + + 102 + 149 + 10819 + + + 149 + 227 + 11289 + + + 228 + 350 + 11289 + + + 358 + 628 + 10819 + + + 671 + 1926 + 10819 + + + 2168 + 2380 + 1881 + + + + + + + container + startLine + + + 12 + + + 1 + 2 + 16464 + + + 2 + 9 + 10819 + + + 9 + 16 + 11760 + + + 16 + 25 + 11289 + + + 25 + 40 + 10819 + + + 40 + 57 + 10819 + + + 58 + 72 + 10819 + + + 73 + 103 + 11289 + + + 106 + 141 + 11760 + + + 148 + 226 + 11289 + + + 226 + 373 + 10819 + + + 381 + 1456 + 10819 + + + 1464 + 1613 + 1411 + + + + + + + container + startColumn + + + 12 + + + 1 + 2 + 16464 + + + 2 + 4 + 8937 + + + 4 + 5 + 7526 + + + 5 + 6 + 7526 + + + 6 + 8 + 11760 + + + 8 + 13 + 12230 + + + 13 + 17 + 10819 + + + 17 + 25 + 11289 + + + 25 + 31 + 11760 + + + 31 + 38 + 10819 + + + 38 + 52 + 10819 + + + 52 + 64 + 10819 + + + 65 + 77 + 9408 + + + + + + + container + endLine + + + 12 + + + 1 + 2 + 16464 + + + 2 + 9 + 10819 + + + 9 + 16 + 11760 + + + 16 + 25 + 11289 + + + 25 + 40 + 10819 + + + 40 + 57 + 10819 + + + 58 + 71 + 10819 + + + 72 + 98 + 10819 + + + 101 + 140 + 11760 + + + 140 + 224 + 10819 + + + 224 + 360 + 10819 + + + 364 + 1185 + 10819 + + + 1254 + 1610 + 2352 + + + + + + + container + endColumn + + + 12 + + + 1 + 2 + 16464 + + + 2 + 10 + 11289 + + + 10 + 14 + 10819 + + + 14 + 21 + 11289 + + + 22 + 31 + 11289 + + + 31 + 39 + 12701 + + + 39 + 48 + 12230 + + + 48 + 56 + 11760 + + + 56 + 64 + 11760 + + + 64 + 72 + 10819 + + + 72 + 77 + 11289 + + + 77 + 90 + 8467 + + + + + + + startLine + id + + + 12 + + + 1 + 2 + 581905 + + + 2 + 3 + 318001 + + + 3 + 4 + 199456 + + + 4 + 6 + 160882 + + + 6 + 10 + 190048 + + + 10 + 16 + 166057 + + + 16 + 25 + 168879 + + + 25 + 46 + 163704 + + + 46 + 169 + 159000 + + + 170 + 299 + 7056 + + + + + + + startLine + container + + + 12 + + + 1 + 2 + 869799 + + + 2 + 3 + 280838 + + + 3 + 5 + 191459 + + + 5 + 8 + 181110 + + + 8 + 12 + 162293 + + + 12 + 18 + 166527 + + + 18 + 39 + 159941 + + + 39 + 299 + 103021 + + + + + + + startLine + startColumn + + + 12 + + + 1 + 2 + 612482 + + + 2 + 3 + 313297 + + + 3 + 4 + 202749 + + + 4 + 6 + 184403 + + + 6 + 9 + 180639 + + + 9 + 13 + 166997 + + + 13 + 19 + 173583 + + + 19 + 29 + 167468 + + + 29 + 52 + 113370 + + + + + + + startLine + endLine + + + 12 + + + 1 + 2 + 1545788 + + + 2 + 3 + 351401 + + + 3 + 5 + 164645 + + + 5 + 16 + 53157 + + + + + + + startLine + endColumn + + + 12 + + + 1 + 2 + 586609 + + + 2 + 3 + 318942 + + + 3 + 4 + 201808 + + + 4 + 6 + 167468 + + + 6 + 9 + 160412 + + + 9 + 14 + 178287 + + + 14 + 21 + 176406 + + + 21 + 32 + 163234 + + + 32 + 61 + 159000 + + + 61 + 66 + 2822 + + + + + + + startColumn + id + + + 12 + + + 1 + 31 + 2822 + + + 42 + 85 + 2822 + + + 86 + 128 + 2822 + + + 129 + 229 + 2822 + + + 248 + 292 + 2822 + + + 292 + 360 + 2822 + + + 376 + 459 + 2822 + + + 476 + 558 + 2822 + + + 565 + 620 + 2822 + + + 626 + 699 + 2822 + + + 699 + 796 + 2822 + + + 819 + 1546 + 2822 + + + 1705 + 5645 + 2822 + + + 15306 + 15307 + 470 + + + + + + + startColumn + container + + + 12 + + + 1 + 18 + 2822 + + + 23 + 35 + 3292 + + + 38 + 43 + 2822 + + + 44 + 61 + 2822 + + + 65 + 73 + 2822 + + + 73 + 83 + 2822 + + + 83 + 95 + 2822 + + + 96 + 101 + 3292 + + + 101 + 105 + 3292 + + + 106 + 111 + 2822 + + + 111 + 123 + 2822 + + + 127 + 153 + 2822 + + + 169 + 299 + 1881 + + + + + + + startColumn + startLine + + + 12 + + + 1 + 19 + 2822 + + + 30 + 72 + 2822 + + + 83 + 122 + 2822 + + + 122 + 205 + 2822 + + + 214 + 261 + 2822 + + + 264 + 322 + 2822 + + + 325 + 380 + 2822 + + + 403 + 436 + 2822 + + + 454 + 474 + 2822 + + + 477 + 514 + 2822 + + + 517 + 586 + 2822 + + + 587 + 831 + 2822 + + + 1116 + 2197 + 2822 + + + 2387 + 2388 + 470 + + + + + + + startColumn + endLine + + + 12 + + + 1 + 19 + 2822 + + + 30 + 72 + 2822 + + + 83 + 122 + 2822 + + + 122 + 205 + 2822 + + + 214 + 261 + 2822 + + + 264 + 322 + 2822 + + + 325 + 380 + 2822 + + + 403 + 435 + 2822 + + + 454 + 474 + 2822 + + + 476 + 513 + 2822 + + + 520 + 585 + 2822 + + + 587 + 831 + 2822 + + + 1121 + 2205 + 2822 + + + 2383 + 2384 + 470 + + + + + + + startColumn + endColumn + + + 12 + + + 1 + 7 + 2822 + + + 7 + 11 + 3292 + + + 11 + 16 + 3292 + + + 16 + 22 + 2822 + + + 22 + 24 + 2352 + + + 24 + 27 + 3292 + + + 28 + 33 + 2822 + + + 33 + 40 + 3292 + + + 40 + 43 + 2822 + + + 43 + 49 + 2822 + + + 49 + 54 + 2822 + + + 54 + 74 + 2822 + + + 75 + 86 + 1881 + + + + + + + endLine + id + + + 12 + + + 1 + 2 + 589902 + + + 2 + 3 + 312356 + + + 3 + 4 + 198986 + + + 4 + 6 + 161352 + + + 6 + 10 + 189577 + + + 10 + 16 + 163704 + + + 16 + 25 + 171231 + + + 25 + 45 + 159471 + + + 45 + 160 + 159941 + + + 160 + 299 + 11289 + + + + + + + endLine + container + + + 12 + + + 1 + 2 + 881560 + + + 2 + 3 + 270019 + + + 3 + 4 + 123249 + + + 4 + 6 + 142065 + + + 6 + 10 + 195693 + + + 10 + 15 + 168409 + + + 15 + 26 + 165586 + + + 26 + 120 + 159471 + + + 121 + 299 + 11760 + + + + + + + endLine + startLine + + + 12 + + + 1 + 2 + 1538732 + + + 2 + 3 + 349048 + + + 3 + 5 + 172172 + + + 5 + 10 + 57861 + + + + + + + endLine + startColumn + + + 12 + + + 1 + 2 + 621890 + + + 2 + 3 + 304359 + + + 3 + 4 + 204631 + + + 4 + 6 + 186755 + + + 6 + 9 + 177817 + + + 9 + 13 + 169349 + + + 13 + 19 + 174524 + + + 19 + 29 + 162764 + + + 29 + 52 + 115722 + + + + + + + endLine + endColumn + + + 12 + + + 1 + 2 + 596488 + + + 2 + 3 + 311415 + + + 3 + 4 + 198986 + + + 4 + 6 + 171701 + + + 6 + 9 + 157589 + + + 9 + 14 + 173583 + + + 14 + 21 + 180169 + + + 21 + 32 + 165116 + + + 32 + 60 + 159000 + + + 60 + 65 + 3763 + + + + + + + endColumn + id + + + 12 + + + 1 + 2 + 5174 + + + 2 + 8 + 3763 + + + 9 + 186 + 3763 + + + 196 + 295 + 3763 + + + 298 + 498 + 3763 + + + 503 + 553 + 3763 + + + 563 + 634 + 3763 + + + 639 + 762 + 3763 + + + 763 + 871 + 3763 + + + 879 + 1081 + 3763 + + + 1083 + 1286 + 3763 + + + 1309 + 1590 + 3763 + + + 1682 + 2419 + 1881 + + + + + + + endColumn + container + + + 12 + + + 1 + 2 + 5644 + + + 2 + 6 + 3763 + + + 6 + 65 + 3763 + + + 70 + 100 + 3763 + + + 100 + 111 + 3763 + + + 112 + 122 + 3763 + + + 122 + 134 + 3763 + + + 139 + 152 + 3763 + + + 152 + 160 + 4233 + + + 160 + 172 + 3763 + + + 172 + 176 + 3763 + + + 176 + 208 + 3763 + + + 240 + 299 + 940 + + + + + + + endColumn + startLine + + + 12 + + + 1 + 2 + 5644 + + + 2 + 8 + 3763 + + + 9 + 106 + 3763 + + + 155 + 241 + 3763 + + + 253 + 335 + 3763 + + + 340 + 426 + 3763 + + + 437 + 488 + 3763 + + + 488 + 574 + 3763 + + + 575 + 628 + 3763 + + + 630 + 698 + 4233 + + + 701 + 817 + 3763 + + + 843 + 1107 + 3763 + + + 1160 + 1174 + 940 + + + + + + + endColumn + startColumn + + + 12 + + + 1 + 2 + 6115 + + + 2 + 4 + 3763 + + + 4 + 8 + 4233 + + + 8 + 15 + 3763 + + + 15 + 23 + 3763 + + + 23 + 29 + 3763 + + + 29 + 35 + 4233 + + + 35 + 39 + 3292 + + + 39 + 42 + 3763 + + + 42 + 44 + 2822 + + + 44 + 46 + 3763 + + + 46 + 49 + 3763 + + + 49 + 53 + 1411 + + + + + + + endColumn + endLine + + + 12 + + + 1 + 2 + 5644 + + + 2 + 8 + 3763 + + + 9 + 156 + 3763 + + + 159 + 240 + 3763 + + + 251 + 334 + 3763 + + + 342 + 430 + 3763 + + + 435 + 490 + 4233 + + + 504 + 576 + 3763 + + + 576 + 631 + 3763 + + + 635 + 702 + 3763 + + + 702 + 813 + 3763 + + + 838 + 1109 + 3763 + + + 1161 + 1181 + 940 + + + + + + + + + locations_stmt + 3805462 + + + id + 3805462 + + + container + 3076 + + + startLine + 199416 + + + startColumn + 1866 + + + endLine + 193694 + + + endColumn + 2358 + + + + + id + container + + + 12 + + + 1 + 2 + 3805462 + + + + + + + id + startLine + + + 12 + + + 1 + 2 + 3805462 + + + + + + + id + startColumn + + + 12 + + + 1 + 2 + 3805462 + + + + + + + id + endLine + + + 12 + + + 1 + 2 + 3805462 + + + + + + + id + endColumn + + + 12 + + + 1 + 2 + 3805462 + + + + + + + container + id + + + 12 + + + 1 + 13 + 246 + + + 16 + 48 + 246 + + + 61 + 175 + 246 + + + 176 + 417 + 246 + + + 436 + 608 + 246 + + + 621 + 797 + 246 + + + 848 + 1139 + 246 + + + 1158 + 1417 + 246 + + + 1453 + 1715 + 246 + + + 1771 + 2252 + 246 + + + 2282 + 2669 + 246 + + + 2736 + 3751 + 246 + + + 3768 + 4993 + 123 + + + + + + + container + startLine + + + 12 + + + 1 + 13 + 246 + + + 16 + 47 + 246 + + + 48 + 161 + 246 + + + 169 + 371 + 266 + + + 393 + 586 + 246 + + + 602 + 783 + 246 + + + 845 + 1120 + 246 + + + 1131 + 1390 + 246 + + + 1394 + 1692 + 246 + + + 1726 + 2208 + 246 + + + 2225 + 2680 + 246 + + + 2777 + 3643 + 246 + + + 3885 + 4846 + 102 + + + + + + + container + startColumn + + + 12 + + + 1 + 3 + 225 + + + 3 + 7 + 266 + + + 7 + 9 + 205 + + + 9 + 11 + 246 + + + 11 + 13 + 225 + + + 13 + 14 + 225 + + + 14 + 16 + 246 + + + 16 + 17 + 164 + + + 17 + 19 + 205 + + + 19 + 21 + 184 + + + 21 + 23 + 246 + + + 23 + 29 + 246 + + + 29 + 43 + 246 + + + 48 + 60 + 143 + + + + + + + container + endLine + + + 12 + + + 1 + 11 + 246 + + + 12 + 34 + 246 + + + 43 + 132 + 246 + + + 134 + 282 + 246 + + + 294 + 452 + 246 + + + 459 + 601 + 246 + + + 609 + 831 + 246 + + + 838 + 1062 + 246 + + + 1071 + 1265 + 246 + + + 1323 + 1679 + 246 + + + 1688 + 2006 + 246 + + + 2044 + 2758 + 246 + + + 2776 + 3873 + 123 + + + + + + + container + endColumn + + + 12 + + + 1 + 8 + 246 + + + 8 + 21 + 246 + + + 22 + 45 + 246 + + + 45 + 56 + 246 + + + 56 + 63 + 266 + + + 63 + 67 + 246 + + + 67 + 69 + 246 + + + 69 + 71 + 225 + + + 71 + 72 + 246 + + + 72 + 74 + 246 + + + 74 + 76 + 246 + + + 76 + 80 + 246 + + + 81 + 96 + 123 + + + + + + + startLine + id + + + 12 + + + 1 + 2 + 21494 + + + 2 + 3 + 15259 + + + 3 + 4 + 12449 + + + 4 + 6 + 14418 + + + 6 + 8 + 12490 + + + 8 + 11 + 16674 + + + 11 + 16 + 17228 + + + 16 + 22 + 15320 + + + 22 + 29 + 16941 + + + 29 + 37 + 17330 + + + 37 + 45 + 15054 + + + 45 + 56 + 16141 + + + 56 + 73 + 8614 + + + + + + + startLine + container + + + 12 + + + 1 + 2 + 22253 + + + 2 + 3 + 15689 + + + 3 + 4 + 12654 + + + 4 + 6 + 14356 + + + 6 + 8 + 12695 + + + 8 + 11 + 17535 + + + 11 + 16 + 16325 + + + 16 + 22 + 16182 + + + 22 + 29 + 16920 + + + 29 + 36 + 15956 + + + 36 + 44 + 16284 + + + 44 + 54 + 15607 + + + 54 + 69 + 6952 + + + + + + + startLine + startColumn + + + 12 + + + 1 + 2 + 26765 + + + 2 + 3 + 20796 + + + 3 + 4 + 16776 + + + 4 + 5 + 16038 + + + 5 + 6 + 17392 + + + 6 + 7 + 19812 + + + 7 + 8 + 22704 + + + 8 + 9 + 20345 + + + 9 + 10 + 14972 + + + 10 + 12 + 16612 + + + 12 + 18 + 7198 + + + + + + + startLine + endLine + + + 12 + + + 1 + 2 + 34517 + + + 2 + 3 + 25739 + + + 3 + 4 + 18397 + + + 4 + 5 + 16182 + + + 5 + 6 + 12757 + + + 6 + 7 + 11998 + + + 7 + 8 + 10152 + + + 8 + 9 + 10952 + + + 9 + 10 + 10706 + + + 10 + 11 + 10500 + + + 11 + 12 + 10152 + + + 12 + 14 + 15751 + + + 14 + 24 + 11608 + + + + + + + startLine + endColumn + + + 12 + + + 1 + 2 + 22089 + + + 2 + 3 + 16161 + + + 3 + 4 + 12921 + + + 4 + 6 + 16038 + + + 6 + 8 + 14664 + + + 8 + 10 + 13167 + + + 10 + 14 + 18253 + + + 14 + 18 + 16982 + + + 18 + 22 + 17535 + + + 22 + 26 + 18458 + + + 26 + 30 + 16346 + + + 30 + 36 + 15197 + + + 36 + 42 + 1599 + + + + + + + startColumn + id + + + 12 + + + 1 + 2 + 225 + + + 2 + 3 + 143 + + + 3 + 7 + 164 + + + 7 + 12 + 143 + + + 12 + 20 + 164 + + + 21 + 53 + 143 + + + 54 + 74 + 143 + + + 78 + 92 + 143 + + + 92 + 134 + 143 + + + 134 + 228 + 143 + + + 228 + 2062 + 143 + + + 3245 + 40863 + 143 + + + 53257 + 53258 + 20 + + + + + + + startColumn + container + + + 12 + + + 1 + 2 + 287 + + + 2 + 3 + 102 + + + 3 + 5 + 164 + + + 5 + 8 + 164 + + + 8 + 13 + 143 + + + 13 + 18 + 143 + + + 18 + 22 + 143 + + + 22 + 24 + 143 + + + 24 + 29 + 143 + + + 33 + 42 + 143 + + + 47 + 109 + 143 + + + 116 + 150 + 143 + + + + + + + startColumn + startLine + + + 12 + + + 1 + 2 + 225 + + + 2 + 3 + 143 + + + 3 + 7 + 164 + + + 7 + 12 + 143 + + + 12 + 20 + 164 + + + 21 + 53 + 143 + + + 54 + 74 + 143 + + + 77 + 88 + 143 + + + 90 + 131 + 143 + + + 134 + 224 + 143 + + + 226 + 1699 + 143 + + + 2430 + 7900 + 143 + + + 8302 + 8303 + 20 + + + + + + + startColumn + endLine + + + 12 + + + 1 + 2 + 225 + + + 2 + 3 + 143 + + + 3 + 7 + 164 + + + 7 + 12 + 143 + + + 12 + 20 + 164 + + + 21 + 53 + 143 + + + 54 + 74 + 143 + + + 77 + 88 + 143 + + + 90 + 130 + 143 + + + 134 + 221 + 143 + + + 226 + 1414 + 143 + + + 2290 + 7741 + 143 + + + 8096 + 8097 + 20 + + + + + + + startColumn + endColumn + + + 12 + + + 1 + 2 + 287 + + + 2 + 3 + 143 + + + 3 + 4 + 82 + + + 4 + 5 + 164 + + + 5 + 8 + 164 + + + 8 + 11 + 143 + + + 11 + 15 + 164 + + + 15 + 19 + 143 + + + 19 + 26 + 143 + + + 28 + 35 + 143 + + + 41 + 69 + 143 + + + 70 + 104 + 143 + + + + + + + endLine + id + + + 12 + + + 1 + 2 + 17371 + + + 2 + 3 + 14377 + + + 3 + 4 + 11464 + + + 4 + 6 + 15566 + + + 6 + 8 + 12469 + + + 8 + 11 + 15423 + + + 11 + 15 + 14602 + + + 15 + 21 + 16059 + + + 21 + 27 + 15382 + + + 27 + 34 + 14910 + + + 34 + 42 + 15710 + + + 42 + 52 + 15977 + + + 52 + 130 + 14377 + + + + + + + endLine + container + + + 12 + + + 1 + 2 + 24898 + + + 2 + 3 + 16100 + + + 3 + 4 + 12736 + + + 4 + 6 + 15628 + + + 6 + 8 + 14972 + + + 8 + 11 + 15854 + + + 11 + 16 + 17412 + + + 16 + 20 + 14561 + + + 20 + 26 + 17125 + + + 26 + 32 + 16223 + + + 32 + 39 + 14828 + + + 39 + 59 + 13351 + + + + + + + endLine + startLine + + + 12 + + + 1 + 2 + 32405 + + + 2 + 3 + 23709 + + + 3 + 4 + 18417 + + + 4 + 5 + 15115 + + + 5 + 6 + 13844 + + + 6 + 7 + 11649 + + + 7 + 8 + 11711 + + + 8 + 9 + 10890 + + + 9 + 10 + 10152 + + + 10 + 12 + 17925 + + + 12 + 15 + 17679 + + + 15 + 100 + 10193 + + + + + + + endLine + startColumn + + + 12 + + + 1 + 2 + 24898 + + + 2 + 3 + 20345 + + + 3 + 4 + 16797 + + + 4 + 5 + 17761 + + + 5 + 6 + 18540 + + + 6 + 7 + 20386 + + + 7 + 8 + 22376 + + + 8 + 9 + 18704 + + + 9 + 10 + 12900 + + + 10 + 12 + 14992 + + + 12 + 18 + 5988 + + + + + + + endLine + endColumn + + + 12 + + + 1 + 2 + 24652 + + + 2 + 3 + 16592 + + + 3 + 4 + 12510 + + + 4 + 6 + 17781 + + + 6 + 8 + 15300 + + + 8 + 10 + 12798 + + + 10 + 13 + 14377 + + + 13 + 16 + 14992 + + + 16 + 19 + 14623 + + + 19 + 22 + 14008 + + + 22 + 26 + 17084 + + + 26 + 31 + 15300 + + + 31 + 39 + 3671 + + + + + + + endColumn + id + + + 12 + + + 1 + 2 + 184 + + + 2 + 4 + 184 + + + 4 + 7 + 164 + + + 7 + 16 + 184 + + + 23 + 133 + 184 + + + 151 + 393 + 184 + + + 394 + 681 + 184 + + + 708 + 1137 + 184 + + + 1138 + 1674 + 184 + + + 1885 + 2795 + 184 + + + 2939 + 4095 + 184 + + + 4142 + 4771 + 184 + + + 5032 + 15460 + 164 + + + + + + + endColumn + container + + + 12 + + + 1 + 2 + 205 + + + 2 + 3 + 184 + + + 3 + 6 + 184 + + + 6 + 21 + 184 + + + 31 + 70 + 205 + + + 74 + 96 + 184 + + + 97 + 108 + 184 + + + 108 + 114 + 184 + + + 115 + 118 + 164 + + + 118 + 122 + 205 + + + 122 + 123 + 123 + + + 123 + 125 + 184 + + + 125 + 149 + 164 + + + + + + + endColumn + startLine + + + 12 + + + 1 + 2 + 184 + + + 2 + 4 + 184 + + + 4 + 7 + 164 + + + 7 + 15 + 184 + + + 22 + 130 + 184 + + + 145 + 378 + 184 + + + 385 + 652 + 184 + + + 666 + 964 + 184 + + + 999 + 1431 + 184 + + + 1587 + 2171 + 184 + + + 2264 + 2917 + 184 + + + 2947 + 3215 + 184 + + + 3417 + 5822 + 164 + + + + + + + endColumn + startColumn + + + 12 + + + 1 + 2 + 205 + + + 2 + 3 + 164 + + + 3 + 5 + 205 + + + 5 + 8 + 184 + + + 8 + 12 + 184 + + + 12 + 14 + 123 + + + 14 + 16 + 184 + + + 16 + 19 + 123 + + + 19 + 21 + 164 + + + 21 + 23 + 184 + + + 23 + 25 + 184 + + + 25 + 28 + 184 + + + 28 + 33 + 205 + + + 45 + 57 + 61 + + + + + + + endColumn + endLine + + + 12 + + + 1 + 2 + 205 + + + 2 + 4 + 164 + + + 4 + 7 + 205 + + + 7 + 27 + 184 + + + 40 + 132 + 184 + + + 142 + 329 + 184 + + + 366 + 583 + 184 + + + 613 + 968 + 184 + + + 1056 + 1409 + 184 + + + 1420 + 2035 + 184 + + + 2066 + 2627 + 184 + + + 2651 + 3073 + 184 + + + 3086 + 4522 + 123 + + + + + + + + + locations_expr + 13128112 + + + id + 13128112 + + + container + 4348 + + + startLine + 191499 + + + startColumn + 2461 + + + endLine + 191479 + + + endColumn + 2789 + + + + + id + container + + + 12 + + + 1 + 2 + 13128112 + + + + + + + id + startLine + + + 12 + + + 1 + 2 + 13128112 + + + + + + + id + startColumn + + + 12 + + + 1 + 2 + 13128112 + + + + + + + id + endLine + + + 12 + + + 1 + 2 + 13128112 + + + + + + + id + endColumn + + + 12 + + + 1 + 2 + 13128112 + + + + + + + container + id + + + 12 + + + 1 + 2 + 369 + + + 2 + 6 + 266 + + + 6 + 10 + 348 + + + 10 + 34 + 328 + + + 46 + 136 + 328 + + + 166 + 594 + 328 + + + 677 + 1614 + 328 + + + 1623 + 2416 + 328 + + + 2490 + 3669 + 328 + + + 3705 + 5161 + 328 + + + 5341 + 6838 + 328 + + + 7344 + 9012 + 328 + + + 9073 + 13259 + 328 + + + 13617 + 18812 + 82 + + + + + + + container + startLine + + + 12 + + + 1 + 2 + 451 + + + 2 + 5 + 348 + + + 5 + 10 + 328 + + + 10 + 22 + 328 + + + 24 + 87 + 328 + + + 97 + 207 + 328 + + + 213 + 437 + 328 + + + 454 + 689 + 328 + + + 719 + 977 + 328 + + + 997 + 1292 + 328 + + + 1332 + 1781 + 328 + + + 1851 + 2320 + 328 + + + 2491 + 4241 + 266 + + + + + + + container + startColumn + + + 12 + + + 1 + 2 + 451 + + + 2 + 5 + 389 + + + 5 + 10 + 369 + + + 10 + 27 + 328 + + + 27 + 55 + 369 + + + 55 + 64 + 348 + + + 64 + 67 + 246 + + + 67 + 69 + 369 + + + 69 + 70 + 307 + + + 70 + 71 + 184 + + + 71 + 72 + 307 + + + 72 + 74 + 266 + + + 74 + 83 + 328 + + + 90 + 108 + 82 + + + + + + + container + endLine + + + 12 + + + 1 + 2 + 451 + + + 2 + 5 + 348 + + + 5 + 10 + 328 + + + 10 + 22 + 328 + + + 24 + 87 + 328 + + + 97 + 207 + 328 + + + 214 + 437 + 328 + + + 454 + 691 + 328 + + + 719 + 978 + 328 + + + 998 + 1293 + 328 + + + 1332 + 1785 + 328 + + + 1855 + 2324 + 328 + + + 2500 + 4416 + 266 + + + + + + + container + endColumn + + + 12 + + + 1 + 2 + 410 + + + 2 + 5 + 389 + + + 5 + 9 + 328 + + + 9 + 29 + 328 + + + 30 + 55 + 328 + + + 55 + 69 + 389 + + + 69 + 73 + 348 + + + 73 + 75 + 328 + + + 75 + 76 + 123 + + + 76 + 77 + 410 + + + 77 + 79 + 348 + + + 79 + 83 + 328 + + + 83 + 116 + 287 + + + + + + + startLine + id + + + 12 + + + 1 + 5 + 16079 + + + 5 + 9 + 16448 + + + 9 + 15 + 15997 + + + 15 + 23 + 15074 + + + 23 + 32 + 15115 + + + 32 + 44 + 14972 + + + 44 + 60 + 14726 + + + 60 + 80 + 14808 + + + 80 + 103 + 14582 + + + 103 + 130 + 14787 + + + 130 + 159 + 14561 + + + 159 + 194 + 14561 + + + 194 + 302 + 9783 + + + + + + + startLine + container + + + 12 + + + 1 + 2 + 23463 + + + 2 + 3 + 15587 + + + 3 + 4 + 11321 + + + 4 + 6 + 16325 + + + 6 + 8 + 13597 + + + 8 + 11 + 16407 + + + 11 + 16 + 17330 + + + 16 + 21 + 16407 + + + 21 + 28 + 16612 + + + 28 + 35 + 15956 + + + 35 + 43 + 15936 + + + 43 + 60 + 12551 + + + + + + + startLine + startColumn + + + 12 + + + 1 + 4 + 15936 + + + 4 + 7 + 17494 + + + 7 + 11 + 16653 + + + 11 + 16 + 17371 + + + 16 + 21 + 17474 + + + 21 + 26 + 15033 + + + 26 + 31 + 16141 + + + 31 + 36 + 17699 + + + 36 + 40 + 15792 + + + 40 + 44 + 16530 + + + 44 + 49 + 16592 + + + 49 + 63 + 8778 + + + + + + + startLine + endLine + + + 12 + + + 1 + 2 + 101769 + + + 2 + 3 + 44567 + + + 3 + 4 + 27503 + + + 4 + 6 + 14541 + + + 6 + 23 + 3117 + + + + + + + startLine + endColumn + + + 12 + + + 1 + 4 + 16920 + + + 4 + 7 + 16612 + + + 7 + 11 + 16387 + + + 11 + 16 + 16182 + + + 16 + 21 + 16407 + + + 21 + 27 + 16735 + + + 27 + 33 + 16407 + + + 33 + 38 + 14459 + + + 38 + 43 + 15505 + + + 43 + 47 + 14746 + + + 47 + 52 + 16715 + + + 52 + 65 + 14377 + + + 66 + 70 + 41 + + + + + + + startColumn + id + + + 12 + + + 1 + 2 + 307 + + + 2 + 4 + 184 + + + 4 + 8 + 205 + + + 8 + 26 + 205 + + + 43 + 251 + 184 + + + 279 + 840 + 184 + + + 951 + 1889 + 184 + + + 2097 + 4180 + 184 + + + 4240 + 7018 + 184 + + + 7166 + 11389 + 184 + + + 12326 + 15119 + 184 + + + 15349 + 30165 + 184 + + + 30211 + 49562 + 82 + + + + + + + startColumn + container + + + 12 + + + 1 + 2 + 328 + + + 2 + 3 + 123 + + + 3 + 4 + 143 + + + 4 + 6 + 184 + + + 7 + 28 + 184 + + + 41 + 98 + 184 + + + 103 + 122 + 184 + + + 123 + 130 + 205 + + + 132 + 138 + 184 + + + 138 + 142 + 205 + + + 142 + 144 + 184 + + + 144 + 148 + 184 + + + 149 + 155 + 164 + + + + + + + startColumn + startLine + + + 12 + + + 1 + 2 + 307 + + + 2 + 4 + 184 + + + 4 + 7 + 184 + + + 7 + 19 + 184 + + + 20 + 151 + 184 + + + 196 + 585 + 184 + + + 622 + 1287 + 184 + + + 1368 + 2342 + 184 + + + 2570 + 3505 + 184 + + + 3522 + 4711 + 184 + + + 4732 + 5298 + 184 + + + 5332 + 5999 + 184 + + + 6158 + 6996 + 123 + + + + + + + startColumn + endLine + + + 12 + + + 1 + 2 + 307 + + + 2 + 4 + 184 + + + 4 + 7 + 184 + + + 7 + 19 + 184 + + + 20 + 151 + 184 + + + 196 + 585 + 184 + + + 647 + 1289 + 184 + + + 1368 + 2346 + 184 + + + 2573 + 3511 + 184 + + + 3528 + 4712 + 184 + + + 4735 + 5324 + 184 + + + 5346 + 6023 + 184 + + + 6202 + 7039 + 123 + + + + + + + startColumn + endColumn + + + 12 + + + 1 + 2 + 328 + + + 2 + 3 + 123 + + + 3 + 5 + 184 + + + 5 + 9 + 184 + + + 9 + 13 + 184 + + + 13 + 20 + 184 + + + 20 + 30 + 184 + + + 30 + 42 + 184 + + + 44 + 59 + 184 + + + 59 + 69 + 205 + + + 69 + 74 + 184 + + + 74 + 83 + 184 + + + 83 + 96 + 143 + + + + + + + endLine + id + + + 12 + + + 1 + 5 + 16100 + + + 5 + 9 + 16448 + + + 9 + 15 + 15772 + + + 15 + 23 + 15054 + + + 23 + 32 + 15607 + + + 32 + 44 + 14705 + + + 44 + 60 + 14459 + + + 60 + 80 + 15238 + + + 80 + 103 + 14479 + + + 103 + 130 + 14787 + + + 130 + 159 + 14459 + + + 159 + 193 + 14377 + + + 193 + 299 + 9988 + + + + + + + endLine + container + + + 12 + + + 1 + 2 + 23463 + + + 2 + 3 + 15525 + + + 3 + 4 + 11321 + + + 4 + 6 + 16018 + + + 6 + 8 + 13454 + + + 8 + 11 + 16469 + + + 11 + 15 + 14459 + + + 15 + 20 + 16674 + + + 20 + 26 + 14972 + + + 26 + 33 + 16120 + + + 33 + 40 + 14726 + + + 40 + 49 + 14726 + + + 49 + 60 + 3548 + + + + + + + endLine + startLine + + + 12 + + + 1 + 2 + 95349 + + + 2 + 3 + 49838 + + + 3 + 4 + 29308 + + + 4 + 6 + 15566 + + + 6 + 11 + 1415 + + + + + + + endLine + startColumn + + + 12 + + + 1 + 4 + 15792 + + + 4 + 7 + 17412 + + + 7 + 11 + 16448 + + + 11 + 16 + 17310 + + + 16 + 21 + 17269 + + + 21 + 26 + 15115 + + + 26 + 31 + 16264 + + + 31 + 36 + 17679 + + + 36 + 40 + 15341 + + + 40 + 44 + 16592 + + + 44 + 49 + 16735 + + + 49 + 63 + 9516 + + + + + + + endLine + endColumn + + + 12 + + + 1 + 4 + 17146 + + + 4 + 7 + 16756 + + + 7 + 11 + 16387 + + + 11 + 16 + 16838 + + + 16 + 21 + 15977 + + + 21 + 26 + 14479 + + + 26 + 32 + 16120 + + + 32 + 37 + 14377 + + + 37 + 42 + 15833 + + + 42 + 46 + 14233 + + + 46 + 51 + 17248 + + + 51 + 59 + 14459 + + + 59 + 69 + 1620 + + + + + + + endColumn + id + + + 12 + + + 1 + 2 + 225 + + + 2 + 4 + 225 + + + 4 + 10 + 205 + + + 10 + 16 + 246 + + + 16 + 51 + 225 + + + 56 + 615 + 225 + + + 834 + 2288 + 225 + + + 2328 + 4150 + 225 + + + 4177 + 7135 + 225 + + + 8237 + 11757 + 225 + + + 12358 + 15463 + 225 + + + 15685 + 18241 + 225 + + + 18731 + 19130 + 82 + + + + + + + endColumn + container + + + 12 + + + 1 + 2 + 328 + + + 2 + 4 + 205 + + + 4 + 6 + 205 + + + 6 + 12 + 225 + + + 12 + 41 + 225 + + + 50 + 113 + 225 + + + 113 + 128 + 225 + + + 128 + 135 + 205 + + + 135 + 139 + 246 + + + 139 + 146 + 205 + + + 146 + 148 + 205 + + + 148 + 152 + 246 + + + 152 + 153 + 41 + + + + + + + endColumn + startLine + + + 12 + + + 1 + 2 + 307 + + + 2 + 4 + 164 + + + 4 + 8 + 246 + + + 8 + 15 + 225 + + + 18 + 53 + 225 + + + 74 + 491 + 225 + + + 512 + 1332 + 225 + + + 1392 + 2419 + 225 + + + 2763 + 3740 + 225 + + + 3801 + 4530 + 225 + + + 4641 + 5303 + 225 + + + 5377 + 5735 + 225 + + + 5747 + 5806 + 41 + + + + + + + endColumn + startColumn + + + 12 + + + 1 + 2 + 266 + + + 2 + 4 + 205 + + + 4 + 9 + 246 + + + 9 + 14 + 246 + + + 14 + 21 + 225 + + + 21 + 28 + 246 + + + 28 + 36 + 246 + + + 36 + 42 + 246 + + + 42 + 49 + 246 + + + 49 + 59 + 225 + + + 59 + 65 + 184 + + + 66 + 71 + 205 + + + + + + + endColumn + endLine + + + 12 + + + 1 + 2 + 307 + + + 2 + 4 + 164 + + + 4 + 8 + 246 + + + 8 + 15 + 225 + + + 17 + 53 + 225 + + + 74 + 473 + 225 + + + 500 + 1302 + 225 + + + 1356 + 2389 + 225 + + + 2626 + 3666 + 225 + + + 3731 + 4489 + 225 + + + 4638 + 5281 + 225 + + + 5366 + 5729 + 225 + + + 5734 + 5796 + 41 + + + + + + + + + numlines + 1406545 + + + element_id + 1399488 + + + num_lines + 102550 + + + num_code + 85615 + + + num_comment + 60213 + + + + + element_id + num_lines + + + 12 + + + 1 + 2 + 1392432 + + + 2 + 3 + 7056 + + + + + + + element_id + num_code + + + 12 + + + 1 + 2 + 1393373 + + + 2 + 3 + 6115 + + + + + + + element_id + num_comment + + + 12 + + + 1 + 2 + 1399488 + + + + + + + num_lines + element_id + + + 12 + + + 1 + 2 + 68680 + + + 2 + 3 + 12230 + + + 3 + 4 + 7526 + + + 4 + 21 + 7997 + + + 29 + 926 + 6115 + + + + + + + num_lines + num_code + + + 12 + + + 1 + 2 + 71032 + + + 2 + 3 + 12230 + + + 3 + 4 + 8467 + + + 4 + 6 + 9408 + + + 6 + 7 + 1411 + + + + + + + num_lines + num_comment + + + 12 + + + 1 + 2 + 70092 + + + 2 + 3 + 15053 + + + 3 + 4 + 10819 + + + 4 + 7 + 6585 + + + + + + + num_code + element_id + + + 12 + + + 1 + 2 + 53157 + + + 2 + 3 + 14582 + + + 3 + 5 + 6585 + + + 5 + 42 + 6585 + + + 44 + 927 + 4704 + + + + + + + num_code + num_lines + + + 12 + + + 1 + 2 + 53157 + + + 2 + 3 + 16934 + + + 3 + 5 + 6115 + + + 5 + 8 + 6585 + + + 8 + 12 + 2822 + + + + + + + num_code + num_comment + + + 12 + + + 1 + 2 + 53627 + + + 2 + 3 + 15994 + + + 3 + 5 + 7526 + + + 5 + 7 + 5174 + + + 7 + 10 + 3292 + + + + + + + num_comment + element_id + + + 12 + + + 1 + 2 + 34810 + + + 2 + 3 + 9408 + + + 3 + 4 + 4233 + + + 4 + 6 + 4704 + + + 6 + 11 + 5174 + + + 17 + 2622 + 1881 + + + + + + + num_comment + num_lines + + + 12 + + + 1 + 2 + 34810 + + + 2 + 3 + 9408 + + + 3 + 4 + 4233 + + + 4 + 6 + 4704 + + + 6 + 8 + 4704 + + + 10 + 38 + 2352 + + + + + + + num_comment + num_code + + + 12 + + + 1 + 2 + 34810 + + + 2 + 3 + 9408 + + + 3 + 4 + 4233 + + + 4 + 6 + 4704 + + + 6 + 10 + 4704 + + + 10 + 37 + 2352 + + + + + + + + + diagnostics + 632933 + + + id + 632933 + + + severity + 209 + + + error_tag + 7441 + + + error_message + 50202 + + + full_error_message + 632199 + + + location + 354878 + + + + + id + severity + + + 12 + + + 1 + 2 + 632933 + + + + + + + id + error_tag + + + 12 + + + 1 + 2 + 632933 + + + + + + + id + error_message + + + 12 + + + 1 + 2 + 632933 + + + + + + + id + full_error_message + + + 12 + + + 1 + 2 + 632933 + + + + + + + id + location + + + 12 + + + 1 + 2 + 632933 + + + + + + + severity + id + + + 12 + + + 354 + 355 + 104 + + + 5685 + 5686 + 104 + + + + + + + severity + error_tag + + + 12 + + + 4 + 5 + 104 + + + 67 + 68 + 104 + + + + + + + severity + error_message + + + 12 + + + 6 + 7 + 104 + + + 473 + 474 + 104 + + + + + + + severity + full_error_message + + + 12 + + + 354 + 355 + 104 + + + 5678 + 5679 + 104 + + + + + + + severity + location + + + 12 + + + 198 + 199 + 104 + + + 3278 + 3279 + 104 + + + + + + + error_tag + id + + + 12 + + + 1 + 2 + 1048 + + + 2 + 3 + 1048 + + + 3 + 5 + 628 + + + 5 + 7 + 628 + + + 7 + 11 + 628 + + + 12 + 16 + 524 + + + 16 + 25 + 628 + + + 25 + 38 + 628 + + + 41 + 72 + 628 + + + 95 + 610 + 628 + + + 624 + 1277 + 419 + + + + + + + error_tag + severity + + + 12 + + + 1 + 2 + 7441 + + + + + + + error_tag + error_message + + + 12 + + + 1 + 2 + 5240 + + + 2 + 3 + 419 + + + 3 + 4 + 419 + + + 4 + 6 + 628 + + + 6 + 51 + 628 + + + 251 + 252 + 104 + + + + + + + error_tag + full_error_message + + + 12 + + + 1 + 2 + 1152 + + + 2 + 3 + 1048 + + + 3 + 5 + 628 + + + 5 + 7 + 628 + + + 7 + 13 + 628 + + + 13 + 16 + 419 + + + 16 + 25 + 628 + + + 25 + 38 + 628 + + + 41 + 72 + 628 + + + 95 + 610 + 628 + + + 624 + 1277 + 419 + + + + + + + error_tag + location + + + 12 + + + 1 + 2 + 1781 + + + 2 + 3 + 733 + + + 3 + 4 + 524 + + + 4 + 6 + 628 + + + 6 + 7 + 524 + + + 7 + 12 + 628 + + + 12 + 17 + 628 + + + 24 + 44 + 628 + + + 44 + 110 + 628 + + + 167 + 542 + 628 + + + 704 + 705 + 104 + + + + + + + error_message + id + + + 12 + + + 1 + 2 + 20437 + + + 2 + 3 + 10899 + + + 3 + 4 + 2829 + + + 4 + 5 + 2515 + + + 5 + 6 + 2829 + + + 6 + 9 + 3773 + + + 9 + 21 + 3773 + + + 21 + 1277 + 3144 + + + + + + + error_message + severity + + + 12 + + + 1 + 2 + 50202 + + + + + + + error_message + error_tag + + + 12 + + + 1 + 2 + 50202 + + + + + + + error_message + full_error_message + + + 12 + + + 1 + 2 + 20542 + + + 2 + 3 + 10899 + + + 3 + 4 + 2829 + + + 4 + 5 + 2515 + + + 5 + 6 + 2829 + + + 6 + 10 + 4087 + + + 10 + 24 + 3877 + + + 25 + 1277 + 2620 + + + + + + + error_message + location + + + 12 + + + 1 + 2 + 32280 + + + 2 + 3 + 5345 + + + 3 + 5 + 3563 + + + 5 + 8 + 3877 + + + 8 + 34 + 3773 + + + 34 + 705 + 1362 + + + + + + + full_error_message + id + + + 12 + + + 1 + 2 + 632094 + + + 8 + 9 + 104 + + + + + + + full_error_message + severity + + + 12 + + + 1 + 2 + 632199 + + + + + + + full_error_message + error_tag + + + 12 + + + 1 + 2 + 632199 + + + + + + + full_error_message + error_message + + + 12 + + + 1 + 2 + 632199 + + + + + + + full_error_message + location + + + 12 + + + 1 + 2 + 632199 + + + + + + + location + id + + + 12 + + + 1 + 2 + 180059 + + + 2 + 3 + 135621 + + + 3 + 6 + 31023 + + + 6 + 17 + 8174 + + + + + + + location + severity + + + 12 + + + 1 + 2 + 345445 + + + 2 + 3 + 9432 + + + + + + + location + error_tag + + + 12 + + + 1 + 2 + 338947 + + + 2 + 6 + 15930 + + + + + + + location + error_message + + + 12 + + + 1 + 2 + 338423 + + + 2 + 6 + 16454 + + + + + + + location + full_error_message + + + 12 + + + 1 + 2 + 180164 + + + 2 + 3 + 135621 + + + 3 + 6 + 31023 + + + 6 + 17 + 8070 + + + + + + + + + files + 124189 + + + id + 124189 + + + name + 124189 + + + + + id + name + + + 12 + + + 1 + 2 + 124189 + + + + + + + name + id + + + 12 + + + 1 + 2 + 124189 + + + + + + + + + folders + 15994 + + + id + 15994 + + + name + 15994 + + + + + id + name + + + 12 + + + 1 + 2 + 15994 + + + + + + + name + id + + + 12 + + + 1 + 2 + 15994 + + + + + + + + + containerparent + 139243 + + + parent + 15994 + + + child + 139243 + + + + + parent + child + + + 12 + + + 1 + 2 + 7056 + + + 2 + 3 + 3292 + + + 3 + 5 + 1411 + + + 5 + 12 + 1411 + + + 23 + 28 + 1411 + + + 40 + 67 + 1411 + + + + + + + child + parent + + + 12 + + + 1 + 2 + 139243 + + + + + + + + + fileannotations + 5254893 + + + id + 5019 + + + kind + 23 + + + name + 56112 + + + value + 47173 + + + + + id + kind + + + 12 + + + 1 + 2 + 173 + + + 2 + 3 + 4845 + + + + + + + id + name + + + 12 + + + 1 + 102 + 393 + + + 102 + 225 + 381 + + + 227 + 299 + 381 + + + 301 + 452 + 404 + + + 452 + 555 + 381 + + + 559 + 626 + 381 + + + 626 + 716 + 381 + + + 729 + 904 + 381 + + + 904 + 934 + 80 + + + 936 + 937 + 1457 + + + 1083 + 2036 + 381 + + + 2293 + 2294 + 11 + + + + + + + id + value + + + 12 + + + 1 + 114 + 393 + + + 114 + 275 + 381 + + + 275 + 363 + 381 + + + 393 + 638 + 381 + + + 643 + 744 + 381 + + + 751 + 955 + 381 + + + 955 + 1087 + 381 + + + 1088 + 1501 + 254 + + + 1501 + 1502 + 1457 + + + 1504 + 1874 + 381 + + + 1972 + 4080 + 242 + + + + + + + kind + id + + + 12 + + + 419 + 420 + 11 + + + 434 + 435 + 11 + + + + + + + kind + name + + + 12 + + + 2 + 3 + 11 + + + 4850 + 4851 + 11 + + + + + + + kind + value + + + 12 + + + 1 + 2 + 11 + + + 4079 + 4080 + 11 + + + + + + + name + id + + + 12 + + + 1 + 2 + 9078 + + + 2 + 3 + 6372 + + + 3 + 5 + 4279 + + + 5 + 9 + 4371 + + + 9 + 14 + 4082 + + + 14 + 18 + 4279 + + + 18 + 20 + 4834 + + + 20 + 34 + 4325 + + + 34 + 128 + 4614 + + + 128 + 229 + 4221 + + + 229 + 387 + 4348 + + + 387 + 434 + 1306 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 56112 + + + + + + + name + value + + + 12 + + + 1 + 2 + 9089 + + + 2 + 3 + 8257 + + + 3 + 4 + 2625 + + + 4 + 6 + 4625 + + + 6 + 9 + 4232 + + + 9 + 14 + 4313 + + + 14 + 17 + 4232 + + + 17 + 22 + 4706 + + + 22 + 41 + 4313 + + + 41 + 82 + 4267 + + + 82 + 157 + 4209 + + + 158 + 1895 + 1237 + + + + + + + value + id + + + 12 + + + 1 + 2 + 7332 + + + 2 + 5 + 2289 + + + 5 + 8 + 3411 + + + 8 + 15 + 3619 + + + 15 + 17 + 2602 + + + 17 + 19 + 4244 + + + 19 + 34 + 3411 + + + 34 + 189 + 3712 + + + 189 + 201 + 3700 + + + 201 + 266 + 3642 + + + 266 + 321 + 3770 + + + 322 + 399 + 4047 + + + 399 + 435 + 1387 + + + + + + + value + kind + + + 12 + + + 1 + 2 + 47161 + + + 2 + 3 + 11 + + + + + + + value + name + + + 12 + + + 1 + 2 + 7355 + + + 2 + 5 + 2648 + + + 5 + 8 + 3596 + + + 8 + 15 + 3642 + + + 15 + 17 + 2902 + + + 17 + 19 + 3677 + + + 19 + 29 + 3596 + + + 29 + 39 + 3758 + + + 39 + 48 + 3700 + + + 48 + 74 + 3654 + + + 74 + 102 + 3538 + + + 102 + 119 + 3689 + + + 119 + 146 + 1410 + + + + + + + + + inmacroexpansion + 109313317 + + + id + 17941916 + + + inv + 2682068 + + + + + id + inv + + + 12 + + + 1 + 3 + 1566018 + + + 3 + 5 + 1071344 + + + 5 + 6 + 1179814 + + + 6 + 7 + 4800000 + + + 7 + 8 + 6359380 + + + 8 + 9 + 2595248 + + + 9 + 150 + 370109 + + + + + + + inv + id + + + 12 + + + 1 + 2 + 371855 + + + 2 + 3 + 540113 + + + 3 + 4 + 349917 + + + 4 + 7 + 199815 + + + 7 + 8 + 206290 + + + 8 + 9 + 240882 + + + 9 + 10 + 2201 + + + 10 + 11 + 324132 + + + 11 + 337 + 223913 + + + 339 + 422 + 201383 + + + 422 + 7616 + 21563 + + + + + + + + + affectedbymacroexpansion + 35540532 + + + id + 5135277 + + + inv + 2773181 + + + + + id + inv + + + 12 + + + 1 + 2 + 2804212 + + + 2 + 3 + 557797 + + + 3 + 4 + 263804 + + + 4 + 5 + 563439 + + + 5 + 12 + 390272 + + + 12 + 50 + 405705 + + + 50 + 9900 + 150045 + + + + + + + inv + id + + + 12 + + + 1 + 4 + 228162 + + + 4 + 7 + 230823 + + + 7 + 9 + 219560 + + + 9 + 12 + 250042 + + + 12 + 13 + 332588 + + + 13 + 14 + 164899 + + + 14 + 15 + 297600 + + + 15 + 16 + 121336 + + + 16 + 17 + 275457 + + + 17 + 18 + 146328 + + + 18 + 20 + 251085 + + + 20 + 25 + 208109 + + + 25 + 109 + 47186 + + + + + + + + + macroinvocations + 33895024 + + + id + 33895024 + + + macro_id + 81382 + + + location + 778558 + + + kind + 23 + + + + + id + macro_id + + + 12 + + + 1 + 2 + 33895024 + + + + + + + id + location + + + 12 + + + 1 + 2 + 33895024 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 33895024 + + + + + + + macro_id + id + + + 12 + + + 1 + 2 + 17578 + + + 2 + 3 + 16977 + + + 3 + 4 + 3700 + + + 4 + 5 + 4880 + + + 5 + 8 + 6048 + + + 8 + 14 + 6406 + + + 14 + 29 + 6291 + + + 29 + 72 + 6106 + + + 72 + 247 + 6129 + + + 248 + 4166 + 6106 + + + 4220 + 168296 + 1156 + + + + + + + macro_id + location + + + 12 + + + 1 + 2 + 43507 + + + 2 + 3 + 10651 + + + 3 + 4 + 5285 + + + 4 + 6 + 6985 + + + 6 + 13 + 6626 + + + 13 + 66 + 6140 + + + 66 + 3614 + 2185 + + + + + + + macro_id + kind + + + 12 + + + 1 + 2 + 75553 + + + 2 + 3 + 5828 + + + + + + + location + id + + + 12 + + + 1 + 2 + 320983 + + + 2 + 3 + 177752 + + + 3 + 4 + 47300 + + + 4 + 5 + 59605 + + + 5 + 9 + 68533 + + + 9 + 23 + 58425 + + + 23 + 244365 + 45958 + + + + + + + location + macro_id + + + 12 + + + 1 + 2 + 731281 + + + 2 + 350 + 47277 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 778558 + + + + + + + kind + id + + + 12 + + + 20414 + 20415 + 11 + + + 2910446 + 2910447 + 11 + + + + + + + kind + macro_id + + + 12 + + + 2123 + 2124 + 11 + + + 5418 + 5419 + 11 + + + + + + + kind + location + + + 12 + + + 6291 + 6292 + 11 + + + 61030 + 61031 + 11 + + + + + + + + + macroparent + 30455631 + + + id + 30455631 + + + parent_id + 23698229 + + + + + id + parent_id + + + 12 + + + 1 + 2 + 30455631 + + + + + + + parent_id + id + + + 12 + + + 1 + 2 + 18307194 + + + 2 + 3 + 4540068 + + + 3 + 88 + 850966 + + + + + + + + + macrolocationbind + 3984640 + + + id + 2778886 + + + location + 1988454 + + + + + id + location + + + 12 + + + 1 + 2 + 2183104 + + + 2 + 3 + 336443 + + + 3 + 7 + 229815 + + + 7 + 57 + 29523 + + + + + + + location + id + + + 12 + + + 1 + 2 + 1589588 + + + 2 + 3 + 169647 + + + 3 + 8 + 154233 + + + 8 + 723 + 74984 + + + + + + + + + macro_argument_unexpanded + 86176891 + + + invocation + 26568376 + + + argument_index + 763 + + + text + 326094 + + + + + invocation + argument_index + + + 12 + + + 1 + 2 + 7436803 + + + 2 + 3 + 10861705 + + + 3 + 4 + 6256816 + + + 4 + 67 + 2013051 + + + + + + + invocation + text + + + 12 + + + 1 + 2 + 7508019 + + + 2 + 3 + 11011575 + + + 3 + 4 + 6087240 + + + 4 + 67 + 1961541 + + + + + + + argument_index + invocation + + + 12 + + + 41230 + 41231 + 670 + + + 41432 + 174067 + 57 + + + 715085 + 2297335 + 34 + + + + + + + argument_index + text + + + 12 + + + 2 + 3 + 670 + + + 13 + 995 + 57 + + + 6559 + 19579 + 34 + + + + + + + text + invocation + + + 12 + + + 1 + 2 + 40858 + + + 2 + 3 + 65607 + + + 3 + 4 + 15184 + + + 4 + 5 + 45103 + + + 5 + 8 + 25569 + + + 8 + 12 + 16075 + + + 12 + 16 + 22297 + + + 16 + 23 + 26518 + + + 23 + 43 + 24748 + + + 43 + 164 + 24459 + + + 164 + 521384 + 19671 + + + + + + + text + argument_index + + + 12 + + + 1 + 2 + 235830 + + + 2 + 3 + 79728 + + + 3 + 9 + 10535 + + + + + + + + + macro_argument_expanded + 86176891 + + + invocation + 26568376 + + + argument_index + 763 + + + text + 197597 + + + + + invocation + argument_index + + + 12 + + + 1 + 2 + 7436803 + + + 2 + 3 + 10861705 + + + 3 + 4 + 6256816 + + + 4 + 67 + 2013051 + + + + + + + invocation + text + + + 12 + + + 1 + 2 + 10747757 + + + 2 + 3 + 9374150 + + + 3 + 4 + 5307004 + + + 4 + 9 + 1139463 + + + + + + + argument_index + invocation + + + 12 + + + 41230 + 41231 + 670 + + + 41432 + 174067 + 57 + + + 715085 + 2297335 + 34 + + + + + + + argument_index + text + + + 12 + + + 1 + 2 + 659 + + + 2 + 76 + 57 + + + 870 + 13877 + 46 + + + + + + + text + invocation + + + 12 + + + 1 + 2 + 24552 + + + 2 + 3 + 41147 + + + 3 + 4 + 6927 + + + 4 + 5 + 16364 + + + 5 + 6 + 2995 + + + 6 + 7 + 23291 + + + 7 + 9 + 15982 + + + 9 + 15 + 16699 + + + 15 + 31 + 15589 + + + 31 + 97 + 15080 + + + 97 + 775 + 15485 + + + 775 + 1052916 + 3481 + + + + + + + text + argument_index + + + 12 + + + 1 + 2 + 99989 + + + 2 + 3 + 82850 + + + 3 + 66 + 14756 + + + + + + + + + functions + 4726273 + + + id + 4726273 + + + name + 1934352 + + + kind + 3292 + + + + + id + name + + + 12 + + + 1 + 2 + 4726273 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 4726273 + + + + + + + name + id + + + 12 + + + 1 + 2 + 1516622 + + + 2 + 3 + 154296 + + + 3 + 5 + 151003 + + + 5 + 1724 + 112429 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 1933881 + + + 2 + 3 + 470 + + + + + + + kind + id + + + 12 + + + 6 + 7 + 470 + + + 64 + 65 + 470 + + + 173 + 174 + 470 + + + 195 + 196 + 470 + + + 1358 + 1359 + 470 + + + 2432 + 2433 + 470 + + + 5819 + 5820 + 470 + + + + + + + kind + name + + + 12 + + + 3 + 4 + 470 + + + 33 + 34 + 470 + + + 39 + 40 + 470 + + + 94 + 95 + 470 + + + 195 + 196 + 470 + + + 244 + 245 + 470 + + + 3505 + 3506 + 470 + + + + + + + + + function_entry_point + 1176981 + + + id + 1167103 + + + entry_point + 1176981 + + + + + id + entry_point + + + 12 + + + 1 + 2 + 1157224 + + + 2 + 3 + 9878 + + + + + + + entry_point + id + + + 12 + + + 1 + 2 + 1176981 + + + + + + + + + function_return_type + 4734741 + + + id + 4726273 + + + return_type + 1016569 + + + + + id + return_type + + + 12 + + + 1 + 2 + 4719217 + + + 2 + 5 + 7056 + + + + + + + return_type + id + + + 12 + + + 1 + 2 + 523103 + + + 2 + 3 + 390445 + + + 3 + 11 + 78559 + + + 11 + 2516 + 24461 + + + + + + + + + coroutine + 2 + + + function + 2 + + + traits + 2 + + + handle + 2 + + + promise + 2 + + + + + function + traits + + + 12 + + + 1 + 2 + 2 + + + + + + + function + handle + + + 12 + + + 1 + 2 + 2 + + + + + + + function + promise + + + 12 + + + 1 + 2 + 2 + + + + + + + traits + function + + + 12 + + + 1 + 2 + 2 + + + + + + + traits + handle + + + 12 + + + 1 + 2 + 2 + + + + + + + traits + promise + + + 12 + + + 1 + 2 + 2 + + + + + + + handle + function + + + 12 + + + 1 + 2 + 2 + + + + + + + handle + traits + + + 12 + + + 1 + 2 + 2 + + + + + + + handle + promise + + + 12 + + + 1 + 2 + 2 + + + + + + + promise + function + + + 12 + + + 1 + 2 + 2 + + + + + + + promise + traits + + + 12 + + + 1 + 2 + 2 + + + + + + + promise + handle + + + 12 + + + 1 + 2 + 2 + + + + + + + + + coroutine_new + 2 + + + function + 2 + + + new + 1 + + + + + function + new + + + 12 + + + 1 + 2 + 2 + + + + + + + new + function + + + 12 + + + 2 + 3 + 1 + + + + + + + + + coroutine_delete + 2 + + + function + 2 + + + delete + 1 + + + + + function + delete + + + 12 + + + 1 + 2 + 2 + + + + + + + delete + function + + + 12 + + + 2 + 3 + 1 + + + + + + + + + purefunctions + 99448 + + + id + 99448 + + + + + + function_deleted + 140654 + + + id + 140654 + + + + + + function_defaulted + 74325 + + + id + 74325 + + + + + + member_function_this_type + 553641 + + + id + 553641 + + + this_type + 189690 + + + + + id + this_type + + + 12 + + + 1 + 2 + 553641 + + + + + + + this_type + id + + + 12 + + + 1 + 2 + 68526 + + + 2 + 3 + 45414 + + + 3 + 4 + 30475 + + + 4 + 5 + 15537 + + + 5 + 7 + 15607 + + + 7 + 66 + 14128 + + + + + + + + + fun_decls + 5102136 + + + id + 5096962 + + + function + 4578563 + + + type_id + 1013276 + + + name + 1836035 + + + location + 3461324 + + + + + id + function + + + 12 + + + 1 + 2 + 5096962 + + + + + + + id + type_id + + + 12 + + + 1 + 2 + 5091787 + + + 2 + 3 + 5174 + + + + + + + id + name + + + 12 + + + 1 + 2 + 5096962 + + + + + + + id + location + + + 12 + + + 1 + 2 + 5096962 + + + + + + + function + id + + + 12 + + + 1 + 2 + 4141075 + + + 2 + 3 + 363161 + + + 3 + 7 + 74325 + + + + + + + function + type_id + + + 12 + + + 1 + 2 + 4536696 + + + 2 + 5 + 41867 + + + + + + + function + name + + + 12 + + + 1 + 2 + 4578563 + + + + + + + function + location + + + 12 + + + 1 + 2 + 4197996 + + + 2 + 4 + 379155 + + + 4 + 6 + 1411 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 445954 + + + 2 + 3 + 453481 + + + 3 + 9 + 79500 + + + 9 + 2768 + 34340 + + + + + + + type_id + function + + + 12 + + + 1 + 2 + 530629 + + + 2 + 3 + 381978 + + + 3 + 11 + 77148 + + + 11 + 2477 + 23520 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 883912 + + + 2 + 5 + 90319 + + + 5 + 822 + 39044 + + + + + + + type_id + location + + + 12 + + + 1 + 2 + 779480 + + + 2 + 3 + 133127 + + + 3 + 11 + 78089 + + + 11 + 2030 + 22579 + + + + + + + name + id + + + 12 + + + 1 + 2 + 1245192 + + + 2 + 3 + 269548 + + + 3 + 4 + 80441 + + + 4 + 6 + 138772 + + + 6 + 1758 + 102080 + + + + + + + name + function + + + 12 + + + 1 + 2 + 1425832 + + + 2 + 3 + 153355 + + + 3 + 5 + 145358 + + + 5 + 1708 + 111488 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 1615880 + + + 2 + 4 + 135009 + + + 4 + 954 + 85145 + + + + + + + name + location + + + 12 + + + 1 + 2 + 1266831 + + + 2 + 3 + 296362 + + + 3 + 4 + 79500 + + + 4 + 8 + 139243 + + + 8 + 664 + 54097 + + + + + + + location + id + + + 12 + + + 1 + 2 + 2995611 + + + 2 + 4 + 302007 + + + 4 + 55 + 163704 + + + + + + + location + function + + + 12 + + + 1 + 2 + 3063351 + + + 2 + 6 + 268607 + + + 6 + 55 + 129364 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 3245873 + + + 2 + 27 + 215450 + + + + + + + location + name + + + 12 + + + 1 + 2 + 3285388 + + + 2 + 13 + 175935 + + + + + + + + + fun_def + 1963988 + + + id + 1963988 + + + + + + fun_specialized + 26343 + + + id + 26343 + + + + + + fun_implicit + 198 + + + id + 198 + + + + + + fun_decl_specifiers + 2937280 + + + id + 1710904 + + + name + 2822 + + + + + id + name + + + 12 + + + 1 + 2 + 503345 + + + 2 + 3 + 1188742 + + + 3 + 4 + 18816 + + + + + + + name + id + + + 12 + + + 50 + 51 + 470 + + + 203 + 204 + 470 + + + 209 + 210 + 470 + + + 657 + 658 + 470 + + + 2561 + 2562 + 470 + + + 2564 + 2565 + 470 + + + + + + + + + fun_decl_throws + 7 + + + fun_decl + 7 + + + index + 1 + + + type_id + 2 + + + + + fun_decl + index + + + 12 + + + 1 + 2 + 7 + + + + + + + fun_decl + type_id + + + 12 + + + 1 + 2 + 7 + + + + + + + index + fun_decl + + + 12 + + + 7 + 8 + 1 + + + + + + + index + type_id + + + 12 + + + 2 + 3 + 1 + + + + + + + type_id + fun_decl + + + 12 + + + 1 + 2 + 1 + + + 6 + 7 + 1 + + + + + + + type_id + index + + + 12 + + + 1 + 2 + 2 + + + + + + + + + fun_decl_empty_throws + 1978101 + + + fun_decl + 1978101 + + + + + + fun_decl_noexcept + 61207 + + + fun_decl + 61207 + + + constant + 61102 + + + + + fun_decl + constant + + + 12 + + + 1 + 2 + 61207 + + + + + + + constant + fun_decl + + + 12 + + + 1 + 2 + 60998 + + + 2 + 3 + 104 + + + + + + + + + fun_decl_empty_noexcept + 888146 + + + fun_decl + 888146 + + + + + + fun_decl_typedef_type + 2891 + + + fun_decl + 2891 + + + typedeftype_id + 130 + + + + + fun_decl + typedeftype_id + + + 12 + + + 1 + 2 + 2891 + + + + + + + typedeftype_id + fun_decl + + + 12 + + + 1 + 2 + 42 + + + 2 + 3 + 12 + + + 3 + 4 + 12 + + + 5 + 13 + 8 + + + 16 + 17 + 12 + + + 17 + 18 + 4 + + + 21 + 22 + 8 + + + 25 + 43 + 8 + + + 46 + 55 + 8 + + + 87 + 128 + 8 + + + 158 + 159 + 4 + + + + + + + + + param_decl_bind + 7472094 + + + id + 7472094 + + + index + 7997 + + + fun_decl + 4286434 + + + + + id + index + + + 12 + + + 1 + 2 + 7472094 + + + + + + + id + fun_decl + + + 12 + + + 1 + 2 + 7472094 + + + + + + + index + id + + + 12 + + + 2 + 3 + 940 + + + 5 + 6 + 470 + + + 7 + 8 + 470 + + + 10 + 11 + 940 + + + 11 + 12 + 470 + + + 12 + 13 + 940 + + + 13 + 14 + 470 + + + 25 + 26 + 470 + + + 78 + 79 + 470 + + + 245 + 246 + 470 + + + 636 + 637 + 470 + + + 1713 + 1714 + 470 + + + 3991 + 3992 + 470 + + + 9112 + 9113 + 470 + + + + + + + index + fun_decl + + + 12 + + + 2 + 3 + 940 + + + 5 + 6 + 470 + + + 7 + 8 + 470 + + + 10 + 11 + 940 + + + 11 + 12 + 470 + + + 12 + 13 + 940 + + + 13 + 14 + 470 + + + 25 + 26 + 470 + + + 78 + 79 + 470 + + + 245 + 246 + 470 + + + 636 + 637 + 470 + + + 1713 + 1714 + 470 + + + 3991 + 3992 + 470 + + + 9112 + 9113 + 470 + + + + + + + fun_decl + id + + + 12 + + + 1 + 2 + 2409002 + + + 2 + 3 + 1071608 + + + 3 + 4 + 506638 + + + 4 + 18 + 299184 + + + + + + + fun_decl + index + + + 12 + + + 1 + 2 + 2409002 + + + 2 + 3 + 1071608 + + + 3 + 4 + 506638 + + + 4 + 18 + 299184 + + + + + + + + + var_decls + 8611913 + + + id + 8543232 + + + variable + 7520077 + + + type_id + 2430641 + + + name + 672695 + + + location + 5365099 + + + + + id + variable + + + 12 + + + 1 + 2 + 8543232 + + + + + + + id + type_id + + + 12 + + + 1 + 2 + 8474552 + + + 2 + 3 + 68680 + + + + + + + id + name + + + 12 + + + 1 + 2 + 8543232 + + + + + + + id + location + + + 12 + + + 1 + 2 + 8543232 + + + + + + + variable + id + + + 12 + + + 1 + 2 + 6658274 + + + 2 + 3 + 707035 + + + 3 + 7 + 154767 + + + + + + + variable + type_id + + + 12 + + + 1 + 2 + 7346963 + + + 2 + 4 + 173113 + + + + + + + variable + name + + + 12 + + + 1 + 2 + 7402943 + + + 2 + 3 + 117133 + + + + + + + variable + location + + + 12 + + + 1 + 2 + 6967337 + + + 2 + 4 + 552739 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 1505802 + + + 2 + 3 + 516046 + + + 3 + 4 + 98787 + + + 4 + 7 + 188636 + + + 7 + 780 + 121367 + + + + + + + type_id + variable + + + 12 + + + 1 + 2 + 1640342 + + + 2 + 3 + 491114 + + + 3 + 7 + 188166 + + + 7 + 742 + 111018 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 1918828 + + + 2 + 3 + 388563 + + + 3 + 128 + 123249 + + + + + + + type_id + location + + + 12 + + + 1 + 2 + 1743833 + + + 2 + 3 + 406910 + + + 3 + 8 + 190048 + + + 8 + 595 + 89849 + + + + + + + name + id + + + 12 + + + 1 + 2 + 343874 + + + 2 + 3 + 87497 + + + 3 + 4 + 48923 + + + 4 + 6 + 52216 + + + 6 + 12 + 52686 + + + 12 + 33 + 50804 + + + 34 + 3281 + 36692 + + + + + + + name + variable + + + 12 + + + 1 + 2 + 371628 + + + 2 + 3 + 78559 + + + 3 + 4 + 45630 + + + 4 + 6 + 49864 + + + 6 + 14 + 53627 + + + 14 + 56 + 51275 + + + 56 + 3198 + 22109 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 460537 + + + 2 + 3 + 94553 + + + 3 + 5 + 47041 + + + 5 + 19 + 51275 + + + 19 + 1979 + 19287 + + + + + + + name + location + + + 12 + + + 1 + 2 + 381978 + + + 2 + 3 + 91260 + + + 3 + 5 + 60213 + + + 5 + 9 + 51745 + + + 9 + 21 + 50804 + + + 21 + 1020 + 36692 + + + + + + + location + id + + + 12 + + + 1 + 2 + 4535755 + + + 2 + 3 + 550387 + + + 3 + 1783 + 278956 + + + + + + + location + variable + + + 12 + + + 1 + 2 + 4939842 + + + 2 + 17 + 414436 + + + 17 + 1779 + 10819 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 5016520 + + + 2 + 1561 + 348578 + + + + + + + location + name + + + 12 + + + 1 + 2 + 5360865 + + + 2 + 24 + 4233 + + + + + + + + + var_def + 4083685 + + + id + 4083685 + + + + + + var_decl_specifiers + 334936 + + + id + 334936 + + + name + 1411 + + + + + id + name + + + 12 + + + 1 + 2 + 334936 + + + + + + + name + id + + + 12 + + + 15 + 16 + 470 + + + 66 + 67 + 470 + + + 631 + 632 + 470 + + + + + + + + + is_structured_binding + 18 + + + id + 18 + + + + + + type_decls + 3283977 + + + id + 3283977 + + + type_id + 3233172 + + + location + 3204006 + + + + + id + type_id + + + 12 + + + 1 + 2 + 3283977 + + + + + + + id + location + + + 12 + + + 1 + 2 + 3283977 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 3191305 + + + 2 + 5 + 41867 + + + + + + + type_id + location + + + 12 + + + 1 + 2 + 3191305 + + + 2 + 5 + 41867 + + + + + + + location + id + + + 12 + + + 1 + 2 + 3163080 + + + 2 + 20 + 40926 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 3163080 + + + 2 + 20 + 40926 + + + + + + + + + type_def + 2660675 + + + id + 2660675 + + + + + + type_decl_top + 755959 + + + type_decl + 755959 + + + + + + namespace_decls + 306979 + + + id + 306979 + + + namespace_id + 1414 + + + location + 306979 + + + bodylocation + 306979 + + + + + id + namespace_id + + + 12 + + + 1 + 2 + 306979 + + + + + + + id + location + + + 12 + + + 1 + 2 + 306979 + + + + + + + id + bodylocation + + + 12 + + + 1 + 2 + 306979 + + + + + + + namespace_id + id + + + 12 + + + 1 + 2 + 295 + + + 2 + 3 + 157 + + + 3 + 6 + 125 + + + 6 + 14 + 106 + + + 14 + 30 + 106 + + + 30 + 57 + 119 + + + 57 + 80 + 113 + + + 80 + 127 + 106 + + + 129 + 199 + 106 + + + 201 + 504 + 106 + + + 512 + 12128 + 69 + + + + + + + namespace_id + location + + + 12 + + + 1 + 2 + 295 + + + 2 + 3 + 157 + + + 3 + 6 + 125 + + + 6 + 14 + 106 + + + 14 + 30 + 106 + + + 30 + 57 + 119 + + + 57 + 80 + 113 + + + 80 + 127 + 106 + + + 129 + 199 + 106 + + + 201 + 504 + 106 + + + 512 + 12128 + 69 + + + + + + + namespace_id + bodylocation + + + 12 + + + 1 + 2 + 295 + + + 2 + 3 + 157 + + + 3 + 6 + 125 + + + 6 + 14 + 106 + + + 14 + 30 + 106 + + + 30 + 57 + 119 + + + 57 + 80 + 113 + + + 80 + 127 + 106 + + + 129 + 199 + 106 + + + 201 + 504 + 106 + + + 512 + 12128 + 69 + + + + + + + location + id + + + 12 + + + 1 + 2 + 306979 + + + + + + + location + namespace_id + + + 12 + + + 1 + 2 + 306979 + + + + + + + location + bodylocation + + + 12 + + + 1 + 2 + 306979 + + + + + + + bodylocation + id + + + 12 + + + 1 + 2 + 306979 + + + + + + + bodylocation + namespace_id + + + 12 + + + 1 + 2 + 306979 + + + + + + + bodylocation + location + + + 12 + + + 1 + 2 + 306979 + + + + + + + + + usings + 374921 + + + id + 374921 + + + element_id + 318471 + + + location + 249791 + + + + + id + element_id + + + 12 + + + 1 + 2 + 374921 + + + + + + + id + location + + + 12 + + + 1 + 2 + 374921 + + + + + + + element_id + id + + + 12 + + + 1 + 2 + 263903 + + + 2 + 3 + 53157 + + + 3 + 5 + 1411 + + + + + + + element_id + location + + + 12 + + + 1 + 2 + 263903 + + + 2 + 3 + 53157 + + + 3 + 5 + 1411 + + + + + + + location + id + + + 12 + + + 1 + 2 + 203690 + + + 2 + 4 + 11289 + + + 4 + 5 + 31517 + + + 5 + 11 + 3292 + + + + + + + location + element_id + + + 12 + + + 1 + 2 + 203690 + + + 2 + 4 + 11289 + + + 4 + 5 + 31517 + + + 5 + 11 + 3292 + + + + + + + + + using_container + 478195 + + + parent + 11298 + + + child + 303207 + + + + + parent + child + + + 12 + + + 1 + 2 + 3353 + + + 2 + 4 + 959 + + + 4 + 6 + 427 + + + 6 + 7 + 2555 + + + 7 + 17 + 925 + + + 19 + 143 + 786 + + + 178 + 179 + 1329 + + + 179 + 183 + 878 + + + 201 + 488 + 80 + + + + + + + child + parent + + + 12 + + + 1 + 2 + 223629 + + + 2 + 3 + 52990 + + + 3 + 11 + 24401 + + + 13 + 41 + 2185 + + + + + + + + + static_asserts + 130414 + + + id + 130414 + + + condition + 130414 + + + message + 29450 + + + location + 16768 + + + enclosing + 1942 + + + + + id + condition + + + 12 + + + 1 + 2 + 130414 + + + + + + + id + message + + + 12 + + + 1 + 2 + 130414 + + + + + + + id + location + + + 12 + + + 1 + 2 + 130414 + + + + + + + id + enclosing + + + 12 + + + 1 + 2 + 130414 + + + + + + + condition + id + + + 12 + + + 1 + 2 + 130414 + + + + + + + condition + message + + + 12 + + + 1 + 2 + 130414 + + + + + + + condition + location + + + 12 + + + 1 + 2 + 130414 + + + + + + + condition + enclosing + + + 12 + + + 1 + 2 + 130414 + + + + + + + message + id + + + 12 + + + 1 + 2 + 21943 + + + 2 + 3 + 402 + + + 3 + 4 + 2766 + + + 4 + 11 + 1420 + + + 12 + 17 + 2376 + + + 17 + 513 + 540 + + + + + + + message + condition + + + 12 + + + 1 + 2 + 21943 + + + 2 + 3 + 402 + + + 3 + 4 + 2766 + + + 4 + 11 + 1420 + + + 12 + 17 + 2376 + + + 17 + 513 + 540 + + + + + + + message + location + + + 12 + + + 1 + 2 + 27337 + + + 2 + 33 + 2112 + + + + + + + message + enclosing + + + 12 + + + 1 + 2 + 23357 + + + 2 + 3 + 188 + + + 3 + 4 + 2565 + + + 4 + 11 + 1263 + + + 12 + 21 + 2074 + + + + + + + location + id + + + 12 + + + 1 + 2 + 3124 + + + 2 + 3 + 2697 + + + 3 + 4 + 1307 + + + 5 + 6 + 3621 + + + 6 + 13 + 182 + + + 14 + 15 + 2049 + + + 16 + 17 + 37 + + + 17 + 18 + 3401 + + + 19 + 52 + 345 + + + + + + + location + condition + + + 12 + + + 1 + 2 + 3124 + + + 2 + 3 + 2697 + + + 3 + 4 + 1307 + + + 5 + 6 + 3621 + + + 6 + 13 + 182 + + + 14 + 15 + 2049 + + + 16 + 17 + 37 + + + 17 + 18 + 3401 + + + 19 + 52 + 345 + + + + + + + location + message + + + 12 + + + 1 + 2 + 4621 + + + 2 + 3 + 5941 + + + 3 + 4 + 6023 + + + 4 + 7 + 182 + + + + + + + location + enclosing + + + 12 + + + 1 + 2 + 3728 + + + 2 + 3 + 6111 + + + 3 + 4 + 1081 + + + 4 + 5 + 3590 + + + 5 + 6 + 188 + + + 13 + 14 + 2049 + + + 16 + 21 + 18 + + + + + + + enclosing + id + + + 12 + + + 1 + 2 + 1376 + + + 2 + 3 + 138 + + + 3 + 10 + 163 + + + 10 + 180 + 138 + + + 209 + 11052 + 125 + + + + + + + enclosing + condition + + + 12 + + + 1 + 2 + 1376 + + + 2 + 3 + 138 + + + 3 + 10 + 163 + + + 10 + 180 + 138 + + + 209 + 11052 + 125 + + + + + + + enclosing + message + + + 12 + + + 1 + 2 + 1546 + + + 2 + 6 + 150 + + + 9 + 210 + 169 + + + 223 + 2936 + 75 + + + + + + + enclosing + location + + + 12 + + + 1 + 2 + 1534 + + + 2 + 5 + 157 + + + 5 + 210 + 176 + + + 223 + 1929 + 75 + + + + + + + + + params + 6825742 + + + id + 6660155 + + + function + 3940208 + + + index + 7997 + + + type_id + 2234478 + + + + + id + function + + + 12 + + + 1 + 2 + 6660155 + + + + + + + id + index + + + 12 + + + 1 + 2 + 6660155 + + + + + + + id + type_id + + + 12 + + + 1 + 2 + 6535025 + + + 2 + 4 + 125130 + + + + + + + function + id + + + 12 + + + 1 + 2 + 2303158 + + + 2 + 3 + 960590 + + + 3 + 4 + 433253 + + + 4 + 18 + 243205 + + + + + + + function + index + + + 12 + + + 1 + 2 + 2303158 + + + 2 + 3 + 960590 + + + 3 + 4 + 433253 + + + 4 + 18 + 243205 + + + + + + + function + type_id + + + 12 + + + 1 + 2 + 2605636 + + + 2 + 3 + 831225 + + + 3 + 4 + 349519 + + + 4 + 12 + 153826 + + + + + + + index + id + + + 12 + + + 2 + 3 + 940 + + + 4 + 5 + 470 + + + 6 + 7 + 470 + + + 8 + 9 + 940 + + + 9 + 10 + 470 + + + 10 + 11 + 940 + + + 11 + 12 + 470 + + + 19 + 20 + 470 + + + 64 + 65 + 470 + + + 194 + 195 + 470 + + + 517 + 518 + 470 + + + 1438 + 1439 + 470 + + + 3480 + 3481 + 470 + + + 8376 + 8377 + 470 + + + + + + + index + function + + + 12 + + + 2 + 3 + 940 + + + 4 + 5 + 470 + + + 6 + 7 + 470 + + + 8 + 9 + 940 + + + 9 + 10 + 470 + + + 10 + 11 + 940 + + + 11 + 12 + 470 + + + 19 + 20 + 470 + + + 64 + 65 + 470 + + + 194 + 195 + 470 + + + 517 + 518 + 470 + + + 1438 + 1439 + 470 + + + 3480 + 3481 + 470 + + + 8376 + 8377 + 470 + + + + + + + index + type_id + + + 12 + + + 1 + 2 + 940 + + + 3 + 4 + 470 + + + 4 + 5 + 470 + + + 5 + 6 + 470 + + + 6 + 7 + 1411 + + + 7 + 8 + 940 + + + 11 + 12 + 470 + + + 42 + 43 + 470 + + + 106 + 107 + 470 + + + 228 + 229 + 470 + + + 582 + 583 + 470 + + + 1275 + 1276 + 470 + + + 3666 + 3667 + 470 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 1525560 + + + 2 + 3 + 446425 + + + 3 + 8 + 171701 + + + 8 + 522 + 90790 + + + + + + + type_id + function + + + 12 + + + 1 + 2 + 1749008 + + + 2 + 3 + 250731 + + + 3 + 9 + 169820 + + + 9 + 506 + 64917 + + + + + + + type_id + index + + + 12 + + + 1 + 2 + 1801694 + + + 2 + 3 + 353282 + + + 3 + 13 + 79500 + + + + + + + + + overrides + 159827 + + + new + 125026 + + + old + 15096 + + + + + new + old + + + 12 + + + 1 + 2 + 90231 + + + 2 + 3 + 34788 + + + 3 + 4 + 6 + + + + + + + old + new + + + 12 + + + 1 + 2 + 7922 + + + 2 + 3 + 1905 + + + 3 + 4 + 987 + + + 4 + 5 + 1320 + + + 5 + 11 + 1213 + + + 11 + 60 + 1163 + + + 61 + 231 + 584 + + + + + + + + + membervariables + 1051873 + + + id + 1050083 + + + type_id + 326293 + + + name + 449643 + + + + + id + type_id + + + 12 + + + 1 + 2 + 1048372 + + + 2 + 4 + 1710 + + + + + + + id + name + + + 12 + + + 1 + 2 + 1050083 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 241965 + + + 2 + 3 + 51670 + + + 3 + 10 + 25417 + + + 10 + 4152 + 7239 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 254137 + + + 2 + 3 + 46261 + + + 3 + 40 + 24502 + + + 41 + 2031 + 1392 + + + + + + + name + id + + + 12 + + + 1 + 2 + 294034 + + + 2 + 3 + 86157 + + + 3 + 5 + 41010 + + + 5 + 646 + 28440 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 366230 + + + 2 + 3 + 51511 + + + 3 + 650 + 31901 + + + + + + + + + globalvariables + 300716 + + + id + 300708 + + + type_id + 1405 + + + name + 294738 + + + + + id + type_id + + + 12 + + + 1 + 2 + 300700 + + + 2 + 3 + 8 + + + + + + + id + name + + + 12 + + + 1 + 2 + 300708 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 977 + + + 2 + 3 + 159 + + + 3 + 7 + 114 + + + 7 + 77 + 106 + + + 83 + 169397 + 49 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 1010 + + + 2 + 3 + 135 + + + 3 + 7 + 112 + + + 7 + 105 + 106 + + + 106 + 168448 + 42 + + + + + + + name + id + + + 12 + + + 1 + 2 + 290989 + + + 2 + 33 + 3749 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 294142 + + + 2 + 12 + 596 + + + + + + + + + localvariables + 581698 + + + id + 581698 + + + type_id + 37905 + + + name + 91404 + + + + + id + type_id + + + 12 + + + 1 + 2 + 581698 + + + + + + + id + name + + + 12 + + + 1 + 2 + 581698 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 21207 + + + 2 + 3 + 5417 + + + 3 + 4 + 2479 + + + 4 + 7 + 3408 + + + 7 + 18 + 2878 + + + 18 + 15847 + 2513 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 26999 + + + 2 + 3 + 4606 + + + 3 + 5 + 2942 + + + 5 + 31 + 2845 + + + 31 + 3455 + 512 + + + + + + + name + id + + + 12 + + + 1 + 2 + 57570 + + + 2 + 3 + 14420 + + + 3 + 5 + 8388 + + + 5 + 15 + 7048 + + + 15 + 5176 + 3975 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 77215 + + + 2 + 3 + 7481 + + + 3 + 1486 + 6707 + + + + + + + + + autoderivation + 149665 + + + var + 149665 + + + derivation_type + 524 + + + + + var + derivation_type + + + 12 + + + 1 + 2 + 149665 + + + + + + + derivation_type + var + + + 12 + + + 33 + 34 + 104 + + + 90 + 91 + 104 + + + 353 + 354 + 104 + + + 392 + 393 + 104 + + + 560 + 561 + 104 + + + + + + + + + enumconstants + 240613 + + + id + 240613 + + + parent + 28401 + + + index + 10183 + + + type_id + 39 + + + name + 240334 + + + location + 220605 + + + + + id + parent + + + 12 + + + 1 + 2 + 240613 + + + + + + + id + index + + + 12 + + + 1 + 2 + 240613 + + + + + + + id + type_id + + + 12 + + + 1 + 2 + 240613 + + + + + + + id + name + + + 12 + + + 1 + 2 + 240613 + + + + + + + id + location + + + 12 + + + 1 + 2 + 240613 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 4017 + + + 3 + 4 + 5767 + + + 4 + 5 + 3898 + + + 5 + 6 + 3062 + + + 6 + 7 + 1829 + + + 7 + 8 + 1471 + + + 8 + 11 + 2585 + + + 11 + 17 + 2346 + + + 17 + 84 + 2147 + + + 94 + 257 + 278 + + + + + + + parent + index + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 4017 + + + 3 + 4 + 5767 + + + 4 + 5 + 3898 + + + 5 + 6 + 3062 + + + 6 + 7 + 1829 + + + 7 + 8 + 1471 + + + 8 + 11 + 2585 + + + 11 + 17 + 2346 + + + 17 + 84 + 2147 + + + 94 + 257 + 278 + + + + + + + parent + type_id + + + 12 + + + 1 + 2 + 28401 + + + + + + + parent + name + + + 12 + + + 1 + 2 + 994 + + + 2 + 3 + 4017 + + + 3 + 4 + 5767 + + + 4 + 5 + 3898 + + + 5 + 6 + 3062 + + + 6 + 7 + 1829 + + + 7 + 8 + 1471 + + + 8 + 11 + 2585 + + + 11 + 17 + 2346 + + + 17 + 84 + 2147 + + + 94 + 257 + 278 + + + + + + + parent + location + + + 12 + + + 1 + 2 + 1431 + + + 2 + 3 + 4176 + + + 3 + 4 + 5807 + + + 4 + 5 + 3858 + + + 5 + 6 + 3062 + + + 6 + 7 + 1789 + + + 7 + 8 + 1392 + + + 8 + 11 + 2505 + + + 11 + 17 + 2227 + + + 17 + 257 + 2147 + + + + + + + index + id + + + 12 + + + 1 + 2 + 2028 + + + 2 + 3 + 1630 + + + 3 + 4 + 1750 + + + 4 + 5 + 875 + + + 5 + 9 + 795 + + + 9 + 12 + 835 + + + 12 + 20 + 875 + + + 20 + 69 + 795 + + + 77 + 715 + 596 + + + + + + + index + parent + + + 12 + + + 1 + 2 + 2028 + + + 2 + 3 + 1630 + + + 3 + 4 + 1750 + + + 4 + 5 + 875 + + + 5 + 9 + 795 + + + 9 + 12 + 835 + + + 12 + 20 + 875 + + + 20 + 69 + 795 + + + 77 + 715 + 596 + + + + + + + index + type_id + + + 12 + + + 1 + 2 + 10183 + + + + + + + index + name + + + 12 + + + 1 + 2 + 2028 + + + 2 + 3 + 1630 + + + 3 + 4 + 1750 + + + 4 + 5 + 875 + + + 5 + 9 + 795 + + + 9 + 12 + 835 + + + 12 + 20 + 875 + + + 20 + 69 + 795 + + + 77 + 712 + 596 + + + + + + + index + location + + + 12 + + + 1 + 2 + 2028 + + + 2 + 3 + 1630 + + + 3 + 4 + 1750 + + + 4 + 5 + 875 + + + 5 + 9 + 795 + + + 9 + 12 + 835 + + + 12 + 20 + 875 + + + 20 + 69 + 795 + + + 77 + 715 + 596 + + + + + + + type_id + id + + + 12 + + + 6049 + 6050 + 39 + + + + + + + type_id + parent + + + 12 + + + 714 + 715 + 39 + + + + + + + type_id + index + + + 12 + + + 256 + 257 + 39 + + + + + + + type_id + name + + + 12 + + + 6042 + 6043 + 39 + + + + + + + type_id + location + + + 12 + + + 5546 + 5547 + 39 + + + + + + + name + id + + + 12 + + + 1 + 2 + 240056 + + + 2 + 3 + 278 + + + + + + + name + parent + + + 12 + + + 1 + 2 + 240056 + + + 2 + 3 + 278 + + + + + + + name + index + + + 12 + + + 1 + 2 + 240334 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 240334 + + + + + + + name + location + + + 12 + + + 1 + 2 + 240056 + + + 2 + 3 + 278 + + + + + + + location + id + + + 12 + + + 1 + 2 + 219849 + + + 2 + 205 + 755 + + + + + + + location + parent + + + 12 + + + 1 + 2 + 220605 + + + + + + + location + index + + + 12 + + + 1 + 2 + 219849 + + + 2 + 205 + 755 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 220605 + + + + + + + location + name + + + 12 + + + 1 + 2 + 219849 + + + 2 + 205 + 755 + + + + + + + + + builtintypes + 22109 + + + id + 22109 + + + name + 22109 + + + kind + 22109 + + + size + 3292 + + + sign + 1411 + + + alignment + 2352 + + + + + id + name + + + 12 + + + 1 + 2 + 22109 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 22109 + + + + + + + id + size + + + 12 + + + 1 + 2 + 22109 + + + + + + + id + sign + + + 12 + + + 1 + 2 + 22109 + + + + + + + id + alignment + + + 12 + + + 1 + 2 + 22109 + + + + + + + name + id + + + 12 + + + 1 + 2 + 22109 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 22109 + + + + + + + name + size + + + 12 + + + 1 + 2 + 22109 + + + + + + + name + sign + + + 12 + + + 1 + 2 + 22109 + + + + + + + name + alignment + + + 12 + + + 1 + 2 + 22109 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 22109 + + + + + + + kind + name + + + 12 + + + 1 + 2 + 22109 + + + + + + + kind + size + + + 12 + + + 1 + 2 + 22109 + + + + + + + kind + sign + + + 12 + + + 1 + 2 + 22109 + + + + + + + kind + alignment + + + 12 + + + 1 + 2 + 22109 + + + + + + + size + id + + + 12 + + + 1 + 2 + 470 + + + 2 + 3 + 470 + + + 4 + 5 + 470 + + + 7 + 8 + 470 + + + 9 + 10 + 470 + + + 11 + 12 + 470 + + + 13 + 14 + 470 + + + + + + + size + name + + + 12 + + + 1 + 2 + 470 + + + 2 + 3 + 470 + + + 4 + 5 + 470 + + + 7 + 8 + 470 + + + 9 + 10 + 470 + + + 11 + 12 + 470 + + + 13 + 14 + 470 + + + + + + + size + kind + + + 12 + + + 1 + 2 + 470 + + + 2 + 3 + 470 + + + 4 + 5 + 470 + + + 7 + 8 + 470 + + + 9 + 10 + 470 + + + 11 + 12 + 470 + + + 13 + 14 + 470 + + + + + + + size + sign + + + 12 + + + 1 + 2 + 940 + + + 3 + 4 + 2352 + + + + + + + size + alignment + + + 12 + + + 1 + 2 + 2352 + + + 2 + 3 + 940 + + + + + + + sign + id + + + 12 + + + 6 + 7 + 470 + + + 12 + 13 + 470 + + + 29 + 30 + 470 + + + + + + + sign + name + + + 12 + + + 6 + 7 + 470 + + + 12 + 13 + 470 + + + 29 + 30 + 470 + + + + + + + sign + kind + + + 12 + + + 6 + 7 + 470 + + + 12 + 13 + 470 + + + 29 + 30 + 470 + + + + + + + sign + size + + + 12 + + + 5 + 6 + 940 + + + 7 + 8 + 470 + + + + + + + sign + alignment + + + 12 + + + 5 + 6 + 1411 + + + + + + + alignment + id + + + 12 + + + 4 + 5 + 470 + + + 8 + 9 + 470 + + + 10 + 11 + 470 + + + 12 + 13 + 470 + + + 13 + 14 + 470 + + + + + + + alignment + name + + + 12 + + + 4 + 5 + 470 + + + 8 + 9 + 470 + + + 10 + 11 + 470 + + + 12 + 13 + 470 + + + 13 + 14 + 470 + + + + + + + alignment + kind + + + 12 + + + 4 + 5 + 470 + + + 8 + 9 + 470 + + + 10 + 11 + 470 + + + 12 + 13 + 470 + + + 13 + 14 + 470 + + + + + + + alignment + size + + + 12 + + + 1 + 2 + 470 + + + 2 + 3 + 1881 + + + + + + + alignment + sign + + + 12 + + + 3 + 4 + 2352 + + + + + + + + + derivedtypes + 4413446 + + + id + 4413446 + + + name + 2205312 + + + kind + 2822 + + + type_id + 2729356 + + + + + id + name + + + 12 + + + 1 + 2 + 4413446 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 4413446 + + + + + + + id + type_id + + + 12 + + + 1 + 2 + 4413446 + + + + + + + name + id + + + 12 + + + 1 + 2 + 1935763 + + + 2 + 5 + 171231 + + + 5 + 1173 + 98317 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 2204371 + + + 2 + 3 + 940 + + + + + + + name + type_id + + + 12 + + + 1 + 2 + 1935763 + + + 2 + 5 + 171231 + + + 5 + 1155 + 98317 + + + + + + + kind + id + + + 12 + + + 199 + 200 + 470 + + + 1103 + 1104 + 470 + + + 1154 + 1155 + 470 + + + 1223 + 1224 + 470 + + + 2193 + 2194 + 470 + + + 3510 + 3511 + 470 + + + + + + + kind + name + + + 12 + + + 1 + 2 + 470 + + + 164 + 165 + 470 + + + 611 + 612 + 470 + + + 783 + 784 + 470 + + + 1149 + 1150 + 470 + + + 1982 + 1983 + 470 + + + + + + + kind + type_id + + + 12 + + + 84 + 85 + 470 + + + 1103 + 1104 + 470 + + + 1154 + 1155 + 470 + + + 1223 + 1224 + 470 + + + 2148 + 2149 + 470 + + + 3510 + 3511 + 470 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 1685972 + + + 2 + 3 + 568733 + + + 3 + 4 + 367395 + + + 4 + 54 + 107254 + + + + + + + type_id + name + + + 12 + + + 1 + 2 + 1697262 + + + 2 + 3 + 561206 + + + 3 + 4 + 364572 + + + 4 + 54 + 106314 + + + + + + + type_id + kind + + + 12 + + + 1 + 2 + 1690206 + + + 2 + 3 + 572496 + + + 3 + 4 + 366454 + + + 4 + 6 + 100198 + + + + + + + + + pointerishsize + 3314342 + + + id + 3314342 + + + size + 35 + + + alignment + 35 + + + + + id + size + + + 12 + + + 1 + 2 + 3314342 + + + + + + + id + alignment + + + 12 + + + 1 + 2 + 3314342 + + + + + + + size + id + + + 12 + + + 94071 + 94072 + 35 + + + + + + + size + alignment + + + 12 + + + 1 + 2 + 35 + + + + + + + alignment + id + + + 12 + + + 94071 + 94072 + 35 + + + + + + + alignment + size + + + 12 + + + 1 + 2 + 35 + + + + + + + + + arraysizes + 71503 + + + id + 71503 + + + num_elements + 23520 + + + bytesize + 26343 + + + alignment + 1881 + + + + + id + num_elements + + + 12 + + + 1 + 2 + 71503 + + + + + + + id + bytesize + + + 12 + + + 1 + 2 + 71503 + + + + + + + id + alignment + + + 12 + + + 1 + 2 + 71503 + + + + + + + num_elements + id + + + 12 + + + 1 + 2 + 2352 + + + 2 + 3 + 15053 + + + 3 + 4 + 1411 + + + 4 + 6 + 1881 + + + 6 + 11 + 1881 + + + 12 + 14 + 940 + + + + + + + num_elements + bytesize + + + 12 + + + 1 + 2 + 18346 + + + 2 + 3 + 2352 + + + 3 + 4 + 1881 + + + 4 + 7 + 940 + + + + + + + num_elements + alignment + + + 12 + + + 1 + 2 + 18346 + + + 2 + 3 + 2822 + + + 3 + 4 + 1411 + + + 4 + 5 + 940 + + + + + + + bytesize + id + + + 12 + + + 1 + 2 + 2822 + + + 2 + 3 + 16934 + + + 3 + 4 + 3292 + + + 4 + 8 + 2352 + + + 11 + 16 + 940 + + + + + + + bytesize + num_elements + + + 12 + + + 1 + 2 + 21639 + + + 2 + 3 + 3292 + + + 3 + 5 + 1411 + + + + + + + bytesize + alignment + + + 12 + + + 1 + 2 + 22109 + + + 2 + 3 + 3292 + + + 4 + 5 + 940 + + + + + + + alignment + id + + + 12 + + + 5 + 6 + 470 + + + 16 + 17 + 470 + + + 31 + 32 + 470 + + + 100 + 101 + 470 + + + + + + + alignment + num_elements + + + 12 + + + 4 + 5 + 470 + + + 7 + 8 + 940 + + + 50 + 51 + 470 + + + + + + + alignment + bytesize + + + 12 + + + 4 + 5 + 470 + + + 7 + 8 + 470 + + + 8 + 9 + 470 + + + 50 + 51 + 470 + + + + + + + + + typedefbase + 1724183 + + + id + 1724183 + + + type_id + 803747 + + + + + id + type_id + + + 12 + + + 1 + 2 + 1724183 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 623381 + + + 2 + 3 + 84307 + + + 3 + 6 + 64497 + + + 6 + 5443 + 31560 + + + + + + + + + decltypes + 355640 + + + id + 23953 + + + expr + 355640 + + + base_type + 17181 + + + parentheses_would_change_meaning + 18 + + + + + id + expr + + + 12 + + + 1 + 2 + 5961 + + + 2 + 3 + 7492 + + + 3 + 4 + 3259 + + + 4 + 7 + 1999 + + + 7 + 18 + 1999 + + + 18 + 42 + 2017 + + + 42 + 1767 + 1224 + + + + + + + id + base_type + + + 12 + + + 1 + 2 + 23953 + + + + + + + id + parentheses_would_change_meaning + + + 12 + + + 1 + 2 + 23953 + + + + + + + expr + id + + + 12 + + + 1 + 2 + 355640 + + + + + + + expr + base_type + + + 12 + + + 1 + 2 + 355640 + + + + + + + expr + parentheses_would_change_meaning + + + 12 + + + 1 + 2 + 355640 + + + + + + + base_type + id + + + 12 + + + 1 + 2 + 14479 + + + 2 + 3 + 2215 + + + 3 + 149 + 486 + + + + + + + base_type + expr + + + 12 + + + 1 + 2 + 1800 + + + 2 + 3 + 7348 + + + 3 + 4 + 3079 + + + 4 + 5 + 1422 + + + 5 + 11 + 1368 + + + 11 + 43 + 1566 + + + 43 + 6569 + 594 + + + + + + + base_type + parentheses_would_change_meaning + + + 12 + + + 1 + 2 + 17181 + + + + + + + parentheses_would_change_meaning + id + + + 12 + + + 1330 + 1331 + 18 + + + + + + + parentheses_would_change_meaning + expr + + + 12 + + + 19747 + 19748 + 18 + + + + + + + parentheses_would_change_meaning + base_type + + + 12 + + + 954 + 955 + 18 + + + + + + + + + usertypes + 5342989 + + + id + 5342989 + + + name + 1383024 + + + kind + 5174 + + + + + id + name + + + 12 + + + 1 + 2 + 5342989 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 5342989 + + + + + + + name + id + + + 12 + + + 1 + 2 + 1001986 + + + 2 + 3 + 161352 + + + 3 + 7 + 107725 + + + 7 + 80 + 104432 + + + 80 + 885 + 7526 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 1240488 + + + 2 + 3 + 127012 + + + 3 + 7 + 15523 + + + + + + + kind + id + + + 12 + + + 6 + 7 + 470 + + + 10 + 11 + 470 + + + 26 + 27 + 470 + + + 124 + 125 + 470 + + + 139 + 140 + 470 + + + 700 + 701 + 470 + + + 861 + 862 + 470 + + + 963 + 964 + 470 + + + 1762 + 1763 + 470 + + + 1899 + 1900 + 470 + + + 4868 + 4869 + 470 + + + + + + + kind + name + + + 12 + + + 5 + 6 + 470 + + + 6 + 7 + 470 + + + 14 + 15 + 470 + + + 30 + 31 + 470 + + + 44 + 45 + 470 + + + 126 + 127 + 470 + + + 269 + 270 + 470 + + + 373 + 374 + 470 + + + 433 + 434 + 470 + + + 748 + 749 + 470 + + + 1236 + 1237 + 470 + + + + + + + + + usertypesize + 1755594 + + + id + 1755594 + + + size + 13642 + + + alignment + 2352 + + + + + id + size + + + 12 + + + 1 + 2 + 1755594 + + + + + + + id + alignment + + + 12 + + + 1 + 2 + 1755594 + + + + + + + size + id + + + 12 + + + 1 + 2 + 3292 + + + 2 + 3 + 4233 + + + 3 + 4 + 470 + + + 4 + 5 + 940 + + + 6 + 8 + 940 + + + 9 + 15 + 940 + + + 37 + 84 + 940 + + + 92 + 163 + 940 + + + 748 + 2539 + 940 + + + + + + + size + alignment + + + 12 + + + 1 + 2 + 10349 + + + 2 + 3 + 2822 + + + 3 + 4 + 470 + + + + + + + alignment + id + + + 12 + + + 2 + 3 + 470 + + + 6 + 7 + 470 + + + 184 + 185 + 470 + + + 254 + 255 + 470 + + + 3286 + 3287 + 470 + + + + + + + alignment + size + + + 12 + + + 1 + 2 + 470 + + + 2 + 3 + 470 + + + 3 + 4 + 470 + + + 9 + 10 + 470 + + + 22 + 23 + 470 + + + + + + + + + usertype_final + 9537 + + + id + 9537 + + + + + + usertype_uuid + 36102 + + + id + 36102 + + + uuid + 35737 + + + + + id + uuid + + + 12 + + + 1 + 2 + 36102 + + + + + + + uuid + id + + + 12 + + + 1 + 2 + 35373 + + + 2 + 3 + 364 + + + + + + + + + mangled_name + 5264430 + + + id + 5264430 + + + mangled_name + 1235313 + + + + + id + mangled_name + + + 12 + + + 1 + 2 + 5264430 + + + + + + + mangled_name + id + + + 12 + + + 1 + 2 + 731027 + + + 2 + 3 + 178287 + + + 3 + 4 + 84674 + + + 4 + 6 + 86086 + + + 6 + 13 + 93142 + + + 13 + 885 + 62094 + + + + + + + + + is_pod_class + 554327 + + + id + 554327 + + + + + + is_standard_layout_class + 1295997 + + + id + 1295997 + + + + + + is_complete + 1694439 + + + id + 1694439 + + + + + + is_class_template + 405028 + + + id + 405028 + + + + + + class_instantiation + 1121943 + + + to + 1121943 + + + from + 170761 + + + + + to + from + + + 12 + + + 1 + 2 + 1121943 + + + + + + + from + to + + + 12 + + + 1 + 2 + 58802 + + + 2 + 3 + 30106 + + + 3 + 4 + 16464 + + + 4 + 5 + 14582 + + + 5 + 7 + 15523 + + + 7 + 13 + 13171 + + + 13 + 29 + 13171 + + + 30 + 84 + 8937 + + + + + + + + + class_template_argument + 2978116 + + + type_id + 1355715 + + + index + 1295 + + + arg_type + 863387 + + + + + type_id + index + + + 12 + + + 1 + 2 + 551563 + + + 2 + 3 + 411593 + + + 3 + 4 + 246019 + + + 4 + 7 + 122356 + + + 7 + 113 + 24182 + + + + + + + type_id + arg_type + + + 12 + + + 1 + 2 + 577422 + + + 2 + 3 + 424939 + + + 3 + 4 + 257885 + + + 4 + 113 + 95468 + + + + + + + index + type_id + + + 12 + + + 1 + 2 + 11 + + + 2 + 3 + 821 + + + 3 + 26 + 104 + + + 29 + 64 + 104 + + + 69 + 411 + 104 + + + 592 + 8835 + 104 + + + 13776 + 114840 + 46 + + + + + + + index + arg_type + + + 12 + + + 1 + 2 + 11 + + + 2 + 3 + 821 + + + 3 + 14 + 115 + + + 14 + 26 + 104 + + + 28 + 145 + 104 + + + 195 + 4197 + 104 + + + 10467 + 39739 + 34 + + + + + + + arg_type + type_id + + + 12 + + + 1 + 2 + 535650 + + + 2 + 3 + 181071 + + + 3 + 4 + 52573 + + + 4 + 10 + 65688 + + + 10 + 11334 + 28403 + + + + + + + arg_type + index + + + 12 + + + 1 + 2 + 755683 + + + 2 + 3 + 85741 + + + 3 + 22 + 21961 + + + + + + + + + class_template_argument_value + 508520 + + + type_id + 316590 + + + index + 1881 + + + arg_value + 508520 + + + + + type_id + index + + + 12 + + + 1 + 2 + 261081 + + + 2 + 3 + 53627 + + + 3 + 4 + 1881 + + + + + + + type_id + arg_value + + + 12 + + + 1 + 2 + 200397 + + + 2 + 3 + 81852 + + + 3 + 5 + 29165 + + + 5 + 9 + 5174 + + + + + + + index + type_id + + + 12 + + + 18 + 19 + 470 + + + 92 + 93 + 470 + + + 309 + 310 + 470 + + + 376 + 377 + 470 + + + + + + + index + arg_value + + + 12 + + + 19 + 20 + 470 + + + 124 + 125 + 470 + + + 425 + 426 + 470 + + + 513 + 514 + 470 + + + + + + + arg_value + type_id + + + 12 + + + 1 + 2 + 508520 + + + + + + + arg_value + index + + + 12 + + + 1 + 2 + 508520 + + + + + + + + + is_proxy_class_for + 65387 + + + id + 65387 + + + templ_param_id + 65387 + + + + + id + templ_param_id + + + 12 + + + 1 + 2 + 65387 + + + + + + + templ_param_id + id + + + 12 + + + 1 + 2 + 65387 + + + + + + + + + type_mentions + 4011508 + + + id + 4011508 + + + type_id + 197335 + + + location + 3978135 + + + kind + 39 + + + + + id + type_id + + + 12 + + + 1 + 2 + 4011508 + + + + + + + id + location + + + 12 + + + 1 + 2 + 4011508 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 4011508 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 97176 + + + 2 + 3 + 21638 + + + 3 + 4 + 8194 + + + 4 + 5 + 10739 + + + 5 + 7 + 14319 + + + 7 + 12 + 15791 + + + 12 + 27 + 15115 + + + 27 + 8555 + 14359 + + + + + + + type_id + location + + + 12 + + + 1 + 2 + 97176 + + + 2 + 3 + 21638 + + + 3 + 4 + 8194 + + + 4 + 5 + 10739 + + + 5 + 7 + 14319 + + + 7 + 12 + 15791 + + + 12 + 27 + 15115 + + + 27 + 8555 + 14359 + + + + + + + type_id + kind + + + 12 + + + 1 + 2 + 197335 + + + + + + + location + id + + + 12 + + + 1 + 2 + 3944762 + + + 2 + 3 + 33373 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 3944762 + + + 2 + 3 + 33373 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 3978135 + + + + + + + kind + id + + + 12 + + + 100849 + 100850 + 39 + + + + + + + kind + type_id + + + 12 + + + 4961 + 4962 + 39 + + + + + + + kind + location + + + 12 + + + 100010 + 100011 + 39 + + + + + + + + + is_function_template + 1413601 + + + id + 1413601 + + + + + + function_instantiation + 906422 + + + to + 906422 + + + from + 146002 + + + + + to + from + + + 12 + + + 1 + 2 + 906422 + + + + + + + from + to + + + 12 + + + 1 + 2 + 101152 + + + 2 + 3 + 14480 + + + 3 + 6 + 12014 + + + 6 + 21 + 12049 + + + 22 + 869 + 6306 + + + + + + + + + function_template_argument + 2339815 + + + function_id + 1318394 + + + index + 563 + + + arg_type + 305041 + + + + + function_id + index + + + 12 + + + 1 + 2 + 679667 + + + 2 + 3 + 388084 + + + 3 + 4 + 179966 + + + 4 + 15 + 70676 + + + + + + + function_id + arg_type + + + 12 + + + 1 + 2 + 694852 + + + 2 + 3 + 393404 + + + 3 + 4 + 150970 + + + 4 + 9 + 79167 + + + + + + + index + function_id + + + 12 + + + 1 + 2 + 211 + + + 7 + 8 + 35 + + + 35 + 36 + 35 + + + 108 + 109 + 35 + + + 164 + 165 + 35 + + + 294 + 295 + 35 + + + 849 + 850 + 35 + + + 3293 + 3294 + 35 + + + 8487 + 8488 + 35 + + + 17489 + 17490 + 35 + + + 34459 + 34460 + 35 + + + + + + + index + arg_type + + + 12 + + + 1 + 2 + 211 + + + 3 + 4 + 35 + + + 11 + 12 + 35 + + + 22 + 23 + 35 + + + 30 + 31 + 35 + + + 61 + 62 + 35 + + + 134 + 135 + 35 + + + 453 + 454 + 35 + + + 1126 + 1127 + 35 + + + 2404 + 2405 + 35 + + + 5842 + 5843 + 35 + + + + + + + arg_type + function_id + + + 12 + + + 1 + 2 + 186978 + + + 2 + 3 + 44850 + + + 3 + 5 + 23218 + + + 5 + 16 + 23535 + + + 16 + 107 + 23006 + + + 108 + 955 + 3452 + + + + + + + arg_type + index + + + 12 + + + 1 + 2 + 274918 + + + 2 + 4 + 26001 + + + 4 + 17 + 4122 + + + + + + + + + function_template_argument_value + 362998 + + + function_id + 181340 + + + index + 563 + + + arg_value + 360356 + + + + + function_id + index + + + 12 + + + 1 + 2 + 171969 + + + 2 + 8 + 9371 + + + + + + + function_id + arg_value + + + 12 + + + 1 + 2 + 151428 + + + 2 + 3 + 20681 + + + 3 + 97 + 9230 + + + + + + + index + function_id + + + 12 + + + 1 + 2 + 211 + + + 2 + 3 + 70 + + + 11 + 12 + 35 + + + 26 + 27 + 35 + + + 94 + 95 + 35 + + + 314 + 315 + 35 + + + 709 + 710 + 35 + + + 992 + 993 + 35 + + + 1187 + 1188 + 35 + + + 2148 + 2149 + 35 + + + + + + + index + arg_value + + + 12 + + + 1 + 2 + 211 + + + 2 + 3 + 70 + + + 60 + 61 + 35 + + + 80 + 81 + 35 + + + 141 + 142 + 35 + + + 533 + 534 + 35 + + + 1610 + 1611 + 35 + + + 1821 + 1822 + 35 + + + 2202 + 2203 + 35 + + + 3771 + 3772 + 35 + + + + + + + arg_value + function_id + + + 12 + + + 1 + 2 + 357714 + + + 2 + 3 + 2642 + + + + + + + arg_value + index + + + 12 + + + 1 + 2 + 360356 + + + + + + + + + is_variable_template + 42132 + + + id + 42132 + + + + + + variable_instantiation + 49154 + + + to + 49154 + + + from + 25049 + + + + + to + from + + + 12 + + + 1 + 2 + 49154 + + + + + + + from + to + + + 12 + + + 1 + 2 + 14358 + + + 2 + 3 + 7650 + + + 3 + 8 + 1991 + + + 8 + 14 + 1048 + + + + + + + + + variable_template_argument + 327628 + + + variable_id + 26411 + + + index + 1781 + + + arg_type + 216742 + + + + + variable_id + index + + + 12 + + + 1 + 2 + 16140 + + + 2 + 3 + 5659 + + + 3 + 4 + 3877 + + + 4 + 17 + 733 + + + + + + + variable_id + arg_type + + + 12 + + + 1 + 2 + 5974 + + + 2 + 3 + 5240 + + + 3 + 4 + 1991 + + + 4 + 5 + 1152 + + + 5 + 6 + 2410 + + + 6 + 8 + 2305 + + + 8 + 11 + 2200 + + + 11 + 18 + 2410 + + + 18 + 67 + 1991 + + + 80 + 516 + 733 + + + + + + + index + variable_id + + + 12 + + + 1 + 2 + 104 + + + 2 + 3 + 628 + + + 3 + 4 + 419 + + + 5 + 6 + 209 + + + 27 + 28 + 104 + + + 42 + 43 + 104 + + + 79 + 80 + 104 + + + 248 + 249 + 104 + + + + + + + index + arg_type + + + 12 + + + 1 + 2 + 104 + + + 12 + 13 + 628 + + + 13 + 14 + 104 + + + 14 + 15 + 314 + + + 24 + 25 + 104 + + + 32 + 33 + 104 + + + 128 + 129 + 104 + + + 437 + 438 + 104 + + + 636 + 637 + 104 + + + 890 + 891 + 104 + + + + + + + arg_type + variable_id + + + 12 + + + 1 + 2 + 180793 + + + 2 + 3 + 20856 + + + 3 + 37 + 15092 + + + + + + + arg_type + index + + + 12 + + + 1 + 2 + 199553 + + + 2 + 5 + 16769 + + + 5 + 6 + 419 + + + + + + + + + variable_template_argument_value + 15616 + + + variable_id + 2829 + + + index + 419 + + + arg_value + 12052 + + + + + variable_id + index + + + 12 + + + 1 + 2 + 2620 + + + 2 + 3 + 209 + + + + + + + variable_id + arg_value + + + 12 + + + 2 + 3 + 419 + + + 3 + 4 + 104 + + + 4 + 5 + 1362 + + + 5 + 6 + 209 + + + 6 + 7 + 209 + + + 8 + 9 + 209 + + + 12 + 17 + 209 + + + 20 + 21 + 104 + + + + + + + index + variable_id + + + 12 + + + 2 + 3 + 104 + + + 6 + 7 + 104 + + + 8 + 9 + 104 + + + 13 + 14 + 104 + + + + + + + index + arg_value + + + 12 + + + 12 + 13 + 104 + + + 30 + 31 + 104 + + + 33 + 34 + 104 + + + 40 + 41 + 104 + + + + + + + arg_value + variable_id + + + 12 + + + 1 + 2 + 8489 + + + 2 + 3 + 3563 + + + + + + + arg_value + index + + + 12 + + + 1 + 2 + 12052 + + + + + + + + + routinetypes + 546982 + + + id + 546982 + + + return_type + 285945 + + + + + id + return_type + + + 12 + + + 1 + 2 + 546982 + + + + + + + return_type + id + + + 12 + + + 1 + 2 + 249233 + + + 2 + 3 + 21315 + + + 3 + 3594 + 15396 + + + + + + + + + routinetypeargs + 993519 + + + routine + 429019 + + + index + 7997 + + + type_id + 229563 + + + + + routine + index + + + 12 + + + 1 + 2 + 155707 + + + 2 + 3 + 135479 + + + 3 + 4 + 63976 + + + 4 + 5 + 46100 + + + 5 + 18 + 27754 + + + + + + + routine + type_id + + + 12 + + + 1 + 2 + 185814 + + + 2 + 3 + 135009 + + + 3 + 4 + 59272 + + + 4 + 5 + 33869 + + + 5 + 11 + 15053 + + + + + + + index + routine + + + 12 + + + 2 + 3 + 940 + + + 4 + 5 + 470 + + + 6 + 7 + 470 + + + 8 + 9 + 940 + + + 9 + 10 + 470 + + + 10 + 11 + 1411 + + + 13 + 14 + 470 + + + 28 + 29 + 470 + + + 59 + 60 + 470 + + + 157 + 158 + 470 + + + 293 + 294 + 470 + + + 581 + 582 + 470 + + + 912 + 913 + 470 + + + + + + + index + type_id + + + 12 + + + 1 + 2 + 940 + + + 3 + 4 + 940 + + + 4 + 5 + 1411 + + + 5 + 6 + 940 + + + 6 + 7 + 940 + + + 10 + 11 + 470 + + + 14 + 15 + 470 + + + 47 + 48 + 470 + + + 90 + 91 + 470 + + + 176 + 177 + 470 + + + 349 + 350 + 470 + + + + + + + type_id + routine + + + 12 + + + 1 + 2 + 148651 + + + 2 + 3 + 31047 + + + 3 + 5 + 16934 + + + 5 + 12 + 18346 + + + 12 + 113 + 14582 + + + + + + + type_id + index + + + 12 + + + 1 + 2 + 174994 + + + 2 + 3 + 31047 + + + 3 + 6 + 18816 + + + 6 + 14 + 4704 + + + + + + + + + ptrtomembers + 38103 + + + id + 38103 + + + type_id + 38103 + + + class_id + 15523 + + + + + id + type_id + + + 12 + + + 1 + 2 + 38103 + + + + + + + id + class_id + + + 12 + + + 1 + 2 + 38103 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 38103 + + + + + + + type_id + class_id + + + 12 + + + 1 + 2 + 38103 + + + + + + + class_id + id + + + 12 + + + 1 + 2 + 13642 + + + 8 + 9 + 1411 + + + 28 + 29 + 470 + + + + + + + class_id + type_id + + + 12 + + + 1 + 2 + 13642 + + + 8 + 9 + 1411 + + + 28 + 29 + 470 + + + + + + + + + specifiers + 24932 + + + id + 24932 + + + str + 24932 + + + + + id + str + + + 12 + + + 1 + 2 + 24932 + + + + + + + str + id + + + 12 + + + 1 + 2 + 24932 + + + + + + + + + typespecifiers + 1317166 + + + type_id + 1298819 + + + spec_id + 3763 + + + + + type_id + spec_id + + + 12 + + + 1 + 2 + 1280473 + + + 2 + 3 + 18346 + + + + + + + spec_id + type_id + + + 12 + + + 8 + 9 + 470 + + + 36 + 37 + 470 + + + 51 + 52 + 470 + + + 86 + 87 + 470 + + + 105 + 106 + 470 + + + 219 + 220 + 470 + + + 226 + 227 + 470 + + + 2069 + 2070 + 470 + + + + + + + + + funspecifiers + 13049498 + + + func_id + 3975160 + + + spec_id + 704 + + + + + func_id + spec_id + + + 12 + + + 1 + 2 + 314977 + + + 2 + 3 + 544551 + + + 3 + 4 + 1145438 + + + 4 + 5 + 1732127 + + + 5 + 8 + 238064 + + + + + + + spec_id + func_id + + + 12 + + + 13 + 14 + 70 + + + 98 + 99 + 35 + + + 200 + 201 + 35 + + + 296 + 297 + 35 + + + 304 + 305 + 35 + + + 572 + 573 + 35 + + + 716 + 717 + 35 + + + 1599 + 1600 + 35 + + + 1646 + 1647 + 35 + + + 3782 + 3783 + 35 + + + 3902 + 3903 + 35 + + + 5095 + 5096 + 35 + + + 6814 + 6815 + 35 + + + 9303 + 9304 + 35 + + + 12218 + 12219 + 35 + + + 52896 + 52897 + 35 + + + 79931 + 79932 + 35 + + + 91328 + 91329 + 35 + + + 99658 + 99659 + 35 + + + + + + + + + varspecifiers + 2347848 + + + var_id + 1255071 + + + spec_id + 3763 + + + + + var_id + spec_id + + + 12 + + + 1 + 2 + 735731 + + + 2 + 3 + 203219 + + + 3 + 4 + 58802 + + + 4 + 5 + 257317 + + + + + + + spec_id + var_id + + + 12 + + + 112 + 113 + 470 + + + 315 + 316 + 470 + + + 414 + 415 + 470 + + + 560 + 561 + 470 + + + 692 + 693 + 470 + + + 700 + 701 + 470 + + + 732 + 733 + 470 + + + 1466 + 1467 + 470 + + + + + + + + + attributes + 696970 + + + id + 696970 + + + kind + 314 + + + name + 1676 + + + name_space + 209 + + + location + 484420 + + + + + id + kind + + + 12 + + + 1 + 2 + 696970 + + + + + + + id + name + + + 12 + + + 1 + 2 + 696970 + + + + + + + id + name_space + + + 12 + + + 1 + 2 + 696970 + + + + + + + id + location + + + 12 + + + 1 + 2 + 696970 + + + + + + + kind + id + + + 12 + + + 4 + 5 + 104 + + + 2168 + 2169 + 104 + + + 4478 + 4479 + 104 + + + + + + + kind + name + + + 12 + + + 1 + 2 + 104 + + + 6 + 7 + 104 + + + 11 + 12 + 104 + + + + + + + kind + name_space + + + 12 + + + 1 + 2 + 209 + + + 2 + 3 + 104 + + + + + + + kind + location + + + 12 + + + 2 + 3 + 104 + + + 2055 + 2056 + 104 + + + 2565 + 2566 + 104 + + + + + + + name + id + + + 12 + + + 1 + 2 + 209 + + + 2 + 3 + 104 + + + 4 + 5 + 209 + + + 5 + 6 + 104 + + + 9 + 10 + 104 + + + 14 + 15 + 104 + + + 16 + 17 + 104 + + + 18 + 19 + 104 + + + 24 + 25 + 104 + + + 86 + 87 + 104 + + + 115 + 116 + 104 + + + 659 + 660 + 104 + + + 1760 + 1761 + 104 + + + 3932 + 3933 + 104 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 1467 + + + 2 + 3 + 209 + + + + + + + name + name_space + + + 12 + + + 1 + 2 + 1676 + + + + + + + name + location + + + 12 + + + 1 + 2 + 314 + + + 2 + 3 + 209 + + + 4 + 5 + 104 + + + 6 + 7 + 104 + + + 8 + 9 + 104 + + + 9 + 10 + 104 + + + 14 + 15 + 104 + + + 18 + 19 + 104 + + + 59 + 60 + 104 + + + 72 + 73 + 104 + + + 331 + 332 + 104 + + + 1756 + 1757 + 104 + + + 2379 + 2380 + 104 + + + + + + + name_space + id + + + 12 + + + 23 + 24 + 104 + + + 6627 + 6628 + 104 + + + + + + + name_space + kind + + + 12 + + + 1 + 2 + 104 + + + 3 + 4 + 104 + + + + + + + name_space + name + + + 12 + + + 2 + 3 + 104 + + + 14 + 15 + 104 + + + + + + + name_space + location + + + 12 + + + 9 + 10 + 104 + + + 4613 + 4614 + 104 + + + + + + + location + id + + + 12 + + + 1 + 2 + 443126 + + + 2 + 9 + 36787 + + + 9 + 201 + 4506 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 484420 + + + + + + + location + name + + + 12 + + + 1 + 2 + 480123 + + + 2 + 3 + 4297 + + + + + + + location + name_space + + + 12 + + + 1 + 2 + 484420 + + + + + + + + + attribute_args + 352341 + + + id + 352341 + + + kind + 1411 + + + attribute + 270489 + + + index + 1411 + + + location + 329291 + + + + + id + kind + + + 12 + + + 1 + 2 + 352341 + + + + + + + id + attribute + + + 12 + + + 1 + 2 + 352341 + + + + + + + id + index + + + 12 + + + 1 + 2 + 352341 + + + + + + + id + location + + + 12 + + + 1 + 2 + 352341 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 470 + + + 54 + 55 + 470 + + + 694 + 695 + 470 + + + + + + + kind + attribute + + + 12 + + + 1 + 2 + 470 + + + 54 + 55 + 470 + + + 542 + 543 + 470 + + + + + + + kind + index + + + 12 + + + 1 + 2 + 940 + + + 3 + 4 + 470 + + + + + + + kind + location + + + 12 + + + 1 + 2 + 470 + + + 54 + 55 + 470 + + + 672 + 673 + 470 + + + + + + + attribute + id + + + 12 + + + 1 + 2 + 204631 + + + 2 + 3 + 49864 + + + 3 + 4 + 15994 + + + + + + + attribute + kind + + + 12 + + + 1 + 2 + 260140 + + + 2 + 3 + 10349 + + + + + + + attribute + index + + + 12 + + + 1 + 2 + 204631 + + + 2 + 3 + 49864 + + + 3 + 4 + 15994 + + + + + + + attribute + location + + + 12 + + + 1 + 2 + 204631 + + + 2 + 3 + 49864 + + + 3 + 4 + 15994 + + + + + + + index + id + + + 12 + + + 34 + 35 + 470 + + + 140 + 141 + 470 + + + 575 + 576 + 470 + + + + + + + index + kind + + + 12 + + + 1 + 2 + 940 + + + 3 + 4 + 470 + + + + + + + index + attribute + + + 12 + + + 34 + 35 + 470 + + + 140 + 141 + 470 + + + 575 + 576 + 470 + + + + + + + index + location + + + 12 + + + 34 + 35 + 470 + + + 140 + 141 + 470 + + + 526 + 527 + 470 + + + + + + + location + id + + + 12 + + + 1 + 2 + 315179 + + + 2 + 16 + 14112 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 316590 + + + 2 + 3 + 12701 + + + + + + + location + attribute + + + 12 + + + 1 + 2 + 315179 + + + 2 + 16 + 14112 + + + + + + + location + index + + + 12 + + + 1 + 2 + 329291 + + + + + + + + + attribute_arg_value + 351871 + + + arg + 351871 + + + value + 34810 + + + + + arg + value + + + 12 + + + 1 + 2 + 351871 + + + + + + + value + arg + + + 12 + + + 1 + 2 + 16934 + + + 2 + 3 + 12230 + + + 3 + 14 + 2822 + + + 15 + 247 + 2822 + + + + + + + + + attribute_arg_type + 470 + + + arg + 470 + + + type_id + 470 + + + + + arg + type_id + + + 12 + + + 1 + 2 + 470 + + + + + + + type_id + arg + + + 12 + + + 1 + 2 + 470 + + + + + + + + + attribute_arg_name + 6 + + + arg + 6 + + + name + 5 + + + + + arg + name + + + 12 + + + 1 + 2 + 6 + + + + + + + name + arg + + + 12 + + + 1 + 2 + 4 + + + 2 + 3 + 1 + + + + + + + + + typeattributes + 62570 + + + type_id + 62150 + + + spec_id + 62570 + + + + + type_id + spec_id + + + 12 + + + 1 + 2 + 61731 + + + 2 + 3 + 419 + + + + + + + spec_id + type_id + + + 12 + + + 1 + 2 + 62570 + + + + + + + + + funcattributes + 635532 + + + func_id + 447366 + + + spec_id + 635532 + + + + + func_id + spec_id + + + 12 + + + 1 + 2 + 341522 + + + 2 + 3 + 64917 + + + 3 + 6 + 39985 + + + 6 + 7 + 940 + + + + + + + spec_id + func_id + + + 12 + + + 1 + 2 + 635532 + + + + + + + + + varattributes + 371048 + + + var_id + 322247 + + + spec_id + 371048 + + + + + var_id + spec_id + + + 12 + + + 1 + 2 + 273482 + + + 2 + 3 + 48762 + + + 14 + 15 + 3 + + + + + + + spec_id + var_id + + + 12 + + + 1 + 2 + 371048 + + + + + + + + + stmtattributes + 1006 + + + stmt_id + 1006 + + + spec_id + 1006 + + + + + stmt_id + spec_id + + + 12 + + + 1 + 2 + 1006 + + + + + + + spec_id + stmt_id + + + 12 + + + 1 + 2 + 1006 + + + + + + + + + unspecifiedtype + 10352924 + + + type_id + 10352924 + + + unspecified_type_id + 6956047 + + + + + type_id + unspecified_type_id + + + 12 + + + 1 + 2 + 10352924 + + + + + + + unspecified_type_id + type_id + + + 12 + + + 1 + 2 + 4675939 + + + 2 + 3 + 2037843 + + + 3 + 147 + 242264 + + + + + + + + + member + 5134480 + + + parent + 689567 + + + index + 8808 + + + child + 5070710 + + + + + parent + index + + + 12 + + + 1 + 3 + 18884 + + + 3 + 4 + 390691 + + + 4 + 5 + 39072 + + + 5 + 7 + 53059 + + + 7 + 10 + 52848 + + + 10 + 16 + 57569 + + + 16 + 30 + 52954 + + + 30 + 251 + 24486 + + + + + + + parent + child + + + 12 + + + 1 + 3 + 18884 + + + 3 + 4 + 390656 + + + 4 + 5 + 39107 + + + 5 + 7 + 53165 + + + 7 + 10 + 53165 + + + 10 + 16 + 57323 + + + 16 + 29 + 52742 + + + 29 + 253 + 24521 + + + + + + + index + parent + + + 12 + + + 1 + 2 + 1409 + + + 2 + 3 + 810 + + + 3 + 4 + 951 + + + 5 + 22 + 669 + + + 22 + 42 + 669 + + + 42 + 56 + 669 + + + 56 + 100 + 669 + + + 104 + 164 + 669 + + + 181 + 299 + 669 + + + 300 + 727 + 669 + + + 845 + 4002 + 669 + + + 4606 + 19241 + 281 + + + + + + + index + child + + + 12 + + + 1 + 2 + 810 + + + 2 + 3 + 880 + + + 3 + 4 + 1162 + + + 4 + 15 + 669 + + + 16 + 35 + 739 + + + 36 + 55 + 669 + + + 57 + 93 + 739 + + + 97 + 135 + 669 + + + 140 + 256 + 669 + + + 268 + 612 + 669 + + + 619 + 2611 + 669 + + + 2770 + 19253 + 458 + + + + + + + child + parent + + + 12 + + + 1 + 2 + 5070710 + + + + + + + child + index + + + 12 + + + 1 + 2 + 5008419 + + + 2 + 8 + 62290 + + + + + + + + + enclosingfunction + 121743 + + + child + 121743 + + + parent + 69504 + + + + + child + parent + + + 12 + + + 1 + 2 + 121743 + + + + + + + parent + child + + + 12 + + + 1 + 2 + 36695 + + + 2 + 3 + 21591 + + + 3 + 4 + 6106 + + + 4 + 45 + 5111 + + + + + + + + + derivations + 402388 + + + derivation + 402388 + + + sub + 381883 + + + index + 211 + + + super + 206461 + + + location + 38156 + + + + + derivation + sub + + + 12 + + + 1 + 2 + 402388 + + + + + + + derivation + index + + + 12 + + + 1 + 2 + 402388 + + + + + + + derivation + super + + + 12 + + + 1 + 2 + 402388 + + + + + + + derivation + location + + + 12 + + + 1 + 2 + 402388 + + + + + + + sub + derivation + + + 12 + + + 1 + 2 + 366733 + + + 2 + 7 + 15149 + + + + + + + sub + index + + + 12 + + + 1 + 2 + 366733 + + + 2 + 7 + 15149 + + + + + + + sub + super + + + 12 + + + 1 + 2 + 366733 + + + 2 + 7 + 15149 + + + + + + + sub + location + + + 12 + + + 1 + 2 + 366733 + + + 2 + 7 + 15149 + + + + + + + index + derivation + + + 12 + + + 25 + 26 + 105 + + + 77 + 78 + 35 + + + 430 + 431 + 35 + + + 10839 + 10840 + 35 + + + + + + + index + sub + + + 12 + + + 25 + 26 + 105 + + + 77 + 78 + 35 + + + 430 + 431 + 35 + + + 10839 + 10840 + 35 + + + + + + + index + super + + + 12 + + + 23 + 24 + 35 + + + 25 + 26 + 70 + + + 35 + 36 + 35 + + + 261 + 262 + 35 + + + 5505 + 5506 + 35 + + + + + + + index + location + + + 12 + + + 1 + 2 + 105 + + + 9 + 10 + 35 + + + 66 + 67 + 35 + + + 1005 + 1006 + 35 + + + + + + + super + derivation + + + 12 + + + 1 + 2 + 199133 + + + 2 + 1225 + 7328 + + + + + + + super + sub + + + 12 + + + 1 + 2 + 199133 + + + 2 + 1225 + 7328 + + + + + + + super + index + + + 12 + + + 1 + 2 + 206003 + + + 2 + 4 + 458 + + + + + + + super + location + + + 12 + + + 1 + 2 + 202867 + + + 2 + 108 + 3593 + + + + + + + location + derivation + + + 12 + + + 1 + 2 + 28326 + + + 2 + 5 + 3135 + + + 5 + 16 + 2994 + + + 17 + 133 + 2994 + + + 142 + 474 + 704 + + + + + + + location + sub + + + 12 + + + 1 + 2 + 28326 + + + 2 + 5 + 3135 + + + 5 + 16 + 2994 + + + 17 + 133 + 2994 + + + 142 + 474 + 704 + + + + + + + location + index + + + 12 + + + 1 + 2 + 38156 + + + + + + + location + super + + + 12 + + + 1 + 2 + 30757 + + + 2 + 5 + 3417 + + + 5 + 55 + 2889 + + + 60 + 420 + 1092 + + + + + + + + + derspecifiers + 404291 + + + der_id + 402001 + + + spec_id + 140 + + + + + der_id + spec_id + + + 12 + + + 1 + 2 + 399710 + + + 2 + 3 + 2290 + + + + + + + spec_id + der_id + + + 12 + + + 65 + 66 + 35 + + + 93 + 94 + 35 + + + 1132 + 1133 + 35 + + + 10185 + 10186 + 35 + + + + + + + + + direct_base_offsets + 373110 + + + der_id + 373110 + + + offset + 352 + + + + + der_id + offset + + + 12 + + + 1 + 2 + 373110 + + + + + + + offset + der_id + + + 12 + + + 1 + 2 + 35 + + + 2 + 3 + 105 + + + 3 + 4 + 70 + + + 4 + 5 + 70 + + + 85 + 86 + 35 + + + 10484 + 10485 + 35 + + + + + + + + + virtual_base_offsets + 6661 + + + sub + 3677 + + + super + 508 + + + offset + 254 + + + + + sub + super + + + 12 + + + 1 + 2 + 2891 + + + 2 + 4 + 323 + + + 4 + 7 + 265 + + + 7 + 11 + 196 + + + + + + + sub + offset + + + 12 + + + 1 + 2 + 3099 + + + 2 + 4 + 312 + + + 4 + 8 + 265 + + + + + + + super + sub + + + 12 + + + 1 + 2 + 80 + + + 2 + 3 + 46 + + + 3 + 4 + 57 + + + 4 + 5 + 92 + + + 5 + 7 + 34 + + + 8 + 13 + 46 + + + 13 + 15 + 46 + + + 15 + 23 + 46 + + + 24 + 60 + 46 + + + 194 + 195 + 11 + + + + + + + super + offset + + + 12 + + + 1 + 2 + 289 + + + 2 + 3 + 80 + + + 4 + 6 + 34 + + + 6 + 8 + 46 + + + 8 + 10 + 46 + + + 14 + 15 + 11 + + + + + + + offset + sub + + + 12 + + + 2 + 3 + 34 + + + 4 + 5 + 11 + + + 5 + 6 + 23 + + + 6 + 8 + 23 + + + 8 + 9 + 34 + + + 10 + 12 + 23 + + + 14 + 15 + 11 + + + 18 + 19 + 23 + + + 26 + 29 + 23 + + + 30 + 37 + 23 + + + 96 + 98 + 23 + + + + + + + offset + super + + + 12 + + + 1 + 2 + 80 + + + 2 + 3 + 34 + + + 3 + 4 + 46 + + + 5 + 7 + 23 + + + 7 + 10 + 23 + + + 12 + 14 + 23 + + + 21 + 29 + 23 + + + + + + + + + frienddecls + 715075 + + + id + 715075 + + + type_id + 42384 + + + decl_id + 70182 + + + location + 6341 + + + + + id + type_id + + + 12 + + + 1 + 2 + 715075 + + + + + + + id + decl_id + + + 12 + + + 1 + 2 + 715075 + + + + + + + id + location + + + 12 + + + 1 + 2 + 715075 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 6200 + + + 2 + 3 + 13212 + + + 3 + 6 + 2959 + + + 6 + 10 + 3206 + + + 10 + 17 + 3276 + + + 17 + 24 + 3347 + + + 25 + 36 + 3311 + + + 37 + 55 + 3241 + + + 55 + 103 + 3628 + + + + + + + type_id + decl_id + + + 12 + + + 1 + 2 + 6200 + + + 2 + 3 + 13212 + + + 3 + 6 + 2959 + + + 6 + 10 + 3206 + + + 10 + 17 + 3276 + + + 17 + 24 + 3347 + + + 25 + 36 + 3311 + + + 37 + 55 + 3241 + + + 55 + 103 + 3628 + + + + + + + type_id + location + + + 12 + + + 1 + 2 + 40939 + + + 2 + 13 + 1444 + + + + + + + decl_id + id + + + 12 + + + 1 + 2 + 40481 + + + 2 + 3 + 5883 + + + 3 + 8 + 6024 + + + 8 + 15 + 5425 + + + 15 + 32 + 5284 + + + 32 + 71 + 5284 + + + 72 + 160 + 1796 + + + + + + + decl_id + type_id + + + 12 + + + 1 + 2 + 40481 + + + 2 + 3 + 5883 + + + 3 + 8 + 6024 + + + 8 + 15 + 5425 + + + 15 + 32 + 5284 + + + 32 + 71 + 5284 + + + 72 + 160 + 1796 + + + + + + + decl_id + location + + + 12 + + + 1 + 2 + 69513 + + + 2 + 5 + 669 + + + + + + + location + id + + + 12 + + + 1 + 2 + 5954 + + + 2 + 20106 + 387 + + + + + + + location + type_id + + + 12 + + + 1 + 2 + 6200 + + + 2 + 1105 + 140 + + + + + + + location + decl_id + + + 12 + + + 1 + 2 + 5989 + + + 2 + 1837 + 352 + + + + + + + + + comments + 9004230 + + + id + 9004230 + + + contents + 3538304 + + + location + 9004230 + + + + + id + contents + + + 12 + + + 1 + 2 + 9004230 + + + + + + + id + location + + + 12 + + + 1 + 2 + 9004230 + + + + + + + contents + id + + + 12 + + + 1 + 2 + 3247882 + + + 2 + 10 + 268307 + + + 10 + 32841 + 22114 + + + + + + + contents + location + + + 12 + + + 1 + 2 + 3247882 + + + 2 + 10 + 268307 + + + 10 + 32841 + 22114 + + + + + + + location + id + + + 12 + + + 1 + 2 + 9004230 + + + + + + + location + contents + + + 12 + + + 1 + 2 + 9004230 + + + + + + + + + commentbinding + 3145674 + + + id + 2490384 + + + element + 3068526 + + + + + id + element + + + 12 + + + 1 + 2 + 2408061 + + + 2 + 97 + 82322 + + + + + + + element + id + + + 12 + + + 1 + 2 + 2991378 + + + 2 + 3 + 77148 + + + + + + + + + exprconv + 7003750 + + + converted + 7003750 + + + conversion + 7003750 + + + + + converted + conversion + + + 12 + + + 1 + 2 + 7003750 + + + + + + + conversion + converted + + + 12 + + + 1 + 2 + 7003750 + + + + + + + + + compgenerated + 8494343 + + + id + 8494343 + + + + + + synthetic_destructor_call + 133110 + + + element + 103484 + + + i + 306 + + + destructor_call + 117766 + + + + + element + i + + + 12 + + + 1 + 2 + 85546 + + + 2 + 3 + 11832 + + + 3 + 18 + 6105 + + + + + + + element + destructor_call + + + 12 + + + 1 + 2 + 85546 + + + 2 + 3 + 11832 + + + 3 + 18 + 6105 + + + + + + + i + element + + + 12 + + + 1 + 2 + 18 + + + 2 + 3 + 54 + + + 3 + 4 + 18 + + + 4 + 5 + 54 + + + 6 + 7 + 18 + + + 11 + 12 + 18 + + + 20 + 21 + 18 + + + 34 + 35 + 18 + + + 65 + 66 + 18 + + + 152 + 153 + 18 + + + 339 + 340 + 18 + + + 996 + 997 + 18 + + + 5746 + 5747 + 18 + + + + + + + i + destructor_call + + + 12 + + + 1 + 2 + 18 + + + 2 + 3 + 54 + + + 3 + 4 + 18 + + + 4 + 5 + 54 + + + 6 + 7 + 18 + + + 11 + 12 + 18 + + + 20 + 21 + 18 + + + 34 + 35 + 18 + + + 65 + 66 + 18 + + + 151 + 152 + 18 + + + 338 + 339 + 18 + + + 995 + 996 + 18 + + + 4897 + 4898 + 18 + + + + + + + destructor_call + element + + + 12 + + + 1 + 2 + 115749 + + + 2 + 26 + 2017 + + + + + + + destructor_call + i + + + 12 + + + 1 + 2 + 117766 + + + + + + + + + namespaces + 12701 + + + id + 12701 + + + name + 10349 + + + + + id + name + + + 12 + + + 1 + 2 + 12701 + + + + + + + name + id + + + 12 + + + 1 + 2 + 8937 + + + 2 + 3 + 470 + + + 3 + 4 + 940 + + + + + + + + + namespace_inline + 1411 + + + id + 1411 + + + + + + namespacembrs + 2463100 + + + parentid + 10819 + + + memberid + 2463100 + + + + + parentid + memberid + + + 12 + + + 1 + 2 + 1881 + + + 2 + 3 + 940 + + + 3 + 4 + 470 + + + 4 + 5 + 940 + + + 5 + 7 + 940 + + + 7 + 8 + 940 + + + 8 + 12 + 940 + + + 17 + 30 + 940 + + + 43 + 47 + 940 + + + 52 + 143 + 940 + + + 253 + 4592 + 940 + + + + + + + memberid + parentid + + + 12 + + + 1 + 2 + 2463100 + + + + + + + + + exprparents + 14152882 + + + expr_id + 14152882 + + + child_index + 14602 + + + parent_id + 9417999 + + + + + expr_id + child_index + + + 12 + + + 1 + 2 + 14152882 + + + + + + + expr_id + parent_id + + + 12 + + + 1 + 2 + 14152882 + + + + + + + child_index + expr_id + + + 12 + + + 1 + 2 + 2809 + + + 2 + 3 + 1107 + + + 3 + 4 + 266 + + + 4 + 5 + 6542 + + + 5 + 8 + 1210 + + + 8 + 11 + 1189 + + + 11 + 53 + 1107 + + + 56 + 354077 + 369 + + + + + + + child_index + parent_id + + + 12 + + + 1 + 2 + 2809 + + + 2 + 3 + 1107 + + + 3 + 4 + 266 + + + 4 + 5 + 6542 + + + 5 + 8 + 1210 + + + 8 + 11 + 1189 + + + 11 + 53 + 1107 + + + 56 + 354077 + 369 + + + + + + + parent_id + expr_id + + + 12 + + + 1 + 2 + 5388939 + + + 2 + 3 + 3692597 + + + 3 + 712 + 336462 + + + + + + + parent_id + child_index + + + 12 + + + 1 + 2 + 5388939 + + + 2 + 3 + 3692597 + + + 3 + 712 + 336462 + + + + + + + + + expr_isload + 4981789 + + + expr_id + 4981789 + + + + + + conversionkinds + 4220621 + + + expr_id + 4220621 + + + kind + 6 + + + + + expr_id + kind + + + 12 + + + 1 + 2 + 4220621 + + + + + + + kind + expr_id + + + 12 + + + 2139 + 2140 + 1 + + + 3252 + 3253 + 1 + + + 13442 + 13443 + 1 + + + 26289 + 26290 + 1 + + + 44470 + 44471 + 1 + + + 4131029 + 4131030 + 1 + + + + + + + + + iscall + 3078157 + + + caller + 3078157 + + + kind + 54 + + + + + caller + kind + + + 12 + + + 1 + 2 + 3078157 + + + + + + + kind + caller + + + 12 + + + 1378 + 1379 + 18 + + + 2512 + 2513 + 18 + + + 167025 + 167026 + 18 + + + + + + + + + numtemplatearguments + 543303 + + + expr_id + 543303 + + + num + 72 + + + + + expr_id + num + + + 12 + + + 1 + 2 + 543303 + + + + + + + num + expr_id + + + 12 + + + 26 + 27 + 18 + + + 28 + 29 + 18 + + + 220 + 221 + 18 + + + 29893 + 29894 + 18 + + + + + + + + + specialnamequalifyingelements + 470 + + + id + 470 + + + name + 470 + + + + + id + name + + + 12 + + + 1 + 2 + 470 + + + + + + + name + id + + + 12 + + + 1 + 2 + 470 + + + + + + + + + namequalifiers + 1618961 + + + id + 1618961 + + + qualifiableelement + 1618961 + + + qualifyingelement + 79675 + + + location + 282719 + + + + + id + qualifiableelement + + + 12 + + + 1 + 2 + 1618961 + + + + + + + id + qualifyingelement + + + 12 + + + 1 + 2 + 1618961 + + + + + + + id + location + + + 12 + + + 1 + 2 + 1618961 + + + + + + + qualifiableelement + id + + + 12 + + + 1 + 2 + 1618961 + + + + + + + qualifiableelement + qualifyingelement + + + 12 + + + 1 + 2 + 1618961 + + + + + + + qualifiableelement + location + + + 12 + + + 1 + 2 + 1618961 + + + + + + + qualifyingelement + id + + + 12 + + + 1 + 2 + 45546 + + + 2 + 3 + 17163 + + + 3 + 4 + 6195 + + + 4 + 8 + 6087 + + + 8 + 31227 + 4682 + + + + + + + qualifyingelement + qualifiableelement + + + 12 + + + 1 + 2 + 45546 + + + 2 + 3 + 17163 + + + 3 + 4 + 6195 + + + 4 + 8 + 6087 + + + 8 + 31227 + 4682 + + + + + + + qualifyingelement + location + + + 12 + + + 1 + 2 + 49725 + + + 2 + 3 + 15992 + + + 3 + 4 + 6411 + + + 4 + 9 + 6123 + + + 9 + 7095 + 1422 + + + + + + + location + id + + + 12 + + + 1 + 2 + 91742 + + + 2 + 3 + 25646 + + + 3 + 4 + 42179 + + + 4 + 6 + 12895 + + + 6 + 7 + 89869 + + + 7 + 2135 + 20387 + + + + + + + location + qualifiableelement + + + 12 + + + 1 + 2 + 91742 + + + 2 + 3 + 25646 + + + 3 + 4 + 42179 + + + 4 + 6 + 12895 + + + 6 + 7 + 89869 + + + 7 + 2135 + 20387 + + + + + + + location + qualifyingelement + + + 12 + + + 1 + 2 + 125168 + + + 2 + 3 + 52354 + + + 3 + 4 + 96622 + + + 4 + 152 + 8572 + + + + + + + + + varbind + 6006364 + + + expr + 6006364 + + + var + 765629 + + + + + expr + var + + + 12 + + + 1 + 2 + 6006364 + + + + + + + var + expr + + + 12 + + + 1 + 2 + 125745 + + + 2 + 3 + 137353 + + + 3 + 4 + 105891 + + + 4 + 5 + 84889 + + + 5 + 6 + 61057 + + + 6 + 7 + 47931 + + + 7 + 9 + 59396 + + + 9 + 13 + 59047 + + + 13 + 28 + 58657 + + + 28 + 5137 + 25657 + + + + + + + + + funbind + 3080553 + + + expr + 3076933 + + + fun + 514037 + + + + + expr + fun + + + 12 + + + 1 + 2 + 3073313 + + + 2 + 3 + 3619 + + + + + + + fun + expr + + + 12 + + + 1 + 2 + 306546 + + + 2 + 3 + 78793 + + + 3 + 4 + 37226 + + + 4 + 7 + 43475 + + + 7 + 38 + 38703 + + + 38 + 4943 + 9293 + + + + + + + + + expr_allocator + 46541 + + + expr + 46541 + + + func + 105 + + + form + 35 + + + + + expr + func + + + 12 + + + 1 + 2 + 46541 + + + + + + + expr + form + + + 12 + + + 1 + 2 + 46541 + + + + + + + func + expr + + + 12 + + + 1 + 2 + 35 + + + 585 + 586 + 35 + + + 735 + 736 + 35 + + + + + + + func + form + + + 12 + + + 1 + 2 + 105 + + + + + + + form + expr + + + 12 + + + 1321 + 1322 + 35 + + + + + + + form + func + + + 12 + + + 3 + 4 + 35 + + + + + + + + + expr_deallocator + 55314 + + + expr + 55314 + + + func + 105 + + + form + 70 + + + + + expr + func + + + 12 + + + 1 + 2 + 55314 + + + + + + + expr + form + + + 12 + + + 1 + 2 + 55314 + + + + + + + func + expr + + + 12 + + + 1 + 2 + 35 + + + 722 + 723 + 35 + + + 847 + 848 + 35 + + + + + + + func + form + + + 12 + + + 1 + 2 + 105 + + + + + + + form + expr + + + 12 + + + 722 + 723 + 35 + + + 848 + 849 + 35 + + + + + + + form + func + + + 12 + + + 1 + 2 + 35 + + + 2 + 3 + 35 + + + + + + + + + expr_cond_two_operand + 484 + + + cond + 484 + + + + + + expr_cond_guard + 654502 + + + cond + 654502 + + + guard + 654502 + + + + + cond + guard + + + 12 + + + 1 + 2 + 654502 + + + + + + + guard + cond + + + 12 + + + 1 + 2 + 654502 + + + + + + + + + expr_cond_true + 654499 + + + cond + 654499 + + + true + 654499 + + + + + cond + true + + + 12 + + + 1 + 2 + 654499 + + + + + + + true + cond + + + 12 + + + 1 + 2 + 654499 + + + + + + + + + expr_cond_false + 654502 + + + cond + 654502 + + + false + 654502 + + + + + cond + false + + + 12 + + + 1 + 2 + 654502 + + + + + + + false + cond + + + 12 + + + 1 + 2 + 654502 + + + + + + + + + values + 10646146 + + + id + 10646146 + + + str + 86639 + + + + + id + str + + + 12 + + + 1 + 2 + 10646146 + + + + + + + str + id + + + 12 + + + 1 + 2 + 58708 + + + 2 + 3 + 12259 + + + 3 + 6 + 6747 + + + 6 + 62 + 6513 + + + 62 + 451065 + 2410 + + + + + + + + + valuetext + 4756729 + + + id + 4756729 + + + text + 703924 + + + + + id + text + + + 12 + + + 1 + 2 + 4756729 + + + + + + + text + id + + + 12 + + + 1 + 2 + 527529 + + + 2 + 3 + 102489 + + + 3 + 7 + 56759 + + + 7 + 425881 + 17147 + + + + + + + + + valuebind + 11083050 + + + val + 10646146 + + + expr + 11083050 + + + + + val + expr + + + 12 + + + 1 + 2 + 10232022 + + + 2 + 7 + 414124 + + + + + + + expr + val + + + 12 + + + 1 + 2 + 11083050 + + + + + + + + + fieldoffsets + 1050083 + + + id + 1050083 + + + byteoffset + 22593 + + + bitoffset + 318 + + + + + id + byteoffset + + + 12 + + + 1 + 2 + 1050083 + + + + + + + id + bitoffset + + + 12 + + + 1 + 2 + 1050083 + + + + + + + byteoffset + id + + + 12 + + + 1 + 2 + 12967 + + + 2 + 3 + 1710 + + + 3 + 5 + 1789 + + + 5 + 12 + 1909 + + + 12 + 35 + 1710 + + + 35 + 205 + 1710 + + + 244 + 5638 + 795 + + + + + + + byteoffset + bitoffset + + + 12 + + + 1 + 2 + 21917 + + + 2 + 9 + 676 + + + + + + + bitoffset + id + + + 12 + + + 29 + 30 + 39 + + + 30 + 31 + 39 + + + 33 + 34 + 39 + + + 36 + 37 + 39 + + + 42 + 43 + 39 + + + 43 + 44 + 39 + + + 55 + 56 + 39 + + + 26131 + 26132 + 39 + + + + + + + bitoffset + byteoffset + + + 12 + + + 11 + 12 + 159 + + + 12 + 13 + 79 + + + 13 + 14 + 39 + + + 568 + 569 + 39 + + + + + + + + + bitfield + 20961 + + + id + 20961 + + + bits + 2620 + + + declared_bits + 2620 + + + + + id + bits + + + 12 + + + 1 + 2 + 20961 + + + + + + + id + declared_bits + + + 12 + + + 1 + 2 + 20961 + + + + + + + bits + id + + + 12 + + + 1 + 2 + 733 + + + 2 + 3 + 628 + + + 3 + 4 + 209 + + + 4 + 5 + 209 + + + 5 + 6 + 209 + + + 6 + 8 + 209 + + + 8 + 11 + 209 + + + 12 + 115 + 209 + + + + + + + bits + declared_bits + + + 12 + + + 1 + 2 + 2620 + + + + + + + declared_bits + id + + + 12 + + + 1 + 2 + 733 + + + 2 + 3 + 628 + + + 3 + 4 + 209 + + + 4 + 5 + 209 + + + 5 + 6 + 209 + + + 6 + 8 + 209 + + + 8 + 11 + 209 + + + 12 + 115 + 209 + + + + + + + declared_bits + bits + + + 12 + + + 1 + 2 + 2620 + + + + + + + + + initialisers + 1731850 + + + init + 1731850 + + + var + 717751 + + + expr + 1731850 + + + location + 390432 + + + + + init + var + + + 12 + + + 1 + 2 + 1731850 + + + + + + + init + expr + + + 12 + + + 1 + 2 + 1731850 + + + + + + + init + location + + + 12 + + + 1 + 2 + 1731850 + + + + + + + var + init + + + 12 + + + 1 + 2 + 629393 + + + 2 + 16 + 31625 + + + 16 + 25 + 56687 + + + 25 + 112 + 44 + + + + + + + var + expr + + + 12 + + + 1 + 2 + 629393 + + + 2 + 16 + 31625 + + + 16 + 25 + 56687 + + + 25 + 112 + 44 + + + + + + + var + location + + + 12 + + + 1 + 2 + 717669 + + + 2 + 4 + 81 + + + + + + + expr + init + + + 12 + + + 1 + 2 + 1731850 + + + + + + + expr + var + + + 12 + + + 1 + 2 + 1731850 + + + + + + + expr + location + + + 12 + + + 1 + 2 + 1731850 + + + + + + + location + init + + + 12 + + + 1 + 2 + 317950 + + + 2 + 3 + 23835 + + + 3 + 15 + 30789 + + + 15 + 111459 + 17856 + + + + + + + location + var + + + 12 + + + 1 + 2 + 340950 + + + 2 + 4 + 35580 + + + 4 + 12738 + 13901 + + + + + + + location + expr + + + 12 + + + 1 + 2 + 317950 + + + 2 + 3 + 23835 + + + 3 + 15 + 30789 + + + 15 + 111459 + 17856 + + + + + + + + + expr_ancestor + 121674 + + + exp + 121674 + + + ancestor + 84880 + + + + + exp + ancestor + + + 12 + + + 1 + 2 + 121674 + + + + + + + ancestor + exp + + + 12 + + + 1 + 2 + 61377 + + + 2 + 3 + 16785 + + + 3 + 8 + 6483 + + + 8 + 18 + 234 + + + + + + + + + exprs + 18300140 + + + id + 18300140 + + + kind + 3382 + + + location + 3561673 + + + + + id + kind + + + 12 + + + 1 + 2 + 18300140 + + + + + + + id + location + + + 12 + + + 1 + 2 + 18300140 + + + + + + + kind + id + + + 12 + + + 1 + 5 + 281 + + + 5 + 14 + 211 + + + 14 + 38 + 281 + + + 42 + 66 + 281 + + + 82 + 135 + 281 + + + 141 + 334 + 281 + + + 338 + 509 + 281 + + + 563 + 830 + 281 + + + 831 + 1183 + 281 + + + 1184 + 2071 + 281 + + + 2627 + 5700 + 281 + + + 6591 + 63491 + 281 + + + 78915 + 109590 + 70 + + + + + + + kind + location + + + 12 + + + 1 + 2 + 281 + + + 2 + 3 + 176 + + + 3 + 6 + 281 + + + 6 + 13 + 281 + + + 14 + 26 + 281 + + + 28 + 62 + 246 + + + 63 + 83 + 281 + + + 91 + 183 + 281 + + + 206 + 342 + 281 + + + 353 + 448 + 281 + + + 468 + 1018 + 281 + + + 1051 + 14609 + 281 + + + 16974 + 32757 + 140 + + + + + + + location + id + + + 12 + + + 1 + 2 + 1936933 + + + 2 + 3 + 816932 + + + 3 + 4 + 247260 + + + 4 + 8 + 280872 + + + 8 + 136 + 267131 + + + 136 + 54140 + 12542 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 2363808 + + + 2 + 3 + 873691 + + + 3 + 6 + 307261 + + + 6 + 25 + 16911 + + + + + + + + + expr_types + 18357789 + + + id + 18300140 + + + typeid + 829282 + + + value_category + 54 + + + + + id + typeid + + + 12 + + + 1 + 2 + 18242562 + + + 2 + 5 + 57577 + + + + + + + id + value_category + + + 12 + + + 1 + 2 + 18300140 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 293470 + + + 2 + 3 + 160720 + + + 3 + 4 + 69824 + + + 4 + 5 + 60801 + + + 5 + 7 + 66996 + + + 7 + 12 + 65321 + + + 12 + 35 + 62638 + + + 35 + 78674 + 49509 + + + + + + + typeid + value_category + + + 12 + + + 1 + 2 + 716180 + + + 2 + 3 + 102314 + + + 3 + 4 + 10787 + + + + + + + value_category + id + + + 12 + + + 11828 + 11829 + 18 + + + 253738 + 253739 + 18 + + + 750551 + 750552 + 18 + + + + + + + value_category + typeid + + + 12 + + + 1446 + 1447 + 18 + + + 11978 + 11979 + 18 + + + 39501 + 39502 + 18 + + + + + + + + + new_allocated_type + 47598 + + + expr + 47598 + + + type_id + 28150 + + + + + expr + type_id + + + 12 + + + 1 + 2 + 47598 + + + + + + + type_id + expr + + + 12 + + + 1 + 2 + 11767 + + + 2 + 3 + 14903 + + + 3 + 19 + 1479 + + + + + + + + + new_array_allocated_type + 5099 + + + expr + 5099 + + + type_id + 2194 + + + + + expr + type_id + + + 12 + + + 1 + 2 + 5099 + + + + + + + type_id + expr + + + 12 + + + 1 + 2 + 31 + + + 2 + 3 + 1942 + + + 3 + 7 + 169 + + + 8 + 15 + 50 + + + + + + + + + aggregate_field_init + 4005579 + + + aggregate + 847953 + + + initializer + 4005406 + + + field + 2156 + + + + + aggregate + initializer + + + 12 + + + 1 + 2 + 6503 + + + 2 + 3 + 500733 + + + 3 + 4 + 11095 + + + 4 + 5 + 88743 + + + 5 + 12 + 49719 + + + 12 + 13 + 190968 + + + 13 + 42 + 192 + + + + + + + aggregate + field + + + 12 + + + 1 + 2 + 6502 + + + 2 + 3 + 500702 + + + 3 + 4 + 11095 + + + 4 + 5 + 88750 + + + 5 + 12 + 49743 + + + 12 + 13 + 190968 + + + 13 + 42 + 193 + + + + + + + initializer + aggregate + + + 12 + + + 1 + 2 + 4005406 + + + + + + + initializer + field + + + 12 + + + 1 + 2 + 4005233 + + + 2 + 3 + 173 + + + + + + + field + aggregate + + + 12 + + + 1 + 2 + 782 + + + 2 + 3 + 202 + + + 3 + 6 + 158 + + + 6 + 12 + 184 + + + 12 + 21 + 163 + + + 21 + 44 + 164 + + + 46 + 106 + 171 + + + 108 + 383 + 167 + + + 394 + 190920 + 163 + + + 288611 + 288612 + 2 + + + + + + + field + initializer + + + 12 + + + 1 + 2 + 782 + + + 2 + 3 + 202 + + + 3 + 6 + 158 + + + 6 + 12 + 184 + + + 12 + 21 + 163 + + + 21 + 44 + 164 + + + 46 + 106 + 171 + + + 108 + 383 + 167 + + + 394 + 190920 + 163 + + + 288611 + 288612 + 2 + + + + + + + + + aggregate_array_init + 730401 + + + aggregate + 65615 + + + initializer + 730401 + + + element_index + 17485 + + + + + aggregate + initializer + + + 12 + + + 1 + 2 + 7521 + + + 2 + 3 + 7791 + + + 3 + 4 + 17335 + + + 4 + 5 + 8012 + + + 5 + 6 + 5810 + + + 6 + 8 + 5006 + + + 8 + 11 + 5381 + + + 11 + 22 + 4985 + + + 22 + 17486 + 3774 + + + + + + + aggregate + element_index + + + 12 + + + 1 + 2 + 7521 + + + 2 + 3 + 7791 + + + 3 + 4 + 17335 + + + 4 + 5 + 8012 + + + 5 + 6 + 5810 + + + 6 + 8 + 5006 + + + 8 + 11 + 5381 + + + 11 + 22 + 4985 + + + 22 + 17486 + 3774 + + + + + + + initializer + aggregate + + + 12 + + + 1 + 2 + 730401 + + + + + + + initializer + element_index + + + 12 + + + 1 + 2 + 730401 + + + + + + + element_index + aggregate + + + 12 + + + 1 + 2 + 6580 + + + 2 + 3 + 2653 + + + 3 + 5 + 1308 + + + 5 + 6 + 1488 + + + 7 + 9 + 1059 + + + 9 + 15 + 1388 + + + 15 + 27 + 1379 + + + 27 + 198 + 1316 + + + 202 + 65616 + 314 + + + + + + + element_index + initializer + + + 12 + + + 1 + 2 + 6580 + + + 2 + 3 + 2653 + + + 3 + 5 + 1308 + + + 5 + 6 + 1488 + + + 7 + 9 + 1059 + + + 9 + 15 + 1388 + + + 15 + 27 + 1379 + + + 27 + 198 + 1316 + + + 202 + 65616 + 314 + + + + + + + + + condition_decl_bind + 38595 + + + expr + 38595 + + + decl + 38595 + + + + + expr + decl + + + 12 + + + 1 + 2 + 38595 + + + + + + + decl + expr + + + 12 + + + 1 + 2 + 38595 + + + + + + + + + typeid_bind + 36430 + + + expr + 36430 + + + type_id + 16383 + + + + + expr + type_id + + + 12 + + + 1 + 2 + 36430 + + + + + + + type_id + expr + + + 12 + + + 1 + 2 + 15960 + + + 3 + 328 + 422 + + + + + + + + + uuidof_bind + 19994 + + + expr + 19994 + + + type_id + 19799 + + + + + expr + type_id + + + 12 + + + 1 + 2 + 19994 + + + + + + + type_id + expr + + + 12 + + + 1 + 2 + 19635 + + + 2 + 4 + 163 + + + + + + + + + sizeof_bind + 191854 + + + expr + 191854 + + + type_id + 8194 + + + + + expr + type_id + + + 12 + + + 1 + 2 + 191854 + + + + + + + type_id + expr + + + 12 + + + 1 + 2 + 2697 + + + 2 + 3 + 2330 + + + 3 + 4 + 776 + + + 4 + 5 + 750 + + + 5 + 6 + 212 + + + 6 + 9 + 723 + + + 9 + 133 + 649 + + + 164 + 18023 + 53 + + + + + + + + + code_block + 15 + + + block + 15 + + + routine + 15 + + + + + block + routine + + + 12 + + + 1 + 2 + 15 + + + + + + + routine + block + + + 12 + + + 1 + 2 + 15 + + + + + + + + + lambdas + 21639 + + + expr + 21639 + + + default_capture + 470 + + + has_explicit_return_type + 470 + + + + + expr + default_capture + + + 12 + + + 1 + 2 + 21639 + + + + + + + expr + has_explicit_return_type + + + 12 + + + 1 + 2 + 21639 + + + + + + + default_capture + expr + + + 12 + + + 46 + 47 + 470 + + + + + + + default_capture + has_explicit_return_type + + + 12 + + + 1 + 2 + 470 + + + + + + + has_explicit_return_type + expr + + + 12 + + + 46 + 47 + 470 + + + + + + + has_explicit_return_type + default_capture + + + 12 + + + 1 + 2 + 470 + + + + + + + + + lambda_capture + 28224 + + + id + 28224 + + + lambda + 20698 + + + index + 940 + + + field + 28224 + + + captured_by_reference + 470 + + + is_implicit + 470 + + + location + 2822 + + + + + id + lambda + + + 12 + + + 1 + 2 + 28224 + + + + + + + id + index + + + 12 + + + 1 + 2 + 28224 + + + + + + + id + field + + + 12 + + + 1 + 2 + 28224 + + + + + + + id + captured_by_reference + + + 12 + + + 1 + 2 + 28224 + + + + + + + id + is_implicit + + + 12 + + + 1 + 2 + 28224 + + + + + + + id + location + + + 12 + + + 1 + 2 + 28224 + + + + + + + lambda + id + + + 12 + + + 1 + 2 + 13171 + + + 2 + 3 + 7526 + + + + + + + lambda + index + + + 12 + + + 1 + 2 + 13171 + + + 2 + 3 + 7526 + + + + + + + lambda + field + + + 12 + + + 1 + 2 + 13171 + + + 2 + 3 + 7526 + + + + + + + lambda + captured_by_reference + + + 12 + + + 1 + 2 + 20698 + + + + + + + lambda + is_implicit + + + 12 + + + 1 + 2 + 20698 + + + + + + + lambda + location + + + 12 + + + 1 + 2 + 13171 + + + 2 + 3 + 7526 + + + + + + + index + id + + + 12 + + + 16 + 17 + 470 + + + 44 + 45 + 470 + + + + + + + index + lambda + + + 12 + + + 16 + 17 + 470 + + + 44 + 45 + 470 + + + + + + + index + field + + + 12 + + + 16 + 17 + 470 + + + 44 + 45 + 470 + + + + + + + index + captured_by_reference + + + 12 + + + 1 + 2 + 940 + + + + + + + index + is_implicit + + + 12 + + + 1 + 2 + 940 + + + + + + + index + location + + + 12 + + + 2 + 3 + 470 + + + 4 + 5 + 470 + + + + + + + field + id + + + 12 + + + 1 + 2 + 28224 + + + + + + + field + lambda + + + 12 + + + 1 + 2 + 28224 + + + + + + + field + index + + + 12 + + + 1 + 2 + 28224 + + + + + + + field + captured_by_reference + + + 12 + + + 1 + 2 + 28224 + + + + + + + field + is_implicit + + + 12 + + + 1 + 2 + 28224 + + + + + + + field + location + + + 12 + + + 1 + 2 + 28224 + + + + + + + captured_by_reference + id + + + 12 + + + 60 + 61 + 470 + + + + + + + captured_by_reference + lambda + + + 12 + + + 44 + 45 + 470 + + + + + + + captured_by_reference + index + + + 12 + + + 2 + 3 + 470 + + + + + + + captured_by_reference + field + + + 12 + + + 60 + 61 + 470 + + + + + + + captured_by_reference + is_implicit + + + 12 + + + 1 + 2 + 470 + + + + + + + captured_by_reference + location + + + 12 + + + 6 + 7 + 470 + + + + + + + is_implicit + id + + + 12 + + + 60 + 61 + 470 + + + + + + + is_implicit + lambda + + + 12 + + + 44 + 45 + 470 + + + + + + + is_implicit + index + + + 12 + + + 2 + 3 + 470 + + + + + + + is_implicit + field + + + 12 + + + 60 + 61 + 470 + + + + + + + is_implicit + captured_by_reference + + + 12 + + + 1 + 2 + 470 + + + + + + + is_implicit + location + + + 12 + + + 6 + 7 + 470 + + + + + + + location + id + + + 12 + + + 8 + 9 + 1881 + + + 14 + 15 + 940 + + + + + + + location + lambda + + + 12 + + + 8 + 9 + 1881 + + + 14 + 15 + 940 + + + + + + + location + index + + + 12 + + + 1 + 2 + 2822 + + + + + + + location + field + + + 12 + + + 8 + 9 + 1881 + + + 14 + 15 + 940 + + + + + + + location + captured_by_reference + + + 12 + + + 1 + 2 + 2822 + + + + + + + location + is_implicit + + + 12 + + + 1 + 2 + 2822 + + + + + + + + + fold + 4 + + + expr + 4 + + + operator + 4 + + + is_left_fold + 2 + + + + + expr + operator + + + 12 + + + 1 + 2 + 4 + + + + + + + expr + is_left_fold + + + 12 + + + 1 + 2 + 4 + + + + + + + operator + expr + + + 12 + + + 1 + 2 + 4 + + + + + + + operator + is_left_fold + + + 12 + + + 1 + 2 + 4 + + + + + + + is_left_fold + expr + + + 12 + + + 2 + 3 + 2 + + + + + + + is_left_fold + operator + + + 12 + + + 2 + 3 + 2 + + + + + + + + + stmts + 4659955 + + + id + 4659955 + + + kind + 1991 + + + location + 2288683 + + + + + id + kind + + + 12 + + + 1 + 2 + 4659955 + + + + + + + id + location + + + 12 + + + 1 + 2 + 4659955 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 104 + + + 18 + 19 + 104 + + + 22 + 23 + 104 + + + 46 + 47 + 104 + + + 75 + 76 + 104 + + + 83 + 84 + 104 + + + 102 + 103 + 104 + + + 154 + 155 + 104 + + + 242 + 243 + 104 + + + 284 + 285 + 104 + + + 383 + 384 + 104 + + + 418 + 419 + 104 + + + 501 + 502 + 104 + + + 1324 + 1325 + 104 + + + 2629 + 2630 + 104 + + + 4609 + 4610 + 104 + + + 8749 + 8750 + 104 + + + 11547 + 11548 + 104 + + + 13275 + 13276 + 104 + + + + + + + kind + location + + + 12 + + + 1 + 2 + 104 + + + 8 + 9 + 104 + + + 18 + 19 + 104 + + + 45 + 46 + 104 + + + 50 + 51 + 104 + + + 56 + 57 + 104 + + + 74 + 75 + 104 + + + 88 + 89 + 104 + + + 101 + 102 + 104 + + + 128 + 129 + 104 + + + 209 + 210 + 104 + + + 252 + 253 + 104 + + + 368 + 369 + 104 + + + 641 + 642 + 104 + + + 1742 + 1743 + 104 + + + 2186 + 2187 + 104 + + + 4191 + 4192 + 104 + + + 6065 + 6066 + 104 + + + 6529 + 6530 + 104 + + + + + + + location + id + + + 12 + + + 1 + 2 + 1893663 + + + 2 + 4 + 176600 + + + 4 + 12 + 175762 + + + 12 + 684 + 42656 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 2231353 + + + 2 + 8 + 57329 + + + + + + + + + type_vla + 1 + + + type_id + 1 + + + decl + 1 + + + + + type_id + decl + + + 12 + + + 1 + 2 + 1 + + + + + + + decl + type_id + + + 12 + + + 1 + 2 + 1 + + + + + + + + + variable_vla + 21 + + + var + 21 + + + decl + 21 + + + + + var + decl + + + 12 + + + 1 + 2 + 21 + + + + + + + decl + var + + + 12 + + + 1 + 2 + 21 + + + + + + + + + if_initialization + 314 + + + if_stmt + 314 + + + init_id + 314 + + + + + if_stmt + init_id + + + 12 + + + 1 + 2 + 314 + + + + + + + init_id + if_stmt + + + 12 + + + 1 + 2 + 314 + + + + + + + + + if_then + 723174 + + + if_stmt + 723174 + + + then_id + 723174 + + + + + if_stmt + then_id + + + 12 + + + 1 + 2 + 723174 + + + + + + + then_id + if_stmt + + + 12 + + + 1 + 2 + 723174 + + + + + + + + + if_else + 183972 + + + if_stmt + 183972 + + + else_id + 183972 + + + + + if_stmt + else_id + + + 12 + + + 1 + 2 + 183972 + + + + + + + else_id + if_stmt + + + 12 + + + 1 + 2 + 183972 + + + + + + + + + constexpr_if_initialization + 1 + + + constexpr_if_stmt + 1 + + + init_id + 1 + + + + + constexpr_if_stmt + init_id + + + 12 + + + 1 + 2 + 1 + + + + + + + init_id + constexpr_if_stmt + + + 12 + + + 1 + 2 + 1 + + + + + + + + + constexpr_if_then + 52508 + + + constexpr_if_stmt + 52508 + + + then_id + 52508 + + + + + constexpr_if_stmt + then_id + + + 12 + + + 1 + 2 + 52508 + + + + + + + then_id + constexpr_if_stmt + + + 12 + + + 1 + 2 + 52508 + + + + + + + + + constexpr_if_else + 30918 + + + constexpr_if_stmt + 30918 + + + else_id + 30918 + + + + + constexpr_if_stmt + else_id + + + 12 + + + 1 + 2 + 30918 + + + + + + + else_id + constexpr_if_stmt + + + 12 + + + 1 + 2 + 30918 + + + + + + + + + while_body + 30207 + + + while_stmt + 30207 + + + body_id + 30207 + + + + + while_stmt + body_id + + + 12 + + + 1 + 2 + 30207 + + + + + + + body_id + while_stmt + + + 12 + + + 1 + 2 + 30207 + + + + + + + + + do_body + 148604 + + + do_stmt + 148604 + + + body_id + 148604 + + + + + do_stmt + body_id + + + 12 + + + 1 + 2 + 148604 + + + + + + + body_id + do_stmt + + + 12 + + + 1 + 2 + 148604 + + + + + + + + + switch_initialization + 4 + + + switch_stmt + 4 + + + init_id + 4 + + + + + switch_stmt + init_id + + + 12 + + + 1 + 2 + 4 + + + + + + + init_id + switch_stmt + + + 12 + + + 1 + 2 + 4 + + + + + + + + + switch_case + 191408 + + + switch_stmt + 10301 + + + index + 4430 + + + case_id + 191408 + + + + + switch_stmt + index + + + 12 + + + 2 + 3 + 54 + + + 3 + 4 + 2269 + + + 4 + 5 + 1656 + + + 5 + 6 + 1008 + + + 6 + 7 + 756 + + + 7 + 9 + 720 + + + 9 + 10 + 972 + + + 10 + 11 + 324 + + + 11 + 14 + 864 + + + 14 + 31 + 828 + + + 36 + 247 + 846 + + + + + + + switch_stmt + case_id + + + 12 + + + 2 + 3 + 54 + + + 3 + 4 + 2269 + + + 4 + 5 + 1656 + + + 5 + 6 + 1008 + + + 6 + 7 + 756 + + + 7 + 9 + 720 + + + 9 + 10 + 972 + + + 10 + 11 + 324 + + + 11 + 14 + 864 + + + 14 + 31 + 828 + + + 36 + 247 + 846 + + + + + + + index + switch_stmt + + + 12 + + + 14 + 15 + 1170 + + + 18 + 19 + 540 + + + 32 + 33 + 1909 + + + 33 + 62 + 378 + + + 66 + 296 + 342 + + + 351 + 573 + 90 + + + + + + + index + case_id + + + 12 + + + 14 + 15 + 1170 + + + 18 + 19 + 540 + + + 32 + 33 + 1909 + + + 33 + 62 + 378 + + + 66 + 296 + 342 + + + 351 + 573 + 90 + + + + + + + case_id + switch_stmt + + + 12 + + + 1 + 2 + 191408 + + + + + + + case_id + index + + + 12 + + + 1 + 2 + 191408 + + + + + + + + + switch_body + 20901 + + + switch_stmt + 20901 + + + body_id + 20901 + + + + + switch_stmt + body_id + + + 12 + + + 1 + 2 + 20901 + + + + + + + body_id + switch_stmt + + + 12 + + + 1 + 2 + 20901 + + + + + + + + + for_initialization + 53202 + + + for_stmt + 53202 + + + init_id + 53202 + + + + + for_stmt + init_id + + + 12 + + + 1 + 2 + 53202 + + + + + + + init_id + for_stmt + + + 12 + + + 1 + 2 + 53202 + + + + + + + + + for_condition + 55458 + + + for_stmt + 55458 + + + condition_id + 55458 + + + + + for_stmt + condition_id + + + 12 + + + 1 + 2 + 55458 + + + + + + + condition_id + for_stmt + + + 12 + + + 1 + 2 + 55458 + + + + + + + + + for_update + 53304 + + + for_stmt + 53304 + + + update_id + 53304 + + + + + for_stmt + update_id + + + 12 + + + 1 + 2 + 53304 + + + + + + + update_id + for_stmt + + + 12 + + + 1 + 2 + 53304 + + + + + + + + + for_body + 61324 + + + for_stmt + 61324 + + + body_id + 61324 + + + + + for_stmt + body_id + + + 12 + + + 1 + 2 + 61324 + + + + + + + body_id + for_stmt + + + 12 + + + 1 + 2 + 61324 + + + + + + + + + stmtparents + 4052307 + + + id + 4052307 + + + index + 12210 + + + parent + 1719451 + + + + + id + index + + + 12 + + + 1 + 2 + 4052307 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 4052307 + + + + + + + index + id + + + 12 + + + 1 + 2 + 4011 + + + 2 + 3 + 999 + + + 3 + 4 + 220 + + + 4 + 5 + 1553 + + + 7 + 8 + 1018 + + + 8 + 12 + 792 + + + 12 + 29 + 1075 + + + 29 + 38 + 917 + + + 41 + 77 + 924 + + + 77 + 196934 + 697 + + + + + + + index + parent + + + 12 + + + 1 + 2 + 4011 + + + 2 + 3 + 999 + + + 3 + 4 + 220 + + + 4 + 5 + 1553 + + + 7 + 8 + 1018 + + + 8 + 12 + 792 + + + 12 + 29 + 1075 + + + 29 + 38 + 917 + + + 41 + 77 + 924 + + + 77 + 196934 + 697 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 987314 + + + 2 + 3 + 372959 + + + 3 + 4 + 105742 + + + 4 + 6 + 111231 + + + 6 + 17 + 129842 + + + 17 + 1943 + 12361 + + + + + + + parent + index + + + 12 + + + 1 + 2 + 987314 + + + 2 + 3 + 372959 + + + 3 + 4 + 105742 + + + 4 + 6 + 111231 + + + 6 + 17 + 129842 + + + 17 + 1943 + 12361 + + + + + + + + + ishandler + 59432 + + + block + 59432 + + + + + + stmt_decl_bind + 585632 + + + stmt + 545482 + + + num + 75 + + + decl + 585527 + + + + + stmt + num + + + 12 + + + 1 + 2 + 524602 + + + 2 + 19 + 20879 + + + + + + + stmt + decl + + + 12 + + + 1 + 2 + 524602 + + + 2 + 19 + 20879 + + + + + + + num + stmt + + + 12 + + + 1 + 2 + 8 + + + 3 + 4 + 4 + + + 4 + 5 + 4 + + + 8 + 9 + 4 + + + 9 + 10 + 4 + + + 10 + 11 + 8 + + + 16 + 17 + 4 + + + 42 + 43 + 4 + + + 89 + 90 + 4 + + + 128 + 129 + 4 + + + 218 + 219 + 4 + + + 390 + 391 + 4 + + + 1086 + 1087 + 4 + + + 2570 + 2571 + 4 + + + 4968 + 4969 + 4 + + + 129788 + 129789 + 4 + + + + + + + num + decl + + + 12 + + + 1 + 2 + 8 + + + 3 + 4 + 4 + + + 4 + 5 + 4 + + + 8 + 9 + 4 + + + 9 + 10 + 4 + + + 10 + 11 + 8 + + + 16 + 17 + 4 + + + 42 + 43 + 4 + + + 89 + 90 + 4 + + + 128 + 129 + 4 + + + 218 + 219 + 4 + + + 390 + 391 + 4 + + + 1086 + 1087 + 4 + + + 2570 + 2571 + 4 + + + 4968 + 4969 + 4 + + + 129763 + 129764 + 4 + + + + + + + decl + stmt + + + 12 + + + 1 + 2 + 585489 + + + 2 + 6 + 37 + + + + + + + decl + num + + + 12 + + + 1 + 2 + 585527 + + + + + + + + + stmt_decl_entry_bind + 528040 + + + stmt + 488193 + + + num + 75 + + + decl_entry + 527981 + + + + + stmt + num + + + 12 + + + 1 + 2 + 467578 + + + 2 + 19 + 20615 + + + + + + + stmt + decl_entry + + + 12 + + + 1 + 2 + 467578 + + + 2 + 19 + 20615 + + + + + + + num + stmt + + + 12 + + + 1 + 2 + 8 + + + 3 + 4 + 4 + + + 4 + 5 + 4 + + + 8 + 9 + 4 + + + 9 + 10 + 4 + + + 10 + 11 + 8 + + + 16 + 17 + 4 + + + 42 + 43 + 4 + + + 89 + 90 + 4 + + + 128 + 129 + 4 + + + 218 + 219 + 4 + + + 390 + 391 + 4 + + + 1086 + 1087 + 4 + + + 2561 + 2562 + 4 + + + 4905 + 4906 + 4 + + + 116157 + 116158 + 4 + + + + + + + num + decl_entry + + + 12 + + + 1 + 2 + 8 + + + 3 + 4 + 4 + + + 4 + 5 + 4 + + + 8 + 9 + 4 + + + 9 + 10 + 4 + + + 10 + 11 + 8 + + + 16 + 17 + 4 + + + 42 + 43 + 4 + + + 89 + 90 + 4 + + + 128 + 129 + 4 + + + 218 + 219 + 4 + + + 390 + 391 + 4 + + + 1086 + 1087 + 4 + + + 2561 + 2562 + 4 + + + 4905 + 4906 + 4 + + + 116143 + 116144 + 4 + + + + + + + decl_entry + stmt + + + 12 + + + 1 + 2 + 527960 + + + 3 + 6 + 21 + + + + + + + decl_entry + num + + + 12 + + + 1 + 2 + 527981 + + + + + + + + + blockscope + 1438063 + + + block + 1438063 + + + enclosing + 1321870 + + + + + block + enclosing + + + 12 + + + 1 + 2 + 1438063 + + + + + + + enclosing + block + + + 12 + + + 1 + 2 + 1256011 + + + 2 + 13 + 65858 + + + + + + + + + jumpinfo + 253995 + + + id + 253995 + + + str + 21152 + + + target + 53046 + + + + + id + str + + + 12 + + + 1 + 2 + 253995 + + + + + + + id + target + + + 12 + + + 1 + 2 + 253995 + + + + + + + str + id + + + 12 + + + 2 + 3 + 9875 + + + 3 + 4 + 4246 + + + 4 + 5 + 1565 + + + 5 + 6 + 1340 + + + 6 + 10 + 1699 + + + 10 + 22 + 1620 + + + 22 + 13723 + 804 + + + + + + + str + target + + + 12 + + + 1 + 2 + 16717 + + + 2 + 3 + 2631 + + + 3 + 10 + 1687 + + + 10 + 3326 + 115 + + + + + + + target + id + + + 12 + + + 1 + 2 + 24 + + + 2 + 3 + 26428 + + + 3 + 4 + 12897 + + + 4 + 5 + 5342 + + + 5 + 8 + 4691 + + + 8 + 2124 + 3661 + + + + + + + target + str + + + 12 + + + 1 + 2 + 53046 + + + + + + + + + preprocdirects + 4437448 + + + id + 4437448 + + + kind + 1048 + + + location + 4434933 + + + + + id + kind + + + 12 + + + 1 + 2 + 4437448 + + + + + + + id + location + + + 12 + + + 1 + 2 + 4437448 + + + + + + + kind + id + + + 12 + + + 121 + 122 + 104 + + + 693 + 694 + 104 + + + 794 + 795 + 104 + + + 917 + 918 + 104 + + + 1697 + 1698 + 104 + + + 1785 + 1786 + 104 + + + 2983 + 2984 + 104 + + + 3799 + 3800 + 104 + + + 6290 + 6291 + 104 + + + 23260 + 23261 + 104 + + + + + + + kind + location + + + 12 + + + 121 + 122 + 104 + + + 693 + 694 + 104 + + + 794 + 795 + 104 + + + 917 + 918 + 104 + + + 1697 + 1698 + 104 + + + 1785 + 1786 + 104 + + + 2983 + 2984 + 104 + + + 3799 + 3800 + 104 + + + 6290 + 6291 + 104 + + + 23236 + 23237 + 104 + + + + + + + location + id + + + 12 + + + 1 + 2 + 4434828 + + + 25 + 26 + 104 + + + + + + + location + kind + + + 12 + + + 1 + 2 + 4434933 + + + + + + + + + preprocpair + 1442296 + + + begin + 1206147 + + + elseelifend + 1442296 + + + + + begin + elseelifend + + + 12 + + + 1 + 2 + 985992 + + + 2 + 3 + 209805 + + + 3 + 11 + 10349 + + + + + + + elseelifend + begin + + + 12 + + + 1 + 2 + 1442296 + + + + + + + + + preproctrue + 782302 + + + branch + 782302 + + + + + + preprocfalse + 327409 + + + branch + 327409 + + + + + + preproctext + 3577502 + + + id + 3577502 + + + head + 2594197 + + + body + 1517194 + + + + + id + head + + + 12 + + + 1 + 2 + 3577502 + + + + + + + id + body + + + 12 + + + 1 + 2 + 3577502 + + + + + + + head + id + + + 12 + + + 1 + 2 + 2446942 + + + 2 + 740 + 147254 + + + + + + + head + body + + + 12 + + + 1 + 2 + 2531941 + + + 2 + 5 + 62255 + + + + + + + body + id + + + 12 + + + 1 + 2 + 1373398 + + + 2 + 6 + 113821 + + + 6 + 11581 + 29974 + + + + + + + body + head + + + 12 + + + 1 + 2 + 1376438 + + + 2 + 7 + 114135 + + + 7 + 2958 + 26621 + + + + + + + + + includes + 315649 + + + id + 315649 + + + included + 118074 + + + + + id + included + + + 12 + + + 1 + 2 + 315649 + + + + + + + included + id + + + 12 + + + 1 + 2 + 61624 + + + 2 + 3 + 22109 + + + 3 + 4 + 12701 + + + 4 + 6 + 10349 + + + 6 + 14 + 8937 + + + 14 + 47 + 2352 + + + + + + + + + link_targets + 1471 + + + id + 1471 + + + binary + 1471 + + + + + id + binary + + + 12 + + + 1 + 2 + 1471 + + + + + + + binary + id + + + 12 + + + 1 + 2 + 1471 + + + + + + + + + link_parent + 40143068 + + + element + 5115983 + + + link_target + 352 + + + + + element + link_target + + + 12 + + + 1 + 2 + 701934 + + + 2 + 9 + 44146 + + + 9 + 10 + 4369903 + + + + + + + link_target + element + + + 12 + + + 3 + 4 + 35 + + + 124207 + 124208 + 35 + + + 124311 + 124312 + 35 + + + 124409 + 124410 + 35 + + + 124447 + 124448 + 35 + + + 124454 + 124455 + 35 + + + 124463 + 124464 + 35 + + + 126339 + 126340 + 35 + + + 132460 + 132461 + 35 + + + 134288 + 134289 + 35 + + + + + + + + + xmlEncoding + 39724 + + + id + 39724 + + + encoding + 1 + + + + + id + encoding + + + 12 + + + 1 + 2 + 39724 + + + + + + + encoding + id + + + 12 + + + 39724 + 39725 + 1 + + + + + + + + + xmlDTDs + 1 + + + id + 1 + + + root + 1 + + + publicId + 1 + + + systemId + 1 + + + fileid + 1 + + + + + id + root + + + 12 + + + 1 + 2 + 1 + + + + + + + id + publicId + + + 12 + + + 1 + 2 + 1 + + + + + + + id + systemId + + + 12 + + + 1 + 2 + 1 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1 + + + + + + + root + id + + + 12 + + + 1 + 2 + 1 + + + + + + + root + publicId + + + 12 + + + 1 + 2 + 1 + + + + + + + root + systemId + + + 12 + + + 1 + 2 + 1 + + + + + + + root + fileid + + + 12 + + + 1 + 2 + 1 + + + + + + + publicId + id + + + 12 + + + 1 + 2 + 1 + + + + + + + publicId + root + + + 12 + + + 1 + 2 + 1 + + + + + + + publicId + systemId + + + 12 + + + 1 + 2 + 1 + + + + + + + publicId + fileid + + + 12 + + + 1 + 2 + 1 + + + + + + + systemId + id + + + 12 + + + 1 + 2 + 1 + + + + + + + systemId + root + + + 12 + + + 1 + 2 + 1 + + + + + + + systemId + publicId + + + 12 + + + 1 + 2 + 1 + + + + + + + systemId + fileid + + + 12 + + + 1 + 2 + 1 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 1 + + + + + + + fileid + root + + + 12 + + + 1 + 2 + 1 + + + + + + + fileid + publicId + + + 12 + + + 1 + 2 + 1 + + + + + + + fileid + systemId + + + 12 + + + 1 + 2 + 1 + + + + + + + + + xmlElements + 1270313 + + + id + 1270313 + + + name + 4655 + + + parentid + 578021 + + + idx + 35122 + + + fileid + 39721 + + + + + id + name + + + 12 + + + 1 + 2 + 1270313 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 1270313 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 1270313 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1270313 + + + + + + + name + id + + + 12 + + + 1 + 2 + 420 + + + 2 + 5 + 156 + + + 5 + 6 + 3832 + + + 6 + 310317 + 247 + + + + + + + name + parentid + + + 12 + + + 1 + 2 + 456 + + + 2 + 5 + 150 + + + 5 + 6 + 3829 + + + 6 + 161565 + 220 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 4358 + + + 2 + 35123 + 297 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 486 + + + 2 + 5 + 133 + + + 5 + 6 + 3831 + + + 6 + 14503 + 205 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 371969 + + + 2 + 3 + 62095 + + + 3 + 4 + 104113 + + + 4 + 35123 + 39844 + + + + + + + parentid + name + + + 12 + + + 1 + 2 + 500482 + + + 2 + 3 + 17866 + + + 3 + 4 + 49117 + + + 4 + 45 + 10556 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 371969 + + + 2 + 3 + 62095 + + + 3 + 4 + 104113 + + + 4 + 35123 + 39844 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 578021 + + + + + + + idx + id + + + 12 + + + 2 + 3 + 606 + + + 4 + 5 + 17851 + + + 5 + 6 + 6533 + + + 6 + 7 + 859 + + + 7 + 8 + 4471 + + + 9 + 16 + 2719 + + + 16 + 578022 + 2083 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 18457 + + + 2 + 3 + 6533 + + + 3 + 4 + 6178 + + + 4 + 8 + 2624 + + + 8 + 4397 + 1330 + + + + + + + idx + parentid + + + 12 + + + 2 + 3 + 606 + + + 4 + 5 + 17851 + + + 5 + 6 + 6533 + + + 6 + 7 + 859 + + + 7 + 8 + 4471 + + + 9 + 16 + 2719 + + + 16 + 578022 + 2083 + + + + + + + idx + fileid + + + 12 + + + 2 + 3 + 606 + + + 4 + 5 + 17851 + + + 5 + 6 + 6533 + + + 6 + 7 + 859 + + + 7 + 8 + 4471 + + + 9 + 16 + 2719 + + + 16 + 39722 + 2083 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 20457 + + + 2 + 3 + 3115 + + + 3 + 7 + 3026 + + + 7 + 8 + 3588 + + + 8 + 9 + 2220 + + + 9 + 11 + 3099 + + + 11 + 19 + 3087 + + + 19 + 114506 + 1129 + + + + + + + fileid + name + + + 12 + + + 1 + 2 + 20459 + + + 2 + 3 + 3458 + + + 3 + 5 + 2569 + + + 5 + 7 + 2172 + + + 7 + 8 + 6158 + + + 8 + 9 + 3501 + + + 9 + 46 + 1404 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 20457 + + + 2 + 3 + 3870 + + + 3 + 5 + 2152 + + + 5 + 6 + 2876 + + + 6 + 7 + 2720 + + + 7 + 8 + 4132 + + + 8 + 14 + 3096 + + + 14 + 31079 + 418 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 25894 + + + 2 + 3 + 5301 + + + 3 + 4 + 3787 + + + 4 + 6 + 3268 + + + 6 + 35123 + 1471 + + + + + + + + + xmlAttrs + 1202020 + + + id + 1202020 + + + elementid + 760198 + + + name + 3649 + + + value + 121803 + + + idx + 2000 + + + fileid + 39448 + + + + + id + elementid + + + 12 + + + 1 + 2 + 1202020 + + + + + + + id + name + + + 12 + + + 1 + 2 + 1202020 + + + + + + + id + value + + + 12 + + + 1 + 2 + 1202020 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 1202020 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1202020 + + + + + + + elementid + id + + + 12 + + + 1 + 2 + 425697 + + + 2 + 3 + 249659 + + + 3 + 4 + 66474 + + + 4 + 2001 + 18368 + + + + + + + elementid + name + + + 12 + + + 1 + 2 + 425778 + + + 2 + 3 + 249579 + + + 3 + 4 + 66475 + + + 4 + 2001 + 18366 + + + + + + + elementid + value + + + 12 + + + 1 + 2 + 466237 + + + 2 + 3 + 266291 + + + 3 + 46 + 27670 + + + + + + + elementid + idx + + + 12 + + + 1 + 2 + 425697 + + + 2 + 3 + 249659 + + + 3 + 4 + 66474 + + + 4 + 2001 + 18368 + + + + + + + elementid + fileid + + + 12 + + + 1 + 2 + 760198 + + + + + + + name + id + + + 12 + + + 1 + 2 + 3467 + + + 2 + 262475 + 182 + + + + + + + name + elementid + + + 12 + + + 1 + 2 + 3467 + + + 2 + 262475 + 182 + + + + + + + name + value + + + 12 + + + 1 + 2 + 3501 + + + 2 + 54146 + 148 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 3531 + + + 2 + 11 + 118 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 3491 + + + 2 + 21768 + 158 + + + + + + + value + id + + + 12 + + + 1 + 2 + 72032 + + + 2 + 3 + 42366 + + + 3 + 199269 + 7405 + + + + + + + value + elementid + + + 12 + + + 1 + 2 + 72036 + + + 2 + 3 + 42374 + + + 3 + 199269 + 7393 + + + + + + + value + name + + + 12 + + + 1 + 2 + 116722 + + + 2 + 2041 + 5081 + + + + + + + value + idx + + + 12 + + + 1 + 2 + 117957 + + + 2 + 2001 + 3846 + + + + + + + value + fileid + + + 12 + + + 1 + 2 + 86306 + + + 2 + 3 + 28570 + + + 3 + 4175 + 6927 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 1955 + + + 2 + 760199 + 45 + + + + + + + idx + elementid + + + 12 + + + 1 + 2 + 1955 + + + 2 + 760199 + 45 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 1955 + + + 2 + 189 + 45 + + + + + + + idx + value + + + 12 + + + 1 + 2 + 1955 + + + 2 + 116643 + 45 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 1955 + + + 2 + 39449 + 45 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 22884 + + + 2 + 4 + 2565 + + + 4 + 6 + 2294 + + + 6 + 7 + 3299 + + + 7 + 9 + 3272 + + + 9 + 16 + 3143 + + + 16 + 129952 + 1991 + + + + + + + fileid + elementid + + + 12 + + + 1 + 2 + 23890 + + + 2 + 4 + 2131 + + + 4 + 5 + 1971 + + + 5 + 6 + 4096 + + + 6 + 8 + 3519 + + + 8 + 16 + 3137 + + + 16 + 106600 + 704 + + + + + + + fileid + name + + + 12 + + + 1 + 2 + 22946 + + + 2 + 3 + 2338 + + + 3 + 4 + 2726 + + + 4 + 5 + 2824 + + + 5 + 6 + 2994 + + + 6 + 7 + 3876 + + + 7 + 2002 + 1744 + + + + + + + fileid + value + + + 12 + + + 1 + 2 + 22916 + + + 2 + 4 + 2772 + + + 4 + 5 + 2112 + + + 5 + 6 + 3510 + + + 6 + 8 + 1993 + + + 8 + 11 + 3365 + + + 11 + 50357 + 2780 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 26133 + + + 2 + 3 + 9699 + + + 3 + 5 + 3511 + + + 5 + 2001 + 105 + + + + + + + + + xmlNs + 71201 + + + id + 4185 + + + prefixName + 958 + + + URI + 4185 + + + fileid + 39544 + + + + + id + prefixName + + + 12 + + + 1 + 2 + 2602 + + + 2 + 3 + 1553 + + + 3 + 872 + 30 + + + + + + + id + URI + + + 12 + + + 1 + 2 + 4185 + + + + + + + id + fileid + + + 12 + + + 1 + 6 + 274 + + + 6 + 7 + 3825 + + + 7 + 24905 + 86 + + + + + + + prefixName + id + + + 12 + + + 1 + 2 + 915 + + + 2 + 4054 + 43 + + + + + + + prefixName + URI + + + 12 + + + 1 + 2 + 915 + + + 2 + 4054 + 43 + + + + + + + prefixName + fileid + + + 12 + + + 1 + 2 + 828 + + + 2 + 5 + 73 + + + 5 + 24903 + 57 + + + + + + + URI + id + + + 12 + + + 1 + 2 + 4185 + + + + + + + URI + prefixName + + + 12 + + + 1 + 2 + 2602 + + + 2 + 3 + 1553 + + + 3 + 872 + 30 + + + + + + + URI + fileid + + + 12 + + + 1 + 6 + 274 + + + 6 + 7 + 3825 + + + 7 + 24905 + 86 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 11655 + + + 2 + 3 + 26146 + + + 3 + 8 + 1743 + + + + + + + fileid + prefixName + + + 12 + + + 1 + 2 + 11653 + + + 2 + 3 + 25982 + + + 3 + 31 + 1909 + + + + + + + fileid + URI + + + 12 + + + 1 + 2 + 11655 + + + 2 + 3 + 26146 + + + 3 + 8 + 1743 + + + + + + + + + xmlHasNs + 1139730 + + + elementId + 1139730 + + + nsId + 4136 + + + fileid + 39537 + + + + + elementId + nsId + + + 12 + + + 1 + 2 + 1139730 + + + + + + + elementId + fileid + + + 12 + + + 1 + 2 + 1139730 + + + + + + + nsId + elementId + + + 12 + + + 1 + 5 + 234 + + + 5 + 6 + 3824 + + + 6 + 643289 + 78 + + + + + + + nsId + fileid + + + 12 + + + 1 + 5 + 257 + + + 5 + 6 + 3823 + + + 6 + 24759 + 56 + + + + + + + fileid + elementId + + + 12 + + + 1 + 2 + 3669 + + + 2 + 3 + 20429 + + + 3 + 7 + 2536 + + + 7 + 8 + 3473 + + + 8 + 9 + 2258 + + + 9 + 11 + 3036 + + + 11 + 18 + 2966 + + + 18 + 147552 + 1170 + + + + + + + fileid + nsId + + + 12 + + + 1 + 2 + 18261 + + + 2 + 3 + 21032 + + + 3 + 8 + 244 + + + + + + + + + xmlComments + 26812 + + + id + 26812 + + + text + 22933 + + + parentid + 26546 + + + fileid + 26368 + + + + + id + text + + + 12 + + + 1 + 2 + 26812 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 26812 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 26812 + + + + + + + text + id + + + 12 + + + 1 + 2 + 21517 + + + 2 + 62 + 1416 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 21519 + + + 2 + 62 + 1414 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 21522 + + + 2 + 62 + 1411 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 26379 + + + 2 + 17 + 167 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 26379 + + + 2 + 17 + 167 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 26546 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 26161 + + + 2 + 17 + 207 + + + + + + + fileid + text + + + 12 + + + 1 + 2 + 26165 + + + 2 + 17 + 203 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 26223 + + + 2 + 10 + 145 + + + + + + + + + xmlChars + 439958 + + + id + 439958 + + + text + 100518 + + + parentid + 433851 + + + idx + 4 + + + isCDATA + 1 + + + fileid + 26494 + + + + + id + text + + + 12 + + + 1 + 2 + 439958 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 439958 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 439958 + + + + + + + id + isCDATA + + + 12 + + + 1 + 2 + 439958 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 439958 + + + + + + + text + id + + + 12 + + + 1 + 2 + 60389 + + + 2 + 4 + 3811 + + + 4 + 5 + 29257 + + + 5 + 23171 + 7061 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 60389 + + + 2 + 4 + 3811 + + + 4 + 5 + 29257 + + + 5 + 23171 + 7061 + + + + + + + text + idx + + + 12 + + + 1 + 2 + 100517 + + + 2 + 3 + 1 + + + + + + + text + isCDATA + + + 12 + + + 1 + 2 + 100518 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 61284 + + + 2 + 4 + 4205 + + + 4 + 5 + 28328 + + + 5 + 351 + 6701 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 429716 + + + 2 + 5 + 4135 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 429716 + + + 2 + 5 + 4135 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 429716 + + + 2 + 5 + 4135 + + + + + + + parentid + isCDATA + + + 12 + + + 1 + 2 + 433851 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 433851 + + + + + + + idx + id + + + 12 + + + 80 + 81 + 1 + + + 1892 + 1893 + 1 + + + 4135 + 4136 + 1 + + + 433851 + 433852 + 1 + + + + + + + idx + text + + + 12 + + + 1 + 2 + 1 + + + 3 + 4 + 1 + + + 16 + 17 + 1 + + + 100499 + 100500 + 1 + + + + + + + idx + parentid + + + 12 + + + 80 + 81 + 1 + + + 1892 + 1893 + 1 + + + 4135 + 4136 + 1 + + + 433851 + 433852 + 1 + + + + + + + idx + isCDATA + + + 12 + + + 1 + 2 + 4 + + + + + + + idx + fileid + + + 12 + + + 4 + 5 + 1 + + + 46 + 47 + 1 + + + 97 + 98 + 1 + + + 26494 + 26495 + 1 + + + + + + + isCDATA + id + + + 12 + + + 439958 + 439959 + 1 + + + + + + + isCDATA + text + + + 12 + + + 100518 + 100519 + 1 + + + + + + + isCDATA + parentid + + + 12 + + + 433851 + 433852 + 1 + + + + + + + isCDATA + idx + + + 12 + + + 4 + 5 + 1 + + + + + + + isCDATA + fileid + + + 12 + + + 26494 + 26495 + 1 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 25303 + + + 2 + 35123 + 1191 + + + + + + + fileid + text + + + 12 + + + 1 + 2 + 25765 + + + 2 + 35123 + 729 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 25312 + + + 2 + 35123 + 1182 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 26397 + + + 2 + 5 + 97 + + + + + + + fileid + isCDATA + + + 12 + + + 1 + 2 + 26494 + + + + + + + + + xmllocations + 3051056 + + + xmlElement + 2982460 + + + location + 3051056 + + + + + xmlElement + location + + + 12 + + + 1 + 2 + 2978326 + + + 2 + 24903 + 4134 + + + + + + + location + xmlElement + + + 12 + + + 1 + 2 + 3051056 + + + + + + + + diff --git a/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme new file mode 100644 index 00000000000..bb0f279f2ac --- /dev/null +++ b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..e9a518baf14 --- /dev/null +++ b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties new file mode 100644 index 00000000000..000fa581cfa --- /dev/null +++ b/cpp/ql/lib/upgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties @@ -0,0 +1,2 @@ +description: Remove uniqueness constraint from the uuid property +compatibility: full diff --git a/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/exprparents.ql b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/exprparents.ql new file mode 100644 index 00000000000..ca800c8e311 --- /dev/null +++ b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/exprparents.ql @@ -0,0 +1,21 @@ +class Element extends @element { + string toString() { none() } +} + +class Expr extends @expr { + string toString() { none() } +} + +class Stmt extends @stmt { + string toString() { none() } +} + +predicate isStmtWithInitializer(Stmt stmt) { + exists(int kind | stmts(stmt, kind, _) | kind = 2 or kind = 11 or kind = 35) +} + +from Expr child, int index, int index_new, Element parent +where + exprparents(child, index, parent) and + if isStmtWithInitializer(parent) then index_new = index + 1 else index_new = index +select child, index_new, parent diff --git a/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme new file mode 100644 index 00000000000..e9a518baf14 --- /dev/null +++ b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/old.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..cf72c8898d1 --- /dev/null +++ b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/semmlecode.cpp.dbscheme @@ -0,0 +1,2111 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * 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: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * 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 +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * 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( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * 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_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * 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_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/stmtparents.ql b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/stmtparents.ql new file mode 100644 index 00000000000..e4865284f9c --- /dev/null +++ b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/stmtparents.ql @@ -0,0 +1,17 @@ +class Element extends @element { + string toString() { none() } +} + +class Stmt extends @stmt { + string toString() { none() } +} + +predicate isStmtWithInitializer(Stmt stmt) { + exists(int kind | stmts(stmt, kind, _) | kind = 2 or kind = 11 or kind = 35) +} + +from Stmt child, int index, int index_new, Element parent +where + stmtparents(child, index, parent) and + if isStmtWithInitializer(parent) then index_new = index + 1 else index_new = index +select child, index_new, parent diff --git a/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties new file mode 100644 index 00000000000..46b0525f473 --- /dev/null +++ b/cpp/ql/lib/upgrades/e9a518baf14f4322ac243578a8e1391386ff030f/upgrade.properties @@ -0,0 +1,4 @@ +description: Support C++17 if and switch initializers +compatibility: partial +exprparents.rel: run exprparents.qlo +stmtparents.rel: run stmtparents.qlo diff --git a/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql b/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql index 0d58bc1ef4c..cbb143dcebc 100644 --- a/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql +++ b/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql @@ -57,12 +57,5 @@ where not declarationHasSideEffects(v) and not exists(AsmStmt s | f = s.getEnclosingFunction()) and not v.getAnAttribute().getName() = "unused" and - not any(ErrorExpr e).getEnclosingFunction() = f and // unextracted expr may use `v` - not exists( - Literal l // this case can be removed when the `myFunction2( [obj](){} );` test case doesn't depend on this exclusion - | - l.getEnclosingFunction() = f and - not exists(l.getValue()) - ) and - not any(ConditionDeclExpr cde).getEnclosingFunction() = f // this case can be removed when the `if (a = b; a)` test case doesn't depend on this exclusion + not any(ErrorExpr e).getEnclosingFunction() = f // unextracted expr may use `v` select v, "Variable " + v.getName() + " is not used" diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 2a5e4775e18..50408aea104 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,60 @@ +## 0.1.2 + +### Minor Analysis Improvements + +* The "XML external entity expansion" (`cpp/external-entity-expansion`) query has been extended to support a broader selection of XML libraries and interfaces. + +## 0.1.1 + +### New Queries + +* An new query `cpp/external-entity-expansion` has been added. The query detects XML objects that are vulnerable to external entity expansion (XXE) attacks. + +## 0.1.0 + +### Minor Analysis Improvements + +* The `cpp/cleartext-transmission` query now recognizes additional sources, for sensitive private data such as e-mail addresses and credit card numbers. +* The `cpp/unused-local-variable` no longer ignores functions that include lambda expressions capturing trivially copyable objects. +* The `cpp/command-line-injection` query now takes into account calling contexts across string concatenations. This removes false positives due to mismatched calling contexts before and after string concatenations. +* A new query, "Potential exposure of sensitive system data to an unauthorized control sphere" (`cpp/potential-system-data-exposure`) has been added. This query is focused on exposure of information that is highly likely to be sensitive, whereas the similar query "Exposure of system data to an unauthorized control sphere" (`cpp/system-data-exposure`) is focused on exposure of information on a channel that is more likely to be intercepted by an attacker. + +## 0.0.13 + +## 0.0.12 + +### Minor Analysis Improvements + +* The `cpp/overflow-destination`, `cpp/unclear-array-index-validation`, and `cpp/uncontrolled-allocation-size` queries have been modernized and converted to `path-problem` queries and provide more true positive results. +* The `cpp/system-data-exposure` query has been increased from `medium` to `high` precision, following a number of improvements to the query logic. + +## 0.0.11 + +### Breaking Changes + +* The deprecated queries `cpp/duplicate-block`, `cpp/duplicate-function`, `cpp/duplicate-class`, `cpp/duplicate-file`, `cpp/mostly-duplicate-function`,`cpp/similar-file`, `cpp/duplicated-lines-in-files` have been removed. + +### Deprecated Predicates and Classes + +* The predicates and classes in the `CodeDuplication` library have been deprecated. + +### New Queries + +* A new query titled "Use of expired stack-address" (`cpp/using-expired-stack-address`) has been added. + This query finds accesses to expired stack-allocated memory that escaped via a global variable. +* A new `cpp/insufficient-key-size` query has been added to the default query suite for C/C++. The query finds uses of certain cryptographic algorithms where the key size is too small to provide adequate encryption strength. + +### Minor Analysis Improvements + +* The "Failure to use HTTPS URLs" (`cpp/non-https-url`) has been improved reducing false positive results, and its precision has been increased to 'high'. +* The `cpp/system-data-exposure` query has been modernized and has converted to a `path-problem` query. There are now fewer false positive results. + +## 0.0.10 + +### Deprecated Classes + +* The `CodeDuplication.Copy`, `CodeDuplication.DuplicateBlock`, and `CodeDuplication.SimilarBlock` classes have been deprecated. + ## 0.0.9 ### New Queries diff --git a/cpp/ql/src/Critical/OverflowDestination.ql b/cpp/ql/src/Critical/OverflowDestination.ql index 94d46001660..6d41281e443 100644 --- a/cpp/ql/src/Critical/OverflowDestination.ql +++ b/cpp/ql/src/Critical/OverflowDestination.ql @@ -2,7 +2,7 @@ * @name Copy function using source size * @description Calling a copy operation with a size derived from the source * buffer instead of the destination buffer may result in a buffer overflow. - * @kind problem + * @kind path-problem * @id cpp/overflow-destination * @problem.severity warning * @security-severity 9.3 @@ -14,7 +14,10 @@ */ import cpp -import semmle.code.cpp.security.TaintTracking +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.controlflow.IRGuards +import semmle.code.cpp.security.FlowSources +import DataFlow::PathGraph /** * Holds if `fc` is a call to a copy operation where the size argument contains @@ -27,9 +30,9 @@ predicate sourceSized(FunctionCall fc, Expr src) { fc.getTarget().hasGlobalOrStdName(["strncpy", "strncat", "memcpy", "memmove"]) and exists(Expr dest, Expr size, Variable v | fc.getArgument(0) = dest and - fc.getArgument(1) = src and + fc.getArgument(1).getFullyConverted() = src and fc.getArgument(2) = size and - src = v.getAnAccess() and + src = v.getAnAccess().getFullyConverted() and size.getAChild+() = v.getAnAccess() and // exception: `dest` is also referenced in the size argument not exists(Variable other | @@ -45,9 +48,49 @@ predicate sourceSized(FunctionCall fc, Expr src) { ) } -from FunctionCall fc, Expr vuln, Expr taintSource +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + readsVariable(node.asInstruction(), checkedVar) and + any(IRGuardCondition guard).ensuresEq(access, _, _, node.asInstruction().getBlock(), true) +} + +class OverflowDestinationConfig extends TaintTracking::Configuration { + OverflowDestinationConfig() { this = "OverflowDestinationConfig" } + + override predicate isSource(DataFlow::Node source) { source instanceof FlowSource } + + override predicate isSink(DataFlow::Node sink) { sourceSized(_, sink.asConvertedExpr()) } + + override predicate isSanitizer(DataFlow::Node node) { + exists(Variable checkedVar | + readsVariable(node.asInstruction(), checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + exists(Variable checkedVar, Operand access | + readsVariable(access.getDef(), checkedVar) and + nodeIsBarrierEqualityCandidate(node, access, checkedVar) + ) + } +} + +from + FunctionCall fc, OverflowDestinationConfig conf, DataFlow::PathNode source, + DataFlow::PathNode sink where - sourceSized(fc, vuln) and - tainted(taintSource, vuln) -select fc, + conf.hasFlowPath(source, sink) and + sourceSized(fc, sink.getNode().asConvertedExpr()) +select fc, source, sink, "To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size." diff --git a/cpp/ql/src/Diagnostics/ExtractionProblems.qll b/cpp/ql/src/Diagnostics/ExtractionProblems.qll index c96e2e926e8..b6dd835261d 100644 --- a/cpp/ql/src/Diagnostics/ExtractionProblems.qll +++ b/cpp/ql/src/Diagnostics/ExtractionProblems.qll @@ -57,10 +57,10 @@ class ExtractionProblem extends TExtractionProblem { /** Gets the problem message for this problem. */ string getProblemMessage() { none() } - /** Gets the file this problem occured in. */ + /** Gets the file this problem occurred in. */ File getFile() { none() } - /** Gets the location this problem occured in. */ + /** Gets the location this problem occurred in. */ Location getLocation() { none() } /** Gets the SARIF severity of this problem. */ diff --git a/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql new file mode 100644 index 00000000000..c7eac620b3b --- /dev/null +++ b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql @@ -0,0 +1,21 @@ +/** + * @name Extraction errors + * @description List all extraction errors for files in the source code directory. + * @kind diagnostic + * @id cpp/diagnostics/extraction-errors + */ + +import cpp +import ExtractionErrors + +// NOTE: +// This file looks like the other `diagnostics/extraction-errors` queries in other CodeQL supported +// languages. However, since this diagnostic query is located in the `Internal` subdirectory it will not +// appear in the Code Scanning suite. The related query `cpp/diagnostics/extraction-warnings` is, +// however, included as a public diagnostics query. +from ExtractionError error +where + error instanceof ExtractionUnknownError or + exists(error.getFile().getRelativePath()) +select error, "Extraction failed in " + error.getFile() + " with error " + error.getErrorMessage(), + error.getSeverity() diff --git a/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.qll b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.qll new file mode 100644 index 00000000000..1ac69186a93 --- /dev/null +++ b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.qll @@ -0,0 +1,137 @@ +/** + * Provides a common hierarchy of all types of errors that can occur during extraction. + */ + +import cpp + +/* + * A note about how the C/C++ extractor emits diagnostics: + * When the extractor frontend encounters an error, it emits a diagnostic message, + * that includes a message, location and severity. + * However, that process is best-effort and may fail (e.g. due to lack of memory). + * Thus, if the extractor emitted at least one diagnostic of severity discretionary + * error (or higher), it *also* emits a simple "There was an error during this compilation" + * error diagnostic, without location information. + * In the common case, this means that a compilation during which one or more errors happened also gets + * the catch-all diagnostic. + * This diagnostic has the empty string as file path. + * We filter out these useless diagnostics if there is at least one error-level diagnostic + * for the affected compilation in the database. + * Otherwise, we show it to indicate that something went wrong and that we + * don't know what exactly happened. + */ + +/** + * An error that, if present, leads to a file being marked as non-successfully extracted. + */ +class ReportableError extends Diagnostic { + ReportableError() { + ( + this instanceof CompilerDiscretionaryError or + this instanceof CompilerError or + this instanceof CompilerCatastrophe + ) and + // Filter for the catch-all diagnostic, see note above. + not this.getFile().getAbsolutePath() = "" + } +} + +private newtype TExtractionError = + TReportableError(ReportableError err) or + TCompilationFailed(Compilation c, File f) { + f = c.getAFileCompiled() and not c.normalTermination() + } or + // Show the catch-all diagnostic (see note above) only if we haven't seen any other error-level diagnostic + // for that compilation + TUnknownError(CompilerError err) { + not exists(ReportableError e | e.getCompilation() = err.getCompilation()) + } + +/** + * Superclass for the extraction error hierarchy. + */ +class ExtractionError extends TExtractionError { + /** Gets the string representation of the error. */ + string toString() { none() } + + /** Gets the error message for this error. */ + string getErrorMessage() { none() } + + /** Gets the file this error occurred in. */ + File getFile() { none() } + + /** Gets the location this error occurred in. */ + Location getLocation() { none() } + + /** Gets the SARIF severity of this error. */ + int getSeverity() { + // Unfortunately, we can't distinguish between errors and fatal errors in SARIF, + // so all errors have severity 2. + result = 2 + } +} + +/** + * An unrecoverable extraction error, where extraction was unable to finish. + * This can be caused by a multitude of reasons, for example: + * - hitting a frontend assertion + * - crashing due to dereferencing an invalid pointer + * - stack overflow + * - out of memory + */ +class ExtractionUnrecoverableError extends ExtractionError, TCompilationFailed { + Compilation c; + File f; + + ExtractionUnrecoverableError() { this = TCompilationFailed(c, f) } + + override string toString() { + result = "Unrecoverable extraction error while compiling " + f.toString() + } + + override string getErrorMessage() { result = "unrecoverable compilation failure." } + + override File getFile() { result = f } + + override Location getLocation() { result = f.getLocation() } +} + +/** + * A recoverable extraction error. + * These are compiler errors from the frontend. + * Upon encountering one of these, we still continue extraction, but the + * database will be incomplete for that file. + */ +class ExtractionRecoverableError extends ExtractionError, TReportableError { + ReportableError err; + + ExtractionRecoverableError() { this = TReportableError(err) } + + override string toString() { result = "Recoverable extraction error: " + err } + + override string getErrorMessage() { result = err.getFullMessage() } + + override File getFile() { result = err.getFile() } + + override Location getLocation() { result = err.getLocation() } +} + +/** + * An unknown error happened during extraction. + * These are only displayed if we know that we encountered an error during extraction, + * but, for some reason, failed to emit a proper diagnostic with location information + * and error message. + */ +class ExtractionUnknownError extends ExtractionError, TUnknownError { + CompilerError err; + + ExtractionUnknownError() { this = TUnknownError(err) } + + override string toString() { result = "Unknown extraction error: " + err } + + override string getErrorMessage() { result = err.getFullMessage() } + + override File getFile() { result = err.getFile() } + + override Location getLocation() { result = err.getLocation() } +} diff --git a/cpp/ql/src/Likely Bugs/Conversion/LossyFunctionResultCast.ql b/cpp/ql/src/Likely Bugs/Conversion/LossyFunctionResultCast.ql index 2a8aba6a961..dee723e2686 100644 --- a/cpp/ql/src/Likely Bugs/Conversion/LossyFunctionResultCast.ql +++ b/cpp/ql/src/Likely Bugs/Conversion/LossyFunctionResultCast.ql @@ -19,7 +19,7 @@ predicate whitelist(Function f) { "nearbyintl", "rint", "rintf", "rintl", "round", "roundf", "roundl", "trunc", "truncf", "truncl" ] or - f.getName().matches("__builtin_%") + f.getName().matches("\\_\\_builtin\\_%") } predicate whitelistPow(FunctionCall fc) { diff --git a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql index 7171185a11c..31a8b660964 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql @@ -13,7 +13,6 @@ import cpp import LeapYear -import semmle.code.cpp.dataflow.DataFlow from Expr source, Expr sink, PossibleYearArithmeticOperationCheckConfiguration config where config.hasFlow(DataFlow::exprNode(source), DataFlow::exprNode(sink)) diff --git a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql index d6d0a55d148..0d8aa227d22 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql @@ -10,7 +10,6 @@ import cpp import NtohlArrayNoBound -import semmle.code.cpp.dataflow.DataFlow from NetworkToBufferSizeConfiguration bufConfig, DataFlow::Node source, DataFlow::Node sink where bufConfig.hasFlow(source, sink) diff --git a/cpp/ql/src/Likely Bugs/Memory Management/PotentialBufferOverflow.ql b/cpp/ql/src/Likely Bugs/Memory Management/PotentialBufferOverflow.ql index 23cf7e8364b..40ed53609e8 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/PotentialBufferOverflow.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/PotentialBufferOverflow.ql @@ -13,7 +13,7 @@ * @deprecated This query is deprecated, use * Potentially overrunning write (`cpp/overrunning-write`) and * Potentially overrunning write with float to string conversion - * (`cpp/overrunning-write-with-float) instead. + * (`cpp/overrunning-write-with-float`) instead. */ import cpp diff --git a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql index c75fb8b639d..c72e25f61df 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql @@ -14,161 +14,73 @@ */ import cpp -// We don't actually use the global value numbering library in this query, but without it we end up -// recomputing the IR. -private import semmle.code.cpp.valuenumbering.GlobalValueNumbering import semmle.code.cpp.ir.IR -import semmle.code.cpp.ir.dataflow.DataFlow::DataFlow +import semmle.code.cpp.ir.dataflow.MustFlow +import PathGraph /** Holds if `f` has a name that we intrepret as evidence of intentionally returning the value of the stack pointer. */ predicate intentionallyReturnsStackPointer(Function f) { f.getName().toLowerCase().matches(["%stack%", "%sp%"]) } -/** - * Holds if `source` is a node that represents the use of a stack variable - */ -predicate isSource(Node source) { - exists(VariableAddressInstruction var, Function func | - var = source.asInstruction() and - func = var.getEnclosingFunction() and - var.getASTVariable() instanceof StackVariable and - // Pointer-to-member types aren't properly handled in the dbscheme. - not var.getResultType() instanceof PointerToMemberType and - // Rule out FPs caused by extraction errors. - not any(ErrorExpr e).getEnclosingFunction() = func and - not intentionallyReturnsStackPointer(func) - ) -} +class ReturnStackAllocatedMemoryConfig extends MustFlowConfiguration { + ReturnStackAllocatedMemoryConfig() { this = "ReturnStackAllocatedMemoryConfig" } -/** - * Holds if `sink` is a node that represents the `StoreInstruction` that is subsequently used in - * a `ReturnValueInstruction`. We use the `StoreInstruction` instead of the instruction that defines the - * `ReturnValueInstruction`'s source value oprand because the former has better location information. - */ -predicate isSink(Node sink) { - exists(StoreInstruction store | - store.getDestinationAddress().(VariableAddressInstruction).getIRVariable() instanceof - IRReturnVariable and - sink.asOperand() = store.getSourceValueOperand() - ) -} - -/** Holds if `node1` _must_ flow to `node2`. */ -predicate step(Node node1, Node node2) { - instructionToOperandStep(node1.asInstruction(), node2.asOperand()) - or - operandToInstructionStep(node1.asOperand(), node2.asInstruction()) -} - -predicate instructionToOperandStep(Instruction instr, Operand operand) { operand.getDef() = instr } - -/** - * Holds if `operand` flows to the result of `instr`. - * - * This predicate ignores flow through `PhiInstruction`s to create a 'must flow' relation. It also - * intentionally conflates addresses of fields and their object, and pointer offsets with their - * base pointer as this allows us to detect cases where an object's address flows to a return statement - * via a field. For example: - * - * ```cpp - * struct S { int x, y }; - * int* test() { - * S s; - * return &s.x; // BAD: &s.x is an address of a variable on the stack. - * } - * ``` - */ -predicate operandToInstructionStep(Operand operand, Instruction instr) { - instr.(CopyInstruction).getSourceValueOperand() = operand - or - instr.(ConvertInstruction).getUnaryOperand() = operand - or - instr.(CheckedConvertOrNullInstruction).getUnaryOperand() = operand - or - instr.(InheritanceConversionInstruction).getUnaryOperand() = operand - or - instr.(FieldAddressInstruction).getObjectAddressOperand() = operand - or - instr.(PointerOffsetInstruction).getLeftOperand() = operand -} - -/** Holds if a source node flows to `n`. */ -predicate branchlessLocalFlow0(Node n) { - isSource(n) - or - exists(Node mid | - branchlessLocalFlow0(mid) and - step(mid, n) - ) -} - -/** Holds if `n` is reachable through some source node, and `n` also eventually reaches a sink. */ -predicate branchlessLocalFlow1(Node n) { - branchlessLocalFlow0(n) and - ( - isSink(n) - or - exists(Node mid | - branchlessLocalFlow1(mid) and - step(n, mid) - ) - ) -} - -newtype TLocalPathNode = - TLocalPathNodeMid(Node n) { - branchlessLocalFlow1(n) and - ( - isSource(n) or - exists(LocalPathNodeMid mid | step(mid.getNode(), n)) + override predicate isSource(DataFlow::Node source) { + // Holds if `source` is a node that represents the use of a stack variable + exists(VariableAddressInstruction var, Function func | + var = source.asInstruction() and + func = var.getEnclosingFunction() and + var.getAstVariable() instanceof StackVariable and + // Pointer-to-member types aren't properly handled in the dbscheme. + not var.getResultType() instanceof PointerToMemberType and + // Rule out FPs caused by extraction errors. + not any(ErrorExpr e).getEnclosingFunction() = func and + not intentionallyReturnsStackPointer(func) ) } -abstract class LocalPathNode extends TLocalPathNode { - Node n; + override predicate isSink(DataFlow::Node sink) { + // Holds if `sink` is a node that represents the `StoreInstruction` that is subsequently used in + // a `ReturnValueInstruction`. + // We use the `StoreInstruction` instead of the instruction that defines the + // `ReturnValueInstruction`'s source value oprand because the former has better location information. + exists(StoreInstruction store | + store.getDestinationAddress().(VariableAddressInstruction).getIRVariable() instanceof + IRReturnVariable and + sink.asOperand() = store.getSourceValueOperand() + ) + } - /** Gets the underlying node. */ - Node getNode() { result = n } - - /** Gets a textual representation of this node. */ - string toString() { result = n.toString() } - - /** Gets the location of this element. */ - Location getLocation() { result = n.getLocation() } - - /** Gets a successor `LocalPathNode`, if any. */ - LocalPathNode getASuccessor() { step(this.getNode(), result.getNode()) } + /** + * This configuration intentionally conflates addresses of fields and their object, and pointer offsets + * with their base pointer as this allows us to detect cases where an object's address flows to a + * return statement via a field. For example: + * + * ```cpp + * struct S { int x, y }; + * int* test() { + * S s; + * return &s.x; // BAD: &s.x is an address of a variable on the stack. + * } + * ``` + */ + override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + node2.asInstruction().(FieldAddressInstruction).getObjectAddressOperand() = node1.asOperand() + or + node2.asInstruction().(PointerOffsetInstruction).getLeftOperand() = node1.asOperand() + } } -class LocalPathNodeMid extends LocalPathNode, TLocalPathNodeMid { - LocalPathNodeMid() { this = TLocalPathNodeMid(n) } -} - -class LocalPathNodeSink extends LocalPathNodeMid { - LocalPathNodeSink() { isSink(this.getNode()) } -} - -/** - * Holds if `source` is a source node, `sink` is a sink node, and there's flow - * from `source` to `sink` using `step` relation. - */ -predicate hasFlow(LocalPathNode source, LocalPathNodeSink sink) { - isSource(source.getNode()) and - source.getASuccessor+() = sink -} - -predicate reach(LocalPathNode n) { n instanceof LocalPathNodeSink or reach(n.getASuccessor()) } - -query predicate edges(LocalPathNode a, LocalPathNode b) { a.getASuccessor() = b and reach(b) } - -query predicate nodes(LocalPathNode n, string key, string val) { - reach(n) and key = "semmle.label" and val = n.toString() -} - -from LocalPathNode source, LocalPathNodeSink sink, VariableAddressInstruction var +from + MustFlowPathNode source, MustFlowPathNode sink, VariableAddressInstruction var, + ReturnStackAllocatedMemoryConfig conf, Function f where - hasFlow(source, sink) and - source.getNode().asInstruction() = var -select sink.getNode(), source, sink, "May return stack-allocated memory from $@.", var.getAST(), - var.getAST().toString() + conf.hasFlowPath(source, sink) and + source.getNode().asInstruction() = var and + // Only raise an alert if we're returning from the _same_ callable as the on that + // declared the stack variable. + var.getEnclosingFunction() = pragma[only_bind_into](f) and + sink.getNode().getEnclosingCallable() = pragma[only_bind_into](f) +select sink.getNode(), source, sink, "May return stack-allocated memory from $@.", var.getAst(), + var.getAst().toString() diff --git a/cpp/ql/src/Likely Bugs/Memory Management/SuspiciousCallToMemset.ql b/cpp/ql/src/Likely Bugs/Memory Management/SuspiciousCallToMemset.ql index 8e41b414794..cb495f939fb 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/SuspiciousCallToMemset.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/SuspiciousCallToMemset.ql @@ -2,7 +2,7 @@ * @name Suspicious call to memset * @description Use of memset where the size argument is computed as the size of * some non-struct type. When initializing a buffer, you should specify - * its size as * to ensure + * its size as ` * ` to ensure * portability. * @kind problem * @id cpp/suspicious-call-to-memset diff --git a/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql index ac85cbf5d38..27aeabbaf49 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql @@ -2,7 +2,7 @@ * @name Use of expired stack-address * @description Accessing the stack-allocated memory of a function * after it has returned can lead to memory corruption. - * @kind problem + * @kind path-problem * @problem.severity error * @security-severity 9.3 * @precision high @@ -19,7 +19,7 @@ import semmle.code.cpp.valuenumbering.GlobalValueNumbering import semmle.code.cpp.ir.IR predicate instructionHasVariable(VariableAddressInstruction vai, StackVariable var, Function f) { - var = vai.getASTVariable() and + var = vai.getAstVariable() and f = vai.getEnclosingFunction() and // Pointer-to-member types aren't properly handled in the dbscheme. not vai.getResultType() instanceof PointerToMemberType and @@ -108,7 +108,7 @@ predicate inheritanceConversionTypes( /** Gets the HashCons value of an address computed by `instr`, if any. */ TGlobalAddress globalAddress(Instruction instr) { - result = TGlobalVariable(instr.(VariableAddressInstruction).getASTVariable()) + result = TGlobalVariable(instr.(VariableAddressInstruction).getAstVariable()) or not instr instanceof LoadInstruction and result = globalAddress(instr.(CopyInstruction).getSourceValue()) @@ -178,13 +178,10 @@ predicate blockStoresToAddress( globalAddress = globalAddress(store.getDestinationAddress()) } -predicate blockLoadsFromAddress( - IRBlock block, int index, LoadInstruction load, TGlobalAddress globalAddress -) { - block.getInstruction(index) = load and - globalAddress = globalAddress(load.getSourceAddress()) -} - +/** + * Holds if `globalAddress` evaluates to the address of `var` (which escaped through `store` before + * returning through `call`) when control reaches `block`. + */ predicate globalAddressPointsToStack( StoreInstruction store, StackVariable var, CallInstruction call, IRBlock block, TGlobalAddress globalAddress, boolean isCallBlock, boolean isStoreBlock @@ -203,21 +200,127 @@ predicate globalAddressPointsToStack( ) or isCallBlock = false and - exists(IRBlock mid | - mid.immediatelyDominates(block) and - // Only recurse if there is no store to `globalAddress` in `mid`. - globalAddressPointsToStack(store, var, call, mid, globalAddress, _, false) + step(store, var, call, globalAddress, _, block) + ) +} + +pragma[inline] +int getInstructionIndex(Instruction instr, IRBlock block) { block.getInstruction(result) = instr } + +predicate step( + StoreInstruction store, StackVariable var, CallInstruction call, TGlobalAddress globalAddress, + IRBlock pred, IRBlock succ +) { + exists(boolean isCallBlock, boolean isStoreBlock | + // Only recurse if there is no store to `globalAddress` in `mid`. + globalAddressPointsToStack(store, var, call, pred, globalAddress, isCallBlock, isStoreBlock) + | + // Post domination ensures that `block` is always executed after `mid` + // Domination ensures that `mid` is always executed before `block` + isStoreBlock = false and + succ.immediatelyPostDominates(pred) and + pred.immediatelyDominates(succ) + or + exists(CallInstruction anotherCall, int anotherCallIndex | + anotherCall = pred.getInstruction(anotherCallIndex) and + succ.getFirstInstruction() instanceof EnterFunctionInstruction and + succ.getEnclosingFunction() = anotherCall.getStaticCallTarget() and + (if isCallBlock = true then getInstructionIndex(call, _) < anotherCallIndex else any()) and + ( + if isStoreBlock = true + then + forex(int storeIndex | blockStoresToAddress(pred, storeIndex, _, globalAddress) | + anotherCallIndex < storeIndex + ) + else any() + ) ) ) } +newtype TPathElement = + TStore(StoreInstruction store) { globalAddressPointsToStack(store, _, _, _, _, _, _) } or + TCall(CallInstruction call, IRBlock block) { + globalAddressPointsToStack(_, _, call, block, _, _, _) + } or + TMid(IRBlock block) { step(_, _, _, _, _, block) } or + TSink(LoadInstruction load, IRBlock block) { + exists(TGlobalAddress address | + globalAddressPointsToStack(_, _, _, block, address, _, _) and + block.getAnInstruction() = load and + globalAddress(load.getSourceAddress()) = address + ) + } + +class PathElement extends TPathElement { + StoreInstruction asStore() { this = TStore(result) } + + CallInstruction asCall(IRBlock block) { this = TCall(result, block) } + + predicate isCall(IRBlock block) { exists(this.asCall(block)) } + + IRBlock asMid() { this = TMid(result) } + + LoadInstruction asSink(IRBlock block) { this = TSink(result, block) } + + predicate isSink(IRBlock block) { exists(this.asSink(block)) } + + string toString() { + result = [asStore().toString(), asCall(_).toString(), asMid().toString(), asSink(_).toString()] + } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.asStore() + .getLocation() + .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + this.asCall(_) + .getLocation() + .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + this.asMid().getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + this.asSink(_) + .getLocation() + .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +predicate isSink(LoadInstruction load, IRBlock block, int index, TGlobalAddress globalAddress) { + block.getInstruction(index) = load and + globalAddress(load.getSourceAddress()) = globalAddress +} + +query predicate edges(PathElement pred, PathElement succ) { + // Store -> caller + globalAddressPointsToStack(pred.asStore(), _, succ.asCall(_), _, _, _, _) + or + // Call -> basic block + pred.isCall(succ.asMid()) + or + // Special case for when the caller goes directly to the load with no steps + // across basic blocks (i.e., caller -> sink) + exists(IRBlock block | + pred.isCall(block) and + succ.isSink(block) + ) + or + // Basic block -> basic block + step(_, _, _, _, pred.asMid(), succ.asMid()) + or + // Basic block -> load + succ.isSink(pred.asMid()) +} + from StoreInstruction store, StackVariable var, LoadInstruction load, CallInstruction call, - IRBlock block, boolean isCallBlock, TGlobalAddress address, boolean isStoreBlock + IRBlock block, boolean isCallBlock, TGlobalAddress address, boolean isStoreBlock, + PathElement source, PathElement sink, int loadIndex where globalAddressPointsToStack(store, var, call, block, address, isCallBlock, isStoreBlock) and - block.getAnInstruction() = load and - globalAddress(load.getSourceAddress()) = address and + isSink(load, block, loadIndex, address) and ( // We know that we have a sequence: // (1) store to `address` -> (2) return from `f` -> (3) load from `address`. @@ -226,22 +329,20 @@ where if isCallBlock = true then // If so, the load must happen after the call. - exists(int callIndex, int loadIndex | - blockLoadsFromAddress(_, loadIndex, load, _) and - block.getInstruction(callIndex) = call and - callIndex < loadIndex + getInstructionIndex(call, _) < loadIndex + else any() + ) and + ( + // If there is a store to the address we need to make sure that the load we found was + // before that store (So that the load doesn't read an overwritten value). + if isStoreBlock = true + then + forex(int storeIndex | blockStoresToAddress(block, storeIndex, _, address) | + loadIndex < storeIndex ) else any() ) and - // If there is a store to the address we need to make sure that the load we found was - // before that store (So that the load doesn't read an overwritten value). - if isStoreBlock = true - then - exists(int storeIndex, int loadIndex | - blockStoresToAddress(block, storeIndex, _, address) and - block.getInstruction(loadIndex) = load and - loadIndex < storeIndex - ) - else any() -select load, "Stack variable $@ escapes $@ and is used after it has expired.", var, var.toString(), - store, "here" + source.asStore() = store and + sink.asSink(_) = load +select sink, source, sink, "Stack variable $@ escapes $@ and is used after it has expired.", var, + var.toString(), store, "here" diff --git a/cpp/ql/src/Likely Bugs/OO/UnsafeUseOfThis.ql b/cpp/ql/src/Likely Bugs/OO/UnsafeUseOfThis.ql index 04325e8497e..7f1a007ac0c 100644 --- a/cpp/ql/src/Likely Bugs/OO/UnsafeUseOfThis.ql +++ b/cpp/ql/src/Likely Bugs/OO/UnsafeUseOfThis.ql @@ -15,171 +15,46 @@ */ import cpp -// We don't actually use the global value numbering library in this query, but without it we end up -// recomputing the IR. -private import semmle.code.cpp.valuenumbering.GlobalValueNumbering -private import semmle.code.cpp.ir.IR +import semmle.code.cpp.ir.IR +import semmle.code.cpp.ir.dataflow.MustFlow +import PathGraph -bindingset[n, result] -int unbind(int n) { result >= n and result <= n } +class UnsafeUseOfThisConfig extends MustFlowConfiguration { + UnsafeUseOfThisConfig() { this = "UnsafeUseOfThisConfig" } -/** Holds if `p` is the `n`'th parameter of the non-virtual function `f`. */ -predicate parameterOf(Parameter p, Function f, int n) { - not f.isVirtual() and f.getParameter(n) = p -} + override predicate isSource(DataFlow::Node source) { isSource(source, _, _) } -/** - * Holds if `instr` is the `n`'th argument to a call to the non-virtual function `f`, and - * `init` is the corresponding initiazation instruction that receives the value of `instr` in `f`. - */ -predicate flowIntoParameter( - CallInstruction call, Instruction instr, Function f, int n, InitializeParameterInstruction init -) { - not f.isVirtual() and - call.getPositionalArgument(n) = instr and - f = call.getStaticCallTarget() and - getEnclosingNonVirtualFunctionInitializeParameter(init, f) and - init.getParameter().getIndex() = unbind(n) -} - -/** - * Holds if `instr` is an argument to a call to the function `f`, and `init` is the - * corresponding initialization instruction that receives the value of `instr` in `f`. - */ -pragma[noinline] -predicate getPositionalArgumentInitParam( - CallInstruction call, Instruction instr, InitializeParameterInstruction init, Function f -) { - exists(int n | - parameterOf(_, f, n) and - flowIntoParameter(call, instr, f, unbind(n), init) - ) -} - -/** - * Holds if `instr` is the qualifier to a call to the non-virtual function `f`, and - * `init` is the corresponding initiazation instruction that receives the value of - * `instr` in `f`. - */ -pragma[noinline] -predicate getThisArgumentInitParam( - CallInstruction call, Instruction instr, InitializeParameterInstruction init, Function f -) { - not f.isVirtual() and - call.getStaticCallTarget() = f and - getEnclosingNonVirtualFunctionInitializeParameter(init, f) and - call.getThisArgument() = instr and - init.getIRVariable() instanceof IRThisVariable + override predicate isSink(DataFlow::Node sink) { isSink(sink, _) } } /** Holds if `instr` is a `this` pointer used by the call instruction `call`. */ -predicate isSink(Instruction instr, CallInstruction call) { +predicate isSink(DataFlow::Node sink, CallInstruction call) { exists(PureVirtualFunction func | call.getStaticCallTarget() = func and - call.getThisArgument() = instr and + call.getThisArgument() = sink.asInstruction() and // Weed out implicit calls to destructors of a base class not func instanceof Destructor ) } /** Holds if `init` initializes the `this` pointer in class `c`. */ -predicate isSource(InitializeParameterInstruction init, string msg, Class c) { - ( - exists(Constructor func | - not func instanceof CopyConstructor and - not func instanceof MoveConstructor and - func = init.getEnclosingFunction() and - msg = "construction" - ) - or - init.getEnclosingFunction() instanceof Destructor and msg = "destruction" - ) and - init.getIRVariable() instanceof IRThisVariable and - init.getEnclosingFunction().getDeclaringType() = c -} - -/** - * Holds if `instr` flows to a sink (which is a use of the value of `instr` as a `this` pointer). - */ -predicate flowsToSink(Instruction instr, Instruction sink) { - flowsFromSource(instr) and - ( - isSink(instr, _) and instr = sink - or - exists(Instruction mid | - successor(instr, mid) and - flowsToSink(mid, sink) - ) +predicate isSource(DataFlow::Node source, string msg, Class c) { + exists(InitializeParameterInstruction init | init = source.asInstruction() | + ( + exists(Constructor func | + not func instanceof CopyConstructor and + not func instanceof MoveConstructor and + func = init.getEnclosingFunction() and + msg = "construction" + ) + or + init.getEnclosingFunction() instanceof Destructor and msg = "destruction" + ) and + init.getIRVariable() instanceof IRThisVariable and + init.getEnclosingFunction().getDeclaringType() = c ) } -/** Holds if `instr` flows from a source. */ -predicate flowsFromSource(Instruction instr) { - isSource(instr, _, _) - or - exists(Instruction mid | - successor(mid, instr) and - flowsFromSource(mid) - ) -} - -/** Holds if `f` is the enclosing non-virtual function of `init`. */ -predicate getEnclosingNonVirtualFunctionInitializeParameter( - InitializeParameterInstruction init, Function f -) { - not f.isVirtual() and - init.getEnclosingFunction() = f -} - -/** Holds if `f` is the enclosing non-virtual function of `init`. */ -predicate getEnclosingNonVirtualFunctionInitializeIndirection( - InitializeIndirectionInstruction init, Function f -) { - not f.isVirtual() and - init.getEnclosingFunction() = f -} - -/** - * Holds if `instr` is an argument (or argument indirection) to a call, and - * `succ` is the corresponding initialization instruction in the call target. - */ -predicate flowThroughCallable(Instruction instr, Instruction succ) { - // Flow from an argument to a parameter - exists(CallInstruction call, InitializeParameterInstruction init | init = succ | - getPositionalArgumentInitParam(call, instr, init, call.getStaticCallTarget()) - or - getThisArgumentInitParam(call, instr, init, call.getStaticCallTarget()) - ) - or - // Flow from argument indirection to parameter indirection - exists( - CallInstruction call, ReadSideEffectInstruction read, InitializeIndirectionInstruction init - | - init = succ and - read.getPrimaryInstruction() = call and - getEnclosingNonVirtualFunctionInitializeIndirection(init, call.getStaticCallTarget()) - | - exists(int n | - read.getSideEffectOperand().getAnyDef() = instr and - read.getIndex() = n and - init.getParameter().getIndex() = unbind(n) - ) - or - call.getThisArgument() = instr and - init.getIRVariable() instanceof IRThisVariable - ) -} - -/** Holds if `instr` flows to `succ`. */ -predicate successor(Instruction instr, Instruction succ) { - succ.(CopyInstruction).getSourceValue() = instr or - succ.(CheckedConvertOrNullInstruction).getUnary() = instr or - succ.(ChiInstruction).getTotal() = instr or - succ.(ConvertInstruction).getUnary() = instr or - succ.(InheritanceConversionInstruction).getUnary() = instr or - flowThroughCallable(instr, succ) -} - /** * Holds if: * - `source` is an initialization of a `this` pointer of type `sourceClass`, and @@ -188,22 +63,19 @@ predicate successor(Instruction instr, Instruction succ) { * - `msg` is a string describing whether `source` is from a constructor or destructor. */ predicate flows( - Instruction source, string msg, Class sourceClass, Instruction sink, CallInstruction call + MustFlowPathNode source, string msg, Class sourceClass, MustFlowPathNode sink, + CallInstruction call ) { - isSource(source, msg, sourceClass) and - flowsToSink(source, sink) and - isSink(sink, call) + exists(UnsafeUseOfThisConfig conf | + conf.hasFlowPath(source, sink) and + isSource(source.getNode(), msg, sourceClass) and + isSink(sink.getNode(), call) + ) } -query predicate edges(Instruction a, Instruction b) { successor(a, b) and flowsToSink(b, _) } - -query predicate nodes(Instruction n, string key, string val) { - flowsToSink(n, _) and - key = "semmle.label" and - val = n.toString() -} - -from Instruction source, Instruction sink, CallInstruction call, string msg, Class sourceClass +from + MustFlowPathNode source, MustFlowPathNode sink, CallInstruction call, string msg, + Class sourceClass where flows(source, msg, sourceClass, sink, call) and // Only raise an alert if there is no override of the pure virtual function in any base class. diff --git a/cpp/ql/src/Likely Bugs/RedundantNullCheckSimple.ql b/cpp/ql/src/Likely Bugs/RedundantNullCheckSimple.ql index 65ba665dff2..8d7a07f4335 100644 --- a/cpp/ql/src/Likely Bugs/RedundantNullCheckSimple.ql +++ b/cpp/ql/src/Likely Bugs/RedundantNullCheckSimple.ql @@ -52,7 +52,7 @@ predicate explicitNullTestOfInstruction(Instruction checked, Instruction bool) { pragma[noinline] predicate candidateResult(LoadInstruction checked, ValueNumber value, IRBlock dominator) { explicitNullTestOfInstruction(checked, _) and - not checked.getAST().isInMacroExpansion() and + not checked.getAst().isInMacroExpansion() and value.getAnInstruction() = checked and dominator.dominates(checked.getBlock()) } diff --git a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.qhelp b/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.qhelp deleted file mode 100644 index 80dd9f98e63..00000000000 --- a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.qhelp +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.ql b/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.ql deleted file mode 100644 index 8b46df05adc..00000000000 --- a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCode.ql +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @deprecated - * @name Duplicated lines in files - * @description The number of lines in a file, including code, comment - * and whitespace lines, which are duplicated in at least - * one other place. - * @kind treemap - * @treemap.warnOn highValues - * @metricType file - * @metricAggregate avg sum max - * @id cpp/duplicated-lines-in-files - * @tags testability - * modularity - */ - -import external.CodeDuplication - -from File f, int n -where - n = - count(int line | - exists(DuplicateBlock d | d.sourceFile() = f | - line in [d.sourceStartLine() .. d.sourceEndLine()] - ) and - not whitelistedLineForDuplication(f, line) - ) -select f, n order by n desc diff --git a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp b/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp deleted file mode 100644 index 6fc36156c11..00000000000 --- a/cpp/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp +++ /dev/null @@ -1,35 +0,0 @@ - - - - -

-This metric measures the number of lines in a file that are contained within a block that is duplicated elsewhere. These lines may include code, comments and whitespace, and the duplicate block may be in this file or in another file. -

- -

-A file that contains many lines that are duplicated within the code base is problematic -for a number of reasons. -

- - - - - - -

-Refactor files with lots of duplicated code to extract the common code into -a shared library or module. -

- -
- - - -
  • Wikipedia: Duplicate code.
  • -
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • - - -
    - diff --git a/cpp/ql/src/Security/CWE/CWE-020/CountUntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/CountUntrustedDataToExternalAPI.ql index 8c75e8da6e2..bebff32a5c1 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/CountUntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/CountUntrustedDataToExternalAPI.ql @@ -11,7 +11,7 @@ import cpp import ExternalAPIs -from ExternalAPIUsedWithUntrustedData externalAPI -select externalAPI, count(externalAPI.getUntrustedDataNode()) as numberOfUses, - externalAPI.getNumberOfUntrustedSources() as numberOfUntrustedSources order by +from ExternalApiUsedWithUntrustedData externalApi +select externalApi, count(externalApi.getUntrustedDataNode()) as numberOfUses, + externalApi.getNumberOfUntrustedSources() as numberOfUntrustedSources order by numberOfUntrustedSources desc diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll index 29d5b20cfc4..0636dcbe11b 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll @@ -9,28 +9,31 @@ private import semmle.code.cpp.models.interfaces.Taint import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ -class UntrustedExternalAPIDataNode extends ExternalAPIDataNode { - UntrustedExternalAPIDataNode() { any(UntrustedDataToExternalAPIConfig c).hasFlow(_, this) } +class UntrustedExternalApiDataNode extends ExternalApiDataNode { + UntrustedExternalApiDataNode() { any(UntrustedDataToExternalApiConfig c).hasFlow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { - any(UntrustedDataToExternalAPIConfig c).hasFlow(result, this) + any(UntrustedDataToExternalApiConfig c).hasFlow(result, this) } } -private newtype TExternalAPI = - TExternalAPIParameter(Function f, int index) { - exists(UntrustedExternalAPIDataNode n | +/** DEPRECATED: Alias for UntrustedExternalApiDataNode */ +deprecated class UntrustedExternalAPIDataNode = UntrustedExternalApiDataNode; + +private newtype TExternalApi = + TExternalApiParameter(Function f, int index) { + exists(UntrustedExternalApiDataNode n | f = n.getExternalFunction() and index = n.getIndex() ) } /** An external API which is used with untrusted data. */ -class ExternalAPIUsedWithUntrustedData extends TExternalAPI { +class ExternalApiUsedWithUntrustedData extends TExternalApi { /** Gets a possibly untrusted use of this external API. */ - UntrustedExternalAPIDataNode getUntrustedDataNode() { - this = TExternalAPIParameter(result.getExternalFunction(), result.getIndex()) + UntrustedExternalApiDataNode getUntrustedDataNode() { + this = TExternalApiParameter(result.getExternalFunction(), result.getIndex()) } /** Gets the number of untrusted sources used with this external API. */ @@ -43,8 +46,11 @@ class ExternalAPIUsedWithUntrustedData extends TExternalAPI { exists(Function f, int index, string indexString | if index = -1 then indexString = "qualifier" else indexString = "param " + index | - this = TExternalAPIParameter(f, index) and + this = TExternalApiParameter(f, index) and result = f.toString() + " [" + indexString + "]" ) } } + +/** DEPRECATED: Alias for ExternalApiUsedWithUntrustedData */ +deprecated class ExternalAPIUsedWithUntrustedData = ExternalApiUsedWithUntrustedData; diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll index 5e710c9548d..db236b510b9 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll @@ -8,11 +8,11 @@ import semmle.code.cpp.models.interfaces.DataFlow import SafeExternalAPIFunction /** A node representing untrusted data being passed to an external API. */ -class ExternalAPIDataNode extends DataFlow::Node { +class ExternalApiDataNode extends DataFlow::Node { Call call; int i; - ExternalAPIDataNode() { + ExternalApiDataNode() { // Argument to call to a function ( this.asExpr() = call.getArgument(i) @@ -27,7 +27,7 @@ class ExternalAPIDataNode extends DataFlow::Node { not f instanceof DataFlowFunction and not f instanceof TaintFunction and // Not a call to a known safe external API - not f instanceof SafeExternalAPIFunction + not f instanceof SafeExternalApiFunction ) } @@ -41,9 +41,12 @@ class ExternalAPIDataNode extends DataFlow::Node { string getFunctionDescription() { result = this.getExternalFunction().toString() } } -/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalAPIDataNode`s. */ -class UntrustedDataToExternalAPIConfig extends TaintTracking::Configuration { - UntrustedDataToExternalAPIConfig() { this = "UntrustedDataToExternalAPIConfig" } +/** DEPRECATED: Alias for ExternalApiDataNode */ +deprecated class ExternalAPIDataNode = ExternalApiDataNode; + +/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { + UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfig" } override predicate isSource(DataFlow::Node source) { exists(RemoteFlowSourceFunction remoteFlow | @@ -52,5 +55,8 @@ class UntrustedDataToExternalAPIConfig extends TaintTracking::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalAPIDataNode } + override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } + +/** DEPRECATED: Alias for UntrustedDataToExternalApiConfig */ +deprecated class UntrustedDataToExternalAPIConfig = UntrustedDataToExternalApiConfig; diff --git a/cpp/ql/src/Security/CWE/CWE-020/IRCountUntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/IRCountUntrustedDataToExternalAPI.ql index 4d0c2174809..69911c22c6a 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/IRCountUntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/IRCountUntrustedDataToExternalAPI.ql @@ -11,7 +11,7 @@ import cpp import ir.ExternalAPIs -from ExternalAPIUsedWithUntrustedData externalAPI -select externalAPI, count(externalAPI.getUntrustedDataNode()) as numberOfUses, - externalAPI.getNumberOfUntrustedSources() as numberOfUntrustedSources order by +from ExternalApiUsedWithUntrustedData externalApi +select externalApi, count(externalApi.getUntrustedDataNode()) as numberOfUses, + externalApi.getNumberOfUntrustedSources() as numberOfUntrustedSources order by numberOfUntrustedSources desc diff --git a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql index 47a0bf14b7f..4860fc5356f 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql @@ -15,8 +15,8 @@ import ir.ExternalAPIs import semmle.code.cpp.security.FlowSources import DataFlow::PathGraph -from UntrustedDataToExternalAPIConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +from UntrustedDataToExternalApiConfig config, DataFlow::PathNode source, DataFlow::PathNode sink where config.hasFlowPath(source, sink) select sink, source, sink, - "Call to " + sink.getNode().(ExternalAPIDataNode).getExternalFunction().toString() + + "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.getNode().(RemoteFlowSource).getSourceType() diff --git a/cpp/ql/src/Security/CWE/CWE-020/SafeExternalAPIFunction.qll b/cpp/ql/src/Security/CWE/CWE-020/SafeExternalAPIFunction.qll index 5eb0b23d914..de59e82e552 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/SafeExternalAPIFunction.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/SafeExternalAPIFunction.qll @@ -8,11 +8,14 @@ private import semmle.code.cpp.models.interfaces.SideEffect /** * A `Function` that is considered a "safe" external API from a security perspective. */ -abstract class SafeExternalAPIFunction extends Function { } +abstract class SafeExternalApiFunction extends Function { } + +/** DEPRECATED: Alias for SafeExternalApiFunction */ +deprecated class SafeExternalAPIFunction = SafeExternalApiFunction; /** The default set of "safe" external APIs. */ -private class DefaultSafeExternalAPIFunction extends SafeExternalAPIFunction { - DefaultSafeExternalAPIFunction() { +private class DefaultSafeExternalApiFunction extends SafeExternalApiFunction { + DefaultSafeExternalApiFunction() { // If a function does not write to any of its arguments, we consider it safe to // pass untrusted data to it. This means that string functions such as `strcmp` // and `strlen`, as well as memory functions such as `memcmp`, are considered safe. diff --git a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql index b85a5b26a7f..01067425190 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql @@ -14,8 +14,8 @@ import semmle.code.cpp.dataflow.TaintTracking import ExternalAPIs import DataFlow::PathGraph -from UntrustedDataToExternalAPIConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +from UntrustedDataToExternalApiConfig config, DataFlow::PathNode source, DataFlow::PathNode sink where config.hasFlowPath(source, sink) select sink, source, sink, - "Call to " + sink.getNode().(ExternalAPIDataNode).getExternalFunction().toString() + + "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.toString() diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll index 29d5b20cfc4..0636dcbe11b 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll @@ -9,28 +9,31 @@ private import semmle.code.cpp.models.interfaces.Taint import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ -class UntrustedExternalAPIDataNode extends ExternalAPIDataNode { - UntrustedExternalAPIDataNode() { any(UntrustedDataToExternalAPIConfig c).hasFlow(_, this) } +class UntrustedExternalApiDataNode extends ExternalApiDataNode { + UntrustedExternalApiDataNode() { any(UntrustedDataToExternalApiConfig c).hasFlow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { - any(UntrustedDataToExternalAPIConfig c).hasFlow(result, this) + any(UntrustedDataToExternalApiConfig c).hasFlow(result, this) } } -private newtype TExternalAPI = - TExternalAPIParameter(Function f, int index) { - exists(UntrustedExternalAPIDataNode n | +/** DEPRECATED: Alias for UntrustedExternalApiDataNode */ +deprecated class UntrustedExternalAPIDataNode = UntrustedExternalApiDataNode; + +private newtype TExternalApi = + TExternalApiParameter(Function f, int index) { + exists(UntrustedExternalApiDataNode n | f = n.getExternalFunction() and index = n.getIndex() ) } /** An external API which is used with untrusted data. */ -class ExternalAPIUsedWithUntrustedData extends TExternalAPI { +class ExternalApiUsedWithUntrustedData extends TExternalApi { /** Gets a possibly untrusted use of this external API. */ - UntrustedExternalAPIDataNode getUntrustedDataNode() { - this = TExternalAPIParameter(result.getExternalFunction(), result.getIndex()) + UntrustedExternalApiDataNode getUntrustedDataNode() { + this = TExternalApiParameter(result.getExternalFunction(), result.getIndex()) } /** Gets the number of untrusted sources used with this external API. */ @@ -43,8 +46,11 @@ class ExternalAPIUsedWithUntrustedData extends TExternalAPI { exists(Function f, int index, string indexString | if index = -1 then indexString = "qualifier" else indexString = "param " + index | - this = TExternalAPIParameter(f, index) and + this = TExternalApiParameter(f, index) and result = f.toString() + " [" + indexString + "]" ) } } + +/** DEPRECATED: Alias for ExternalApiUsedWithUntrustedData */ +deprecated class ExternalAPIUsedWithUntrustedData = ExternalApiUsedWithUntrustedData; diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll index 994e76d6ced..b0fa685d1a4 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll @@ -8,11 +8,11 @@ private import semmle.code.cpp.models.interfaces.DataFlow import SafeExternalAPIFunction /** A node representing untrusted data being passed to an external API. */ -class ExternalAPIDataNode extends DataFlow::Node { +class ExternalApiDataNode extends DataFlow::Node { Call call; int i; - ExternalAPIDataNode() { + ExternalApiDataNode() { // Argument to call to a function ( this.asExpr() = call.getArgument(i) @@ -27,7 +27,7 @@ class ExternalAPIDataNode extends DataFlow::Node { not f instanceof DataFlowFunction and not f instanceof TaintFunction and // Not a call to a known safe external API - not f instanceof SafeExternalAPIFunction + not f instanceof SafeExternalApiFunction ) } @@ -41,11 +41,17 @@ class ExternalAPIDataNode extends DataFlow::Node { string getFunctionDescription() { result = this.getExternalFunction().toString() } } -/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalAPIDataNode`s. */ -class UntrustedDataToExternalAPIConfig extends TaintTracking::Configuration { - UntrustedDataToExternalAPIConfig() { this = "UntrustedDataToExternalAPIConfigIR" } +/** DEPRECATED: Alias for ExternalApiDataNode */ +deprecated class ExternalAPIDataNode = ExternalApiDataNode; + +/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { + UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfigIR" } override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalAPIDataNode } + override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } + +/** DEPRECATED: Alias for UntrustedDataToExternalApiConfig */ +deprecated class UntrustedDataToExternalAPIConfig = UntrustedDataToExternalApiConfig; diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/SafeExternalAPIFunction.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/SafeExternalAPIFunction.qll index 5eb0b23d914..de59e82e552 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/SafeExternalAPIFunction.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/SafeExternalAPIFunction.qll @@ -8,11 +8,14 @@ private import semmle.code.cpp.models.interfaces.SideEffect /** * A `Function` that is considered a "safe" external API from a security perspective. */ -abstract class SafeExternalAPIFunction extends Function { } +abstract class SafeExternalApiFunction extends Function { } + +/** DEPRECATED: Alias for SafeExternalApiFunction */ +deprecated class SafeExternalAPIFunction = SafeExternalApiFunction; /** The default set of "safe" external APIs. */ -private class DefaultSafeExternalAPIFunction extends SafeExternalAPIFunction { - DefaultSafeExternalAPIFunction() { +private class DefaultSafeExternalApiFunction extends SafeExternalApiFunction { + DefaultSafeExternalApiFunction() { // If a function does not write to any of its arguments, we consider it safe to // pass untrusted data to it. This means that string functions such as `strcmp` // and `strlen`, as well as memory functions such as `memcmp`, are considered safe. diff --git a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql index 26652d9c1da..73fcf034096 100644 --- a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql @@ -19,9 +19,9 @@ import semmle.code.cpp.security.Security import semmle.code.cpp.valuenumbering.GlobalValueNumbering import semmle.code.cpp.ir.IR import semmle.code.cpp.ir.dataflow.TaintTracking -import semmle.code.cpp.ir.dataflow.TaintTracking2 import semmle.code.cpp.security.FlowSources import semmle.code.cpp.models.implementations.Strcat +import DataFlow::PathGraph Expr sinkAsArgumentIndirection(DataFlow::Node sink) { result = @@ -66,154 +66,70 @@ predicate interestingConcatenation(DataFlow::Node fst, DataFlow::Node snd) { ) } -class TaintToConcatenationConfiguration extends TaintTracking::Configuration { - TaintToConcatenationConfiguration() { this = "TaintToConcatenationConfiguration" } - - override predicate isSource(DataFlow::Node source) { source instanceof FlowSource } - - override predicate isSink(DataFlow::Node sink) { interestingConcatenation(sink, _) } - - override predicate isSanitizer(DataFlow::Node node) { - node.asInstruction().getResultType() instanceof IntegralType - or - node.asInstruction().getResultType() instanceof FloatingPointType - } +class ConcatState extends DataFlow::FlowState { + ConcatState() { this = "ConcatState" } } -class ExecTaintConfiguration extends TaintTracking2::Configuration { - ExecTaintConfiguration() { this = "ExecTaintConfiguration" } +class ExecState extends DataFlow::FlowState { + DataFlow::Node fst; + DataFlow::Node snd; - override predicate isSource(DataFlow::Node source) { - exists(DataFlow::Node prevSink, TaintToConcatenationConfiguration conf | - conf.hasFlow(_, prevSink) and - interestingConcatenation(prevSink, source) - ) + ExecState() { + this = + "ExecState (" + fst.getLocation() + " | " + fst + ", " + snd.getLocation() + " | " + snd + ")" and + interestingConcatenation(fst, snd) } - override predicate isSink(DataFlow::Node sink) { - shellCommand(sinkAsArgumentIndirection(sink), _) + DataFlow::Node getFstNode() { result = fst } + + DataFlow::Node getSndNode() { result = snd } +} + +class ExecTaintConfiguration extends TaintTracking::Configuration { + ExecTaintConfiguration() { this = "ExecTaintConfiguration" } + + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + source instanceof FlowSource and + state instanceof ConcatState + } + + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + shellCommand(sinkAsArgumentIndirection(sink), _) and + state instanceof ExecState + } + + override predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + state1 instanceof ConcatState and + state2.(ExecState).getFstNode() = node1 and + state2.(ExecState).getSndNode() = node2 + } + + override predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { + ( + node.asInstruction().getResultType() instanceof IntegralType + or + node.asInstruction().getResultType() instanceof FloatingPointType + ) and + state instanceof ConcatState } override predicate isSanitizerOut(DataFlow::Node node) { - isSink(node) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers + isSink(node, _) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers } } -module StitchedPathGraph { - // There's a different PathNode class for each DataFlowImplN.qll, so we can't simply combine the - // PathGraph predicates directly. Instead, we use a newtype so there's a single type that - // contains both sets of PathNodes. - newtype TMergedPathNode = - TPathNode1(DataFlow::PathNode node) or - TPathNode2(DataFlow2::PathNode node) - - // this wraps the toString and location predicates so we can use the merged node type in a - // selection - class MergedPathNode extends TMergedPathNode { - string toString() { - exists(DataFlow::PathNode n | - this = TPathNode1(n) and - result = n.toString() - ) - or - exists(DataFlow2::PathNode n | - this = TPathNode2(n) and - result = n.toString() - ) - } - - DataFlow::Node getNode() { - exists(DataFlow::PathNode n | - this = TPathNode1(n) and - result = n.getNode() - ) - or - exists(DataFlow2::PathNode n | - this = TPathNode2(n) and - result = n.getNode() - ) - } - - DataFlow::PathNode getPathNode1() { this = TPathNode1(result) } - - DataFlow2::PathNode getPathNode2() { this = TPathNode2(result) } - - predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - exists(DataFlow::PathNode n | - this = TPathNode1(n) and - n.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - ) - or - exists(DataFlow2::PathNode n | - this = TPathNode2(n) and - n.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - ) - } - } - - query predicate edges(MergedPathNode a, MergedPathNode b) { - exists(DataFlow::PathNode an, DataFlow::PathNode bn | - a = TPathNode1(an) and - b = TPathNode1(bn) and - DataFlow::PathGraph::edges(an, bn) - ) - or - exists(DataFlow2::PathNode an, DataFlow2::PathNode bn | - a = TPathNode2(an) and - b = TPathNode2(bn) and - DataFlow2::PathGraph::edges(an, bn) - ) - or - // This is where paths from the two configurations are connected. `interestingConcatenation` - // is the only thing in this module that's actually specific to the query - everything else is - // just using types and predicates from the DataFlow library. - interestingConcatenation(a.getNode(), b.getNode()) and - a instanceof TPathNode1 and - b instanceof TPathNode2 - } - - query predicate nodes(MergedPathNode mpn, string key, string val) { - // here we just need the union of the underlying `nodes` predicates - exists(DataFlow::PathNode n | - mpn = TPathNode1(n) and - DataFlow::PathGraph::nodes(n, key, val) - ) - or - exists(DataFlow2::PathNode n | - mpn = TPathNode2(n) and - DataFlow2::PathGraph::nodes(n, key, val) - ) - } - - query predicate subpaths( - MergedPathNode arg, MergedPathNode par, MergedPathNode ret, MergedPathNode out - ) { - // just forward subpaths from the underlying libraries. This might be slightly awkward when - // the concatenation is deep in a call chain. - DataFlow::PathGraph::subpaths(arg.getPathNode1(), par.getPathNode1(), ret.getPathNode1(), - out.getPathNode1()) - or - DataFlow2::PathGraph::subpaths(arg.getPathNode2(), par.getPathNode2(), ret.getPathNode2(), - out.getPathNode2()) - } -} - -import StitchedPathGraph - from - DataFlow::PathNode sourceNode, DataFlow::PathNode concatSink, DataFlow2::PathNode concatSource, - DataFlow2::PathNode sinkNode, string taintCause, string callChain, - TaintToConcatenationConfiguration conf1, ExecTaintConfiguration conf2 + ExecTaintConfiguration conf, DataFlow::PathNode sourceNode, DataFlow::PathNode sinkNode, + string taintCause, string callChain, DataFlow::Node concatResult where + conf.hasFlowPath(sourceNode, sinkNode) and taintCause = sourceNode.getNode().(FlowSource).getSourceType() and - conf1.hasFlowPath(sourceNode, concatSink) and - interestingConcatenation(concatSink.getNode(), concatSource.getNode()) and // this loses call context - conf2.hasFlowPath(concatSource, sinkNode) and - shellCommand(sinkAsArgumentIndirection(sinkNode.getNode()), callChain) -select sinkAsArgumentIndirection(sinkNode.getNode()), TPathNode1(sourceNode).(MergedPathNode), - TPathNode2(sinkNode).(MergedPathNode), + shellCommand(sinkAsArgumentIndirection(sinkNode.getNode()), callChain) and + concatResult = sinkNode.getState().(ExecState).getSndNode() +select sinkAsArgumentIndirection(sinkNode.getNode()), sourceNode, sinkNode, "This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to " - + callChain, sourceNode, "user input (" + taintCause + ")", concatSource, - concatSource.toString() + + callChain, sourceNode, "user input (" + taintCause + ")", concatResult, + concatResult.toString() diff --git a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql index 92c8b9a2bd5..1f8a5023864 100644 --- a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql @@ -18,15 +18,15 @@ import semmle.code.cpp.security.FunctionWithWrappers import semmle.code.cpp.security.TaintTracking import TaintedWithPath -class SQLLikeFunction extends FunctionWithWrappers { - SQLLikeFunction() { sqlArgument(this.getName(), _) } +class SqlLikeFunction extends FunctionWithWrappers { + SqlLikeFunction() { sqlArgument(this.getName(), _) } override predicate interestingArg(int arg) { sqlArgument(this.getName(), arg) } } class Configuration extends TaintTrackingConfiguration { override predicate isSink(Element tainted) { - exists(SQLLikeFunction runSql | runSql.outermostWrapperFunctionCall(tainted, _)) + exists(SqlLikeFunction runSql | runSql.outermostWrapperFunctionCall(tainted, _)) } override predicate isBarrier(Expr e) { @@ -43,7 +43,7 @@ class Configuration extends TaintTrackingConfiguration { } from - SQLLikeFunction runSql, Expr taintedArg, Expr taintSource, PathNode sourceNode, PathNode sinkNode, + SqlLikeFunction runSql, Expr taintedArg, Expr taintSource, PathNode sourceNode, PathNode sinkNode, string taintCause, string callChain where runSql.outermostWrapperFunctionCall(taintedArg, callChain) and diff --git a/cpp/ql/src/Security/CWE/CWE-120/OverrunWrite.ql b/cpp/ql/src/Security/CWE/CWE-120/OverrunWrite.ql index e60f8d8b452..438e87a501a 100644 --- a/cpp/ql/src/Security/CWE/CWE-120/OverrunWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-120/OverrunWrite.ql @@ -15,7 +15,6 @@ */ import semmle.code.cpp.security.BufferWrite -import semmle.code.cpp.commons.Alloc /* * See CWE-120/UnboundedWrite.ql for a summary of CWE-120 alert cases. diff --git a/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql b/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql index 352314f7f13..bf2cf765b59 100644 --- a/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql @@ -15,7 +15,6 @@ */ import semmle.code.cpp.security.BufferWrite -import semmle.code.cpp.commons.Alloc /* * See CWE-120/UnboundedWrite.ql for a summary of CWE-120 alert cases. diff --git a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql index 0621def4d98..f16bb1e25d9 100644 --- a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql +++ b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql @@ -3,18 +3,22 @@ * @description Accessing an array without first checking * that the index is within the bounds of the array can * cause undefined behavior and can also be a security risk. - * @kind problem + * @kind path-problem * @id cpp/unclear-array-index-validation * @problem.severity warning * @security-severity 8.8 + * @precision low * @tags security * external/cwe/cwe-129 */ import cpp -import semmle.code.cpp.controlflow.Guards -private import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils -import semmle.code.cpp.security.TaintTracking +import semmle.code.cpp.controlflow.IRGuards +import semmle.code.cpp.security.FlowSources +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils +import DataFlow::PathGraph +import semmle.code.cpp.security.Security predicate hasUpperBound(VariableAccess offsetExpr) { exists(BasicBlock controlled, StackVariable offsetVar, SsaDefinition def | @@ -32,11 +36,92 @@ predicate linearBoundControls(BasicBlock controlled, SsaDefinition def, StackVar ) } -from Expr origin, ArrayExpr arrayExpr, VariableAccess offsetExpr +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + readsVariable(node.asInstruction(), checkedVar) and + any(IRGuardCondition guard).ensuresEq(access, _, _, node.asInstruction().getBlock(), true) +} + +predicate isFlowSource(FlowSource source, string sourceType) { sourceType = source.getSourceType() } + +predicate predictableInstruction(Instruction instr) { + instr instanceof ConstantInstruction + or + instr instanceof StringConstantInstruction + or + // This could be a conversion on a string literal + predictableInstruction(instr.(UnaryInstruction).getUnary()) +} + +class ImproperArrayIndexValidationConfig extends TaintTracking::Configuration { + ImproperArrayIndexValidationConfig() { this = "ImproperArrayIndexValidationConfig" } + + override predicate isSource(DataFlow::Node source) { isFlowSource(source, _) } + + override predicate isSanitizer(DataFlow::Node node) { + hasUpperBound(node.asExpr()) + or + // These barriers are ported from `DefaultTaintTracking` because this query is quite noisy + // otherwise. + exists(Variable checkedVar | + readsVariable(node.asInstruction(), checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + exists(Variable checkedVar, Operand access | + readsVariable(access.getDef(), checkedVar) and + nodeIsBarrierEqualityCandidate(node, access, checkedVar) + ) + or + // Don't use dataflow into binary instructions if both operands are unpredictable + exists(BinaryInstruction iTo | + iTo = node.asInstruction() and + not predictableInstruction(iTo.getLeft()) and + not predictableInstruction(iTo.getRight()) and + // propagate taint from either the pointer or the offset, regardless of predictability + not iTo instanceof PointerArithmeticInstruction + ) + or + // don't use dataflow through calls to pure functions if two or more operands + // are unpredictable + exists(Instruction iFrom1, Instruction iFrom2, CallInstruction iTo | + iTo = node.asInstruction() and + isPureFunction(iTo.getStaticCallTarget().getName()) and + iFrom1 = iTo.getAnArgument() and + iFrom2 = iTo.getAnArgument() and + not predictableInstruction(iFrom1) and + not predictableInstruction(iFrom2) and + iFrom1 != iFrom2 + ) + } + + override predicate isSink(DataFlow::Node sink) { + exists(ArrayExpr arrayExpr, VariableAccess offsetExpr | + offsetExpr = arrayExpr.getArrayOffset() and + sink.asExpr() = offsetExpr and + not hasUpperBound(offsetExpr) + ) + } +} + +from + ImproperArrayIndexValidationConfig conf, DataFlow::PathNode source, DataFlow::PathNode sink, + string sourceType where - tainted(origin, offsetExpr) and - offsetExpr = arrayExpr.getArrayOffset() and - not hasUpperBound(offsetExpr) -select offsetExpr, + conf.hasFlowPath(source, sink) and + isFlowSource(source.getNode(), sourceType) +select sink.getNode(), source, sink, "$@ flows to here and is used in an array indexing expression, potentially causing an invalid access.", - origin, "User-provided value" + source.getNode(), sourceType diff --git a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql index 585875798cc..49de733d381 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql @@ -15,55 +15,89 @@ import cpp import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis -import semmle.code.cpp.security.TaintTracking -import TaintedWithPath +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.ir.IR +import semmle.code.cpp.controlflow.IRGuards +import semmle.code.cpp.security.FlowSources +import DataFlow::PathGraph /** * Holds if `alloc` is an allocation, and `tainted` is a child of it that is a * taint sink. */ -predicate allocSink(Expr alloc, Expr tainted) { - isAllocationExpr(alloc) and - tainted = alloc.getAChild() and - tainted.getUnspecifiedType() instanceof IntegralType -} - -class TaintedAllocationSizeConfiguration extends TaintTrackingConfiguration { - override predicate isSink(Element tainted) { allocSink(_, tainted) } - - override predicate isBarrier(Expr e) { - super.isBarrier(e) - or - // There can be two separate reasons for `convertedExprMightOverflow` not holding: - // 1. `e` really cannot overflow. - // 2. `e` isn't analyzable. - // If we didn't rule out case 2 we would place barriers on anything that isn't analyzable. - ( - e instanceof UnaryArithmeticOperation or - e instanceof BinaryArithmeticOperation or - e instanceof AssignArithmeticOperation - ) and - not convertedExprMightOverflow(e) - or - // Subtracting two pointers is either well-defined (and the result will likely be small), or - // terribly undefined and dangerous. Here, we assume that the programmer has ensured that the - // result is well-defined (i.e., the two pointers point to the same object), and thus the result - // will likely be small. - e = any(PointerDiffExpr diff).getAnOperand() - } -} - -predicate taintedAllocSize( - Expr source, Expr alloc, PathNode sourceNode, PathNode sinkNode, string taintCause -) { - isUserInput(source, taintCause) and - exists(Expr tainted | - allocSink(alloc, tainted) and - taintedWithPath(source, tainted, sourceNode, sinkNode) +predicate allocSink(Expr alloc, DataFlow::Node sink) { + exists(Expr e | e = sink.asConvertedExpr() | + isAllocationExpr(alloc) and + e = alloc.getAChild() and + e.getUnspecifiedType() instanceof IntegralType ) } -from Expr source, Expr alloc, PathNode sourceNode, PathNode sinkNode, string taintCause -where taintedAllocSize(source, alloc, sourceNode, sinkNode, taintCause) -select alloc, sourceNode, sinkNode, "This allocation size is derived from $@ and might overflow", - source, "user input (" + taintCause + ")" +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + readsVariable(node.asInstruction(), checkedVar) and + any(IRGuardCondition guard).ensuresEq(access, _, _, node.asInstruction().getBlock(), true) +} + +predicate isFlowSource(FlowSource source, string sourceType) { sourceType = source.getSourceType() } + +class TaintedAllocationSizeConfiguration extends TaintTracking::Configuration { + TaintedAllocationSizeConfiguration() { this = "TaintedAllocationSizeConfiguration" } + + override predicate isSource(DataFlow::Node source) { isFlowSource(source, _) } + + override predicate isSink(DataFlow::Node sink) { allocSink(_, sink) } + + override predicate isSanitizer(DataFlow::Node node) { + exists(Expr e | e = node.asExpr() | + // There can be two separate reasons for `convertedExprMightOverflow` not holding: + // 1. `e` really cannot overflow. + // 2. `e` isn't analyzable. + // If we didn't rule out case 2 we would place barriers on anything that isn't analyzable. + ( + e instanceof UnaryArithmeticOperation or + e instanceof BinaryArithmeticOperation or + e instanceof AssignArithmeticOperation + ) and + not convertedExprMightOverflow(e) + or + // Subtracting two pointers is either well-defined (and the result will likely be small), or + // terribly undefined and dangerous. Here, we assume that the programmer has ensured that the + // result is well-defined (i.e., the two pointers point to the same object), and thus the result + // will likely be small. + e = any(PointerDiffExpr diff).getAnOperand() + ) + or + exists(Variable checkedVar | + readsVariable(node.asInstruction(), checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + exists(Variable checkedVar, Operand access | + readsVariable(access.getDef(), checkedVar) and + nodeIsBarrierEqualityCandidate(node, access, checkedVar) + ) + } +} + +from + Expr alloc, DataFlow::PathNode source, DataFlow::PathNode sink, string taintCause, + TaintedAllocationSizeConfiguration conf +where + isFlowSource(source.getNode(), taintCause) and + conf.hasFlowPath(source, sink) and + allocSink(alloc, sink.getNode()) +select alloc, source, sink, "This allocation size is derived from $@ and might overflow", + source.getNode(), "user input (" + taintCause + ")" diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index 8a9d4f9b991..72d96d0da3f 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -9,28 +9,43 @@ * @id cpp/cleartext-transmission * @tags security * external/cwe/cwe-319 + * external/cwe/cwe-359 */ import cpp import semmle.code.cpp.security.SensitiveExprs +import semmle.code.cpp.security.PrivateData import semmle.code.cpp.dataflow.TaintTracking import semmle.code.cpp.models.interfaces.FlowSource import semmle.code.cpp.commons.File import DataFlow::PathGraph +class SourceVariable extends Variable { + SourceVariable() { + this instanceof SensitiveVariable or + this instanceof PrivateDataVariable + } +} + +class SourceFunction extends Function { + SourceFunction() { + this instanceof SensitiveFunction or + this instanceof PrivateDataFunction + } +} + /** * A DataFlow node corresponding to a variable or function call that * might contain or return a password or other sensitive information. */ -class SensitiveNode extends DataFlow::Node { - SensitiveNode() { - this.asExpr() = any(SensitiveVariable sv).getInitializer().getExpr() or - this.asExpr().(VariableAccess).getTarget() = - any(SensitiveVariable sv).(GlobalOrNamespaceVariable) or - this.asExpr().(VariableAccess).getTarget() = any(SensitiveVariable v | v instanceof Field) or - this.asUninitialized() instanceof SensitiveVariable or - this.asParameter() instanceof SensitiveVariable or - this.asExpr().(FunctionCall).getTarget() instanceof SensitiveFunction +class SourceNode extends DataFlow::Node { + SourceNode() { + this.asExpr() = any(SourceVariable sv).getInitializer().getExpr() or + this.asExpr().(VariableAccess).getTarget() = any(SourceVariable sv).(GlobalOrNamespaceVariable) or + this.asExpr().(VariableAccess).getTarget() = any(SourceVariable v | v instanceof Field) or + this.asUninitialized() instanceof SourceVariable or + this.asParameter() instanceof SourceVariable or + this.asExpr().(FunctionCall).getTarget() instanceof SourceFunction } } @@ -207,7 +222,7 @@ class Encrypted extends Expr { class FromSensitiveConfiguration extends TaintTracking::Configuration { FromSensitiveConfiguration() { this = "FromSensitiveConfiguration" } - override predicate isSource(DataFlow::Node source) { source instanceof SensitiveNode } + override predicate isSource(DataFlow::Node source) { source instanceof SourceNode } override predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(NetworkSendRecv nsr).getDataExpr() diff --git a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql index 1410873a06b..13e72842fba 100644 --- a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql +++ b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql @@ -3,6 +3,7 @@ * @description Non-HTTPS connections can be intercepted by third parties. * @kind path-problem * @problem.severity warning + * @security-severity 8.1 * @precision high * @id cpp/non-https-url * @tags security diff --git a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.c b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.c new file mode 100644 index 00000000000..0d4ba9feb8f --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.c @@ -0,0 +1,8 @@ +void encrypt_with_openssl(EVP_PKEY_CTX *ctx) { + + // BAD: only 1024 bits for an RSA key + EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 1024); + + // GOOD: 2048 bits for an RSA key + EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048); +} \ No newline at end of file diff --git a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp new file mode 100644 index 00000000000..a0402119ba8 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp @@ -0,0 +1,38 @@ + + + +

    Using cryptographic algorithms with a small key size can leave data vulnerable to being decrypted.

    + +

    Many cryptographic algorithms provided by cryptography libraries can be configured with key sizes that are +vulnerable to brute force attacks. Using such a key size means that an attacker may be able to easily decrypt the +encrypted data.

    + +
    + + +

    Ensure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048.

    + +
    + + +

    The following code shows an example of using the openssl library to generate an RSA key. +When creating a key, you must specify which key size to use. The first example uses 1024 bits, which is not +considered sufficient. The second example uses 2048 bits, which is currently considered sufficient.

    + + + +
    + + +
  • NIST, FIPS 140 Annex a: +Approved Security Functions.
  • +
  • NIST, SP 800-131A: +Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths.
  • + + + +
    +
    diff --git a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql new file mode 100644 index 00000000000..202e9fb225d --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql @@ -0,0 +1,64 @@ +/** + * @name Use of a cryptographic algorithm with insufficient key size + * @description Using cryptographic algorithms with too small a key size can + * allow an attacker to compromise security. + * @kind path-problem + * @problem.severity error + * @security-severity 7.5 + * @precision high + * @id cpp/insufficient-key-size + * @tags security + * external/cwe/cwe-326 + */ + +import cpp +import semmle.code.cpp.ir.dataflow.DataFlow +import semmle.code.cpp.ir.IR +import DataFlow::PathGraph + +// Gets the recommended minimum key size (in bits) of `func`, the name of an encryption function that accepts a key size as parameter `paramIndex` +int getMinimumKeyStrength(string func, int paramIndex) { + func = + [ + "EVP_PKEY_CTX_set_dsa_paramgen_bits", "DSA_generate_parameters_ex", + "EVP_PKEY_CTX_set_rsa_keygen_bits", "RSA_generate_key_ex", "RSA_generate_key_fips", + "EVP_PKEY_CTX_set_dh_paramgen_prime_len", "DH_generate_parameters_ex" + ] and + paramIndex = 1 and + result = 2048 +} + +class KeyStrengthFlow extends DataFlow::Configuration { + KeyStrengthFlow() { this = "KeyStrengthFlow" } + + override predicate isSource(DataFlow::Node node) { + exists(int bits | + node.asInstruction().(IntegerConstantInstruction).getValue().toInt() = bits and + bits < getMinimumKeyStrength(_, _) and + bits > 0 // exclude sentinel values + ) + } + + override predicate isSink(DataFlow::Node node) { + exists(FunctionCall fc, string name, int param | + node.asExpr() = fc.getArgument(param) and + fc.getTarget().hasGlobalName(name) and + exists(getMinimumKeyStrength(name, param)) + ) + } +} + +from + DataFlow::PathNode source, DataFlow::PathNode sink, KeyStrengthFlow conf, FunctionCall fc, + int param, string name, int minimumBits, int bits +where + conf.hasFlowPath(source, sink) and + sink.getNode().asExpr() = fc.getArgument(param) and + fc.getTarget().hasGlobalName(name) and + minimumBits = getMinimumKeyStrength(name, param) and + bits = source.getNode().asInstruction().(ConstantValueInstruction).getValue().toInt() and + bits < minimumBits and + bits != 0 +select fc, source, sink, + "The key size $@ is less than the recommended key size of " + minimumBits.toString() + " bits.", + source, bits.toString() diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.qhelp b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.qhelp index 2daa683f483..c279a19a57c 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.qhelp +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.qhelp @@ -3,17 +3,17 @@ "qhelp.dtd"> -

    Exposing system data or debugging information may help an adversary to learn about the system and form an attack plan. An attacker can use error messages that reveal technologies, operating systems, and product versions to tune their attack against known vulnerabilities in these technologies.

    +

    Exposing system data or debugging information may help a malicious user learn about the system and form an attack plan. An attacker can use error messages that reveal technologies, operating systems, and product versions to tune their attack against known vulnerabilities in the software.

    -

    This query finds locations where system configuration information might be revealed to a user.

    +

    This query finds locations where system configuration information might be revealed to a remote user.

    -

    Do not expose system configuration information to users. Be wary of the difference between information that could be helpful to users, and unnecessary details that could be useful to an adversary.

    +

    Do not expose system configuration information to remote users. Be wary of the difference between information that could be helpful to users, and unnecessary details that could be useful to a malicious user.

    -

    In this example the value of the PATH environment variable is revealed in full to the user when a particular error occurs. This might reveal information such as the software installed on your system to an adversary who does not have legitimate access to that information.

    +

    In this example the value of the PATH environment variable is revealed in full to the user when a particular error occurs. This might reveal information such as the software installed on your system to a malicious user who does not have legitimate access to that information.

    diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql index 9a0b9bef8ed..78247b8a1ae 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql @@ -1,380 +1,46 @@ /** * @name Exposure of system data to an unauthorized control sphere * @description Exposing system data or debugging information helps - * an adversary learn about the system and form an + * a malicious user learn about the system and form an * attack plan. - * @kind problem + * @kind path-problem * @problem.severity warning * @security-severity 6.5 - * @precision medium + * @precision high * @id cpp/system-data-exposure * @tags security * external/cwe/cwe-497 */ import cpp -import semmle.code.cpp.commons.Environment -import semmle.code.cpp.security.OutputWrite +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.models.interfaces.FlowSource +import DataFlow::PathGraph +import SystemData -/** - * An element that should not be exposed to an adversary. - */ -abstract class SystemData extends Element { - /** - * Gets an expression that is part of this `SystemData`. - */ - abstract Expr getAnExpr(); +class ExposedSystemDataConfiguration extends TaintTracking::Configuration { + ExposedSystemDataConfiguration() { this = "ExposedSystemDataConfiguration" } - /** - * Gets an expression whose value originates from, or is used by, - * this `SystemData`. - */ - Expr getAnExprIndirect() { - // direct SystemData - result = this.getAnExpr() or - // flow via global or member variable (conservative approximation) - result = this.getAnAffectedVar().getAnAccess() or - // flow via stack variable - definitionUsePair(_, this.getAnExprIndirect(), result) or - useUsePair(_, this.getAnExprIndirect(), result) or - useUsePair(_, result, this.getAnExprIndirect()) or - // flow from assigned value to assignment expression - result.(AssignExpr).getRValue() = this.getAnExprIndirect() - } + override predicate isSource(DataFlow::Node source) { source = any(SystemData sd).getAnExpr() } - /** - * Gets a global or member variable that may be affected by this system - * data (conservative approximation). - */ - private Variable getAnAffectedVar() { - ( - result.getAnAssignedValue() = this.getAnExprIndirect() or - result.getAnAccess() = this.getAnExprIndirect() - ) and - not result instanceof LocalScopeVariable - } -} - -/** - * Data originating from the environment. - */ -class EnvData extends SystemData { - EnvData() { this instanceof EnvironmentRead } - - override Expr getAnExpr() { result = this } -} - -/** - * Data originating from a call to `mysql_get_client_info()`. - */ -class SQLClientInfo extends SystemData { - SQLClientInfo() { this.(FunctionCall).getTarget().hasName("mysql_get_client_info") } - - override Expr getAnExpr() { result = this } -} - -private predicate sqlConnectInfo(FunctionCall source, VariableAccess use) { - ( - source.getTarget().hasName("mysql_connect") or - source.getTarget().hasName("mysql_real_connect") - ) and - use = source.getAnArgument() -} - -/** - * Data passed into an SQL connect function. - */ -class SQLConnectInfo extends SystemData { - SQLConnectInfo() { sqlConnectInfo(this, _) } - - override Expr getAnExpr() { sqlConnectInfo(this, result) } -} - -private predicate posixSystemInfo(FunctionCall source, Element use) { - // long sysconf(int name) - // - various OS / system values and limits - source.getTarget().hasName("sysconf") and - use = source - or - // size_t confstr(int name, char *buf, size_t len) - // - various OS / system strings, such as the libc version - // int statvfs(const char *__path, struct statvfs *__buf) - // int fstatvfs(int __fd, struct statvfs *__buf) - // - various filesystem parameters - // int uname(struct utsname *buf) - // - OS name and version - source.getTarget().hasName(["confstr", "statvfs", "fstatvfs", "uname"]) and - use = source.getArgument(1) -} - -/** - * Data obtained from a POSIX system information call. - */ -class PosixSystemInfo extends SystemData { - PosixSystemInfo() { posixSystemInfo(this, _) } - - override Expr getAnExpr() { posixSystemInfo(this, result) } -} - -private predicate posixPWInfo(FunctionCall source, Element use) { - // struct passwd *getpwnam(const char *name); - // struct passwd *getpwuid(uid_t uid); - // struct passwd *getpwent(void); - // struct group *getgrnam(const char *name); - // struct group *getgrgid(gid_t); - // struct group *getgrent(void); - source - .getTarget() - .hasName(["getpwnam", "getpwuid", "getpwent", "getgrnam", "getgrgid", "getgrent"]) and - use = source - or - // int getpwnam_r(const char *name, struct passwd *pwd, - // char *buf, size_t buflen, struct passwd **result); - // int getpwuid_r(uid_t uid, struct passwd *pwd, - // char *buf, size_t buflen, struct passwd **result); - // int getgrgid_r(gid_t gid, struct group *grp, - // char *buf, size_t buflen, struct group **result); - // int getgrnam_r(const char *name, struct group *grp, - // char *buf, size_t buflen, struct group **result); - source.getTarget().hasName(["getpwnam_r", "getpwuid_r", "getgrgid_r", "getgrnam_r"]) and - use = source.getArgument([1, 2, 4]) - or - // int getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize, - // struct passwd **result); - // int getgrent_r(struct group *gbuf, char *buf, - // size_t buflen, struct group **gbufp); - source.getTarget().hasName(["getpwent_r", "getgrent_r"]) and - use = source.getArgument([0, 1, 3]) -} - -/** - * Data obtained from a POSIX user/password/group database information call. - */ -class PosixPWInfo extends SystemData { - PosixPWInfo() { posixPWInfo(this, _) } - - override Expr getAnExpr() { posixPWInfo(this, result) } -} - -private predicate windowsSystemInfo(FunctionCall source, Element use) { - // DWORD WINAPI GetVersion(void); - source.getTarget().hasGlobalName("GetVersion") and - use = source - or - // BOOL WINAPI GetVersionEx(_Inout_ LPOSVERSIONINFO lpVersionInfo); - // void WINAPI GetSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo); - // void WINAPI GetNativeSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo); - source - .getTarget() - .hasGlobalName([ - "GetVersionEx", "GetVersionExA", "GetVersionExW", "GetSystemInfo", "GetNativeSystemInfo" - ]) and - use = source.getArgument(0) -} - -/** - * Data obtained from a Windows system information call. - */ -class WindowsSystemInfo extends SystemData { - WindowsSystemInfo() { windowsSystemInfo(this, _) } - - override Expr getAnExpr() { windowsSystemInfo(this, result) } -} - -private predicate windowsFolderPath(FunctionCall source, Element use) { - // BOOL SHGetSpecialFolderPath( - // HWND hwndOwner, - // _Out_ LPTSTR lpszPath, - // _In_ int csidl, - // _In_ BOOL fCreate - // ); - source - .getTarget() - .hasGlobalName([ - "SHGetSpecialFolderPath", "SHGetSpecialFolderPathA", "SHGetSpecialFolderPathW" - ]) and - use = source.getArgument(1) - or - // HRESULT SHGetKnownFolderPath( - // _In_ REFKNOWNFOLDERID rfid, - // _In_ DWORD dwFlags, - // _In_opt_ HANDLE hToken, - // _Out_ PWSTR *ppszPath - // ); - source.getTarget().hasGlobalName("SHGetKnownFolderPath") and - use = source.getArgument(3) - or - // HRESULT SHGetFolderPath( - // _In_ HWND hwndOwner, - // _In_ int nFolder, - // _In_ HANDLE hToken, - // _In_ DWORD dwFlags, - // _Out_ LPTSTR pszPath - // ); - source.getTarget().hasGlobalName(["SHGetFolderPath", "SHGetFolderPathA", "SHGetFolderPathW"]) and - use = source.getArgument(4) - or - // HRESULT SHGetFolderPathAndSubDir( - // _In_ HWND hwnd, - // _In_ int csidl, - // _In_ HANDLE hToken, - // _In_ DWORD dwFlags, - // _In_ LPCTSTR pszSubDir, - // _Out_ LPTSTR pszPath - // ); - source - .getTarget() - .hasGlobalName([ - "SHGetFolderPathAndSubDir", "SHGetFolderPathAndSubDirA", "SHGetFolderPathAndSubDirW" - ]) and - use = source.getArgument(5) -} - -/** - * Data obtained about Windows special paths (for example, the - * location of `System32`). - */ -class WindowsFolderPath extends SystemData { - WindowsFolderPath() { windowsFolderPath(this, _) } - - override Expr getAnExpr() { windowsFolderPath(this, result) } -} - -private predicate logonUser(FunctionCall source, VariableAccess use) { - source.getTarget().hasGlobalName(["LogonUser", "LogonUserW", "LogonUserA"]) and - use = source.getAnArgument() -} - -/** - * Data passed into a `LogonUser` (Windows) function. - */ -class LogonUser extends SystemData { - LogonUser() { logonUser(this, _) } - - override Expr getAnExpr() { logonUser(this, result) } -} - -private predicate regQuery(FunctionCall source, VariableAccess use) { - // LONG WINAPI RegQueryValue( - // _In_ HKEY hKey, - // _In_opt_ LPCTSTR lpSubKey, - // _Out_opt_ LPTSTR lpValue, - // _Inout_opt_ PLONG lpcbValue - // ); - source.getTarget().hasGlobalName(["RegQueryValue", "RegQueryValueA", "RegQueryValueW"]) and - use = source.getArgument(2) - or - // LONG WINAPI RegQueryMultipleValues( - // _In_ HKEY hKey, - // _Out_ PVALENT val_list, - // _In_ DWORD num_vals, - // _Out_opt_ LPTSTR lpValueBuf, - // _Inout_opt_ LPDWORD ldwTotsize - // ); - source - .getTarget() - .hasGlobalName([ - "RegQueryMultipleValues", "RegQueryMultipleValuesA", "RegQueryMultipleValuesW" - ]) and - use = source.getArgument(3) - or - // LONG WINAPI RegQueryValueEx( - // _In_ HKEY hKey, - // _In_opt_ LPCTSTR lpValueName, - // _Reserved_ LPDWORD lpReserved, - // _Out_opt_ LPDWORD lpType, - // _Out_opt_ LPBYTE lpData, - // _Inout_opt_ LPDWORD lpcbData - // ); - source.getTarget().hasGlobalName(["RegQueryValueEx", "RegQueryValueExA", "RegQueryValueExW"]) and - use = source.getArgument(4) - or - // LONG WINAPI RegGetValue( - // _In_ HKEY hkey, - // _In_opt_ LPCTSTR lpSubKey, - // _In_opt_ LPCTSTR lpValue, - // _In_opt_ DWORD dwFlags, - // _Out_opt_ LPDWORD pdwType, - // _Out_opt_ PVOID pvData, - // _Inout_opt_ LPDWORD pcbData - // ); - source.getTarget().hasGlobalName(["RegGetValue", "RegGetValueA", "RegGetValueW"]) and - use = source.getArgument(5) -} - -/** - * Data read from the Windows registry. - */ -class RegQuery extends SystemData { - RegQuery() { regQuery(this, _) } - - override Expr getAnExpr() { regQuery(this, result) } -} - -/** - * Somewhere data is output. - */ -abstract class DataOutput extends Element { - /** - * Get an expression containing data that is output. - */ - abstract Expr getASource(); -} - -/** - * Data that is output via standard output or standard error. - */ -class StandardOutput extends DataOutput instanceof OutputWrite { - override Expr getASource() { result = OutputWrite.super.getASource() } -} - -private predicate socketCallOrIndirect(FunctionCall call) { - // direct socket call - // int socket(int domain, int type, int protocol); - call.getTarget().getName() = "socket" - or - exists(ReturnStmt rtn | - // indirect socket call - call.getTarget() = rtn.getEnclosingFunction() and - ( - socketCallOrIndirect(rtn.getExpr()) or - socketCallOrIndirect(rtn.getExpr().(VariableAccess).getTarget().getAnAssignedValue()) + override predicate isSink(DataFlow::Node sink) { + exists(FunctionCall fc, FunctionInput input, int arg | + fc.getTarget().(RemoteFlowSinkFunction).hasRemoteFlowSink(input, _) and + input.isParameterDeref(arg) and + fc.getArgument(arg).getAChild*() = sink.asExpr() ) - ) + } } -private predicate socketFileDescriptor(Expr e) { - exists(Variable var, FunctionCall socket | - socketCallOrIndirect(socket) and - var.getAnAssignedValue() = socket and - e = var.getAnAccess() - ) -} - -private predicate socketOutput(FunctionCall call, Expr data) { - ( - // ssize_t send(int sockfd, const void *buf, size_t len, int flags); - // ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, - // const struct sockaddr *dest_addr, socklen_t addrlen); - // ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); - // int write(int handle, void *buffer, int nbyte); - call.getTarget().hasGlobalName(["send", "sendto", "sendmsg", "write"]) and - data = call.getArgument(1) and - socketFileDescriptor(call.getArgument(0)) - ) -} - -/** - * Data that is output via a socket. - */ -class SocketOutput extends DataOutput { - SocketOutput() { socketOutput(this, _) } - - override Expr getASource() { socketOutput(this, result) } -} - -from SystemData sd, DataOutput ow +from ExposedSystemDataConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink where - sd.getAnExprIndirect() = ow.getASource() or - sd.getAnExprIndirect() = ow.getASource().getAChild*() -select ow, "This operation exposes system data from $@.", sd, sd.toString() + config.hasFlowPath(source, sink) and + not exists( + DataFlow::Node alt // remove duplicate results on conversions + | + config.hasFlow(source.getNode(), alt) and + alt.asConvertedExpr() = sink.getNode().asExpr() and + alt != sink.getNode() + ) +select sink, source, sink, "This operation exposes system data from $@.", source, + source.getNode().toString() diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataCorrect.cpp b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataCorrect.cpp index ac885f425dc..24449b83e6f 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataCorrect.cpp +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataCorrect.cpp @@ -2,6 +2,5 @@ char* path = getenv("PATH"); //... -fprintf(stderr, "A required executable file could not be found. " \ - "Please ensure that the software has been installed " \ - "correctly or contact a system administrator.\n"); \ No newline at end of file +message = "An internal error has occurred. Please try again or contact a system administrator.\n"; +send(socket, message, strlen(message), 0); \ No newline at end of file diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataIncorrect.cpp b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataIncorrect.cpp index fec622a5f7f..e8e7bec5959 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataIncorrect.cpp +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemDataIncorrect.cpp @@ -2,4 +2,5 @@ char* path = getenv("PATH"); //... -fprintf(stderr, "cannot find exe on path %s\n", path); \ No newline at end of file +sprintf(buffer, "Cannot find exe on path: %s", path); +send(socket, buffer, strlen(buffer), 0); diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.qhelp b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.qhelp new file mode 100644 index 00000000000..3d5d5d45e30 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.qhelp @@ -0,0 +1,28 @@ + + + +

    Exposing system data or debugging information may help a malicious user learn about the system and form an attack plan. An attacker can use error messages that reveal technologies, operating systems, and product versions to tune their attack against known vulnerabilities in the software.

    + +

    This query finds locations where system configuration information that is particularly sensitive might be revealed to a user.

    +
    + + +

    Do not expose system configuration information to users. Be wary of the difference between information that could be helpful to users, and unnecessary details that could be useful to a malicious user.

    +
    + + +

    In this example the value of the PATH environment variable is revealed in full to the user when a particular error occurs. This might reveal information such as the software installed on your system to a malicious user who does not have legitimate access to that information.

    + + + +

    The message should be rephrased without this information, for example:

    + + +
    + + + + +
    diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql new file mode 100644 index 00000000000..f1854c41b1b --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql @@ -0,0 +1,51 @@ +/** + * @name Potential exposure of sensitive system data to an unauthorized control sphere + * @description Exposing sensitive system data helps + * a malicious user learn about the system and form an + * attack plan. + * @kind path-problem + * @problem.severity warning + * @security-severity 6.5 + * @precision medium + * @id cpp/potential-system-data-exposure + * @tags security + * external/cwe/cwe-497 + */ + +/* + * These queries are closely related: + * - `cpp/system-data-exposure`, which flags exposure of system information + * to a remote sink (i.e. focusses on quality of the sink). + * - `cpp/potential-system-data-exposure`, which flags on exposure of the most + * sensitive information to a local sink (i.e. focusses on quality of the + * sensitive information). + * + * This used to be a single query with neither focus, which was too noisy and + * gave the user less control. + */ + +import cpp +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.models.interfaces.FlowSource +import semmle.code.cpp.security.OutputWrite +import DataFlow::PathGraph +import SystemData + +class PotentiallyExposedSystemDataConfiguration extends TaintTracking::Configuration { + PotentiallyExposedSystemDataConfiguration() { this = "PotentiallyExposedSystemDataConfiguration" } + + override predicate isSource(DataFlow::Node source) { + source = any(SystemData sd | sd.isSensitive()).getAnExpr() + } + + override predicate isSink(DataFlow::Node sink) { + exists(OutputWrite ow | ow.getASource().getAChild*() = sink.asExpr()) + } +} + +from + PotentiallyExposedSystemDataConfiguration config, DataFlow::PathNode source, + DataFlow::PathNode sink +where config.hasFlowPath(source, sink) +select sink, source, sink, "This operation potentially exposes sensitive system data from $@.", + source, source.getNode().toString() diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataCorrect.cpp b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataCorrect.cpp new file mode 100644 index 00000000000..e899e42b07a --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataCorrect.cpp @@ -0,0 +1,5 @@ +char* key = getenv("APP_KEY"); + +//... + +fprintf(stderr, "Application key not recognized. Please ensure the key is correct or contact a system administrator.\n", key); \ No newline at end of file diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataIncorrect.cpp b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataIncorrect.cpp new file mode 100644 index 00000000000..a5f275a35a0 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemDataIncorrect.cpp @@ -0,0 +1,5 @@ +char* key = getenv("APP_KEY"); + +//... + +fprintf(stderr, "Key not recognized: %s\n", key); \ No newline at end of file diff --git a/cpp/ql/src/Security/CWE/CWE-497/SystemData.qll b/cpp/ql/src/Security/CWE/CWE-497/SystemData.qll new file mode 100644 index 00000000000..070125e7baf --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-497/SystemData.qll @@ -0,0 +1,342 @@ +/** + * Classes for recognizing system data, used by the exposed system data queries. + */ + +import cpp +import semmle.code.cpp.commons.Environment +import semmle.code.cpp.ir.dataflow.TaintTracking + +/** + * An element that should not be exposed to a malicious user. + */ +abstract class SystemData extends Element { + /** + * Gets an expression that is part of this `SystemData`. + */ + abstract DataFlow::Node getAnExpr(); + + /** + * Holds if this system data is considered especially sensitive (for example + * a password or token). + */ + predicate isSensitive() { none() } +} + +/** + * Data originating from the environment. + */ +class EnvData extends SystemData { + EnvData() { + // identify risky looking environment variables only + this.(EnvironmentRead) + .getEnvironmentVariable() + .toLowerCase() + .regexpMatch(".*(user|host|admin|root|home|path|http|ssl|snmp|sock|port|proxy|pass|token|crypt|key).*") + } + + override DataFlow::Node getAnExpr() { result.asConvertedExpr() = this } + + override predicate isSensitive() { + this.(EnvironmentRead) + .getEnvironmentVariable() + .toLowerCase() + .regexpMatch(".*(pass|token|key).*") + } +} + +/** + * Data originating from a call to `mysql_get_client_info()`. + */ +class SQLClientInfo extends SystemData { + SQLClientInfo() { this.(FunctionCall).getTarget().hasName("mysql_get_client_info") } + + override DataFlow::Node getAnExpr() { result.asConvertedExpr() = this } + + override predicate isSensitive() { any() } +} + +private predicate sqlConnectInfo(FunctionCall source, Expr use) { + ( + source.getTarget().hasName("mysql_connect") or + source.getTarget().hasName("mysql_real_connect") + ) and + use = source.getAnArgument() +} + +/** + * Data passed into an SQL connect function. + */ +class SQLConnectInfo extends SystemData { + SQLConnectInfo() { sqlConnectInfo(this, _) } + + override DataFlow::Node getAnExpr() { sqlConnectInfo(this, result.asConvertedExpr()) } + + override predicate isSensitive() { any() } +} + +private predicate posixSystemInfo(FunctionCall source, DataFlow::Node use) { + // size_t confstr(int name, char *buf, size_t len) + // - various OS / system strings, such as the libc version + // int statvfs(const char *__path, struct statvfs *__buf) + // int fstatvfs(int __fd, struct statvfs *__buf) + source.getTarget().hasName(["confstr", "statvfs", "fstatvfs"]) and + use.asDefiningArgument() = source.getArgument(1) + or + // - various filesystem parameters + // int uname(struct utsname *buf) + // - OS name and version + source.getTarget().hasName("uname") and + use.asDefiningArgument() = source.getArgument(0) +} + +/** + * Data obtained from a POSIX system information call. + */ +class PosixSystemInfo extends SystemData { + PosixSystemInfo() { posixSystemInfo(this, _) } + + override DataFlow::Node getAnExpr() { posixSystemInfo(this, result) } +} + +private predicate posixPWInfo(FunctionCall source, DataFlow::Node use) { + // struct passwd *getpwnam(const char *name); + // struct passwd *getpwuid(uid_t uid); + // struct passwd *getpwent(void); + // struct group *getgrnam(const char *name); + // struct group *getgrgid(gid_t); + // struct group *getgrent(void); + source + .getTarget() + .hasName(["getpwnam", "getpwuid", "getpwent", "getgrnam", "getgrgid", "getgrent"]) and + use.asConvertedExpr() = source + or + // int getpwnam_r(const char *name, struct passwd *pwd, + // char *buf, size_t buflen, struct passwd **result); + // int getpwuid_r(uid_t uid, struct passwd *pwd, + // char *buf, size_t buflen, struct passwd **result); + // int getgrgid_r(gid_t gid, struct group *grp, + // char *buf, size_t buflen, struct group **result); + // int getgrnam_r(const char *name, struct group *grp, + // char *buf, size_t buflen, struct group **result); + source.getTarget().hasName(["getpwnam_r", "getpwuid_r", "getgrgid_r", "getgrnam_r"]) and + ( + use.asConvertedExpr() = source.getArgument([1, 2]) or + use.asDefiningArgument() = source.getArgument(4) + ) + or + // int getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize, + // struct passwd **result); + // int getgrent_r(struct group *gbuf, char *buf, + // size_t buflen, struct group **gbufp); + source.getTarget().hasName(["getpwent_r", "getgrent_r"]) and + ( + use.asConvertedExpr() = source.getArgument([0, 1]) or + use.asDefiningArgument() = source.getArgument(3) + ) +} + +/** + * Data obtained from a POSIX user/password/group database information call. + */ +class PosixPWInfo extends SystemData { + PosixPWInfo() { posixPWInfo(this, _) } + + override DataFlow::Node getAnExpr() { posixPWInfo(this, result) } + + override predicate isSensitive() { any() } +} + +private predicate windowsSystemInfo(FunctionCall source, DataFlow::Node use) { + // DWORD WINAPI GetVersion(void); + source.getTarget().hasGlobalName("GetVersion") and + use.asConvertedExpr() = source + or + // BOOL WINAPI GetVersionEx(_Inout_ LPOSVERSIONINFO lpVersionInfo); + // void WINAPI GetSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo); + // void WINAPI GetNativeSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo); + source + .getTarget() + .hasGlobalName([ + "GetVersionEx", "GetVersionExA", "GetVersionExW", "GetSystemInfo", "GetNativeSystemInfo" + ]) and + use.asDefiningArgument() = source.getArgument(0) +} + +/** + * Data obtained from a Windows system information call. + */ +class WindowsSystemInfo extends SystemData { + WindowsSystemInfo() { windowsSystemInfo(this, _) } + + override DataFlow::Node getAnExpr() { windowsSystemInfo(this, result) } +} + +private predicate windowsFolderPath(FunctionCall source, Element use) { + // BOOL SHGetSpecialFolderPath( + // HWND hwndOwner, + // _Out_ LPTSTR lpszPath, + // _In_ int csidl, + // _In_ BOOL fCreate + // ); + source + .getTarget() + .hasGlobalName([ + "SHGetSpecialFolderPath", "SHGetSpecialFolderPathA", "SHGetSpecialFolderPathW" + ]) and + use = source.getArgument(1) + or + // HRESULT SHGetKnownFolderPath( + // _In_ REFKNOWNFOLDERID rfid, + // _In_ DWORD dwFlags, + // _In_opt_ HANDLE hToken, + // _Out_ PWSTR *ppszPath + // ); + source.getTarget().hasGlobalName("SHGetKnownFolderPath") and + use = source.getArgument(3) + or + // HRESULT SHGetFolderPath( + // _In_ HWND hwndOwner, + // _In_ int nFolder, + // _In_ HANDLE hToken, + // _In_ DWORD dwFlags, + // _Out_ LPTSTR pszPath + // ); + source.getTarget().hasGlobalName(["SHGetFolderPath", "SHGetFolderPathA", "SHGetFolderPathW"]) and + use = source.getArgument(4) + or + // HRESULT SHGetFolderPathAndSubDir( + // _In_ HWND hwnd, + // _In_ int csidl, + // _In_ HANDLE hToken, + // _In_ DWORD dwFlags, + // _In_ LPCTSTR pszSubDir, + // _Out_ LPTSTR pszPath + // ); + source + .getTarget() + .hasGlobalName([ + "SHGetFolderPathAndSubDir", "SHGetFolderPathAndSubDirA", "SHGetFolderPathAndSubDirW" + ]) and + use = source.getArgument(5) +} + +/** + * Data obtained about Windows special paths (for example, the + * location of `System32`). + */ +class WindowsFolderPath extends SystemData { + WindowsFolderPath() { windowsFolderPath(this, _) } + + override DataFlow::Node getAnExpr() { windowsFolderPath(this, result.asDefiningArgument()) } +} + +private predicate logonUser(FunctionCall source, VariableAccess use) { + source.getTarget().hasGlobalName(["LogonUser", "LogonUserW", "LogonUserA"]) and + use = source.getAnArgument() +} + +/** + * Data passed into a `LogonUser` (Windows) function. + */ +class LogonUser extends SystemData { + LogonUser() { logonUser(this, _) } + + override DataFlow::Node getAnExpr() { logonUser(this, result.asConvertedExpr()) } + + override predicate isSensitive() { any() } +} + +/** + * The type of a registry query parameter, if it is of interest to us. This + * is used to express information about registry query parameters in the + * `regQuery` predicate concisely. + */ +private newtype TRegQueryParameter = + TSubKeyName() or + TValueName() or + TReturnData() + +/** + * Registry query call (`source`) with information about parameters (`param`). + */ +private predicate regQuery(FunctionCall source, TRegQueryParameter paramType, Expr param) { + // LONG WINAPI RegQueryValue( + // _In_ HKEY hKey, + // _In_opt_ LPCTSTR lpSubKey, + // _Out_opt_ LPTSTR lpValue, + // _Inout_opt_ PLONG lpcbValue + // ); + source.getTarget().hasGlobalName(["RegQueryValue", "RegQueryValueA", "RegQueryValueW"]) and + ( + paramType = TSubKeyName() and param = source.getArgument(1) + or + paramType = TReturnData() and param = source.getArgument(2) + ) + or + // LONG WINAPI RegQueryMultipleValues( + // _In_ HKEY hKey, + // _Out_ PVALENT val_list, + // _In_ DWORD num_vals, + // _Out_opt_ LPTSTR lpValueBuf, + // _Inout_opt_ LPDWORD ldwTotsize + // ); + source + .getTarget() + .hasGlobalName([ + "RegQueryMultipleValues", "RegQueryMultipleValuesA", "RegQueryMultipleValuesW" + ]) and + paramType = TReturnData() and + param = source.getArgument(3) + or + // LONG WINAPI RegQueryValueEx( + // _In_ HKEY hKey, + // _In_opt_ LPCTSTR lpValueName, + // _Reserved_ LPDWORD lpReserved, + // _Out_opt_ LPDWORD lpType, + // _Out_opt_ LPBYTE lpData, + // _Inout_opt_ LPDWORD lpcbData + // ); + source.getTarget().hasGlobalName(["RegQueryValueEx", "RegQueryValueExA", "RegQueryValueExW"]) and + ( + paramType = TValueName() and param = source.getArgument(1) + or + paramType = TReturnData() and param = source.getArgument(4) + ) + or + // LONG WINAPI RegGetValue( + // _In_ HKEY hkey, + // _In_opt_ LPCTSTR lpSubKey, + // _In_opt_ LPCTSTR lpValue, + // _In_opt_ DWORD dwFlags, + // _Out_opt_ LPDWORD pdwType, + // _Out_opt_ PVOID pvData, + // _Inout_opt_ LPDWORD pcbData + // ); + source.getTarget().hasGlobalName(["RegGetValue", "RegGetValueA", "RegGetValueW"]) and + ( + paramType = TSubKeyName() and param = source.getArgument(1) + or + paramType = TValueName() and param = source.getArgument(2) + or + paramType = TReturnData() and param = source.getArgument(5) + ) +} + +/** + * Data read from the Windows registry. + */ +class RegQuery extends SystemData { + RegQuery() { regQuery(this, _, _) } + + override DataFlow::Node getAnExpr() { regQuery(this, TReturnData(), result.asDefiningArgument()) } + + override predicate isSensitive() { + exists(Expr e | + ( + regQuery(this, TSubKeyName(), e) or + regQuery(this, TValueName(), e) + ) and + e.getValue().toLowerCase().regexpMatch(".*(pass|token|key).*") + ) + } +} diff --git a/cpp/ql/src/Security/CWE/CWE-611/Libxml2.qll b/cpp/ql/src/Security/CWE/CWE-611/Libxml2.qll new file mode 100644 index 00000000000..c20849fcd9e --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/Libxml2.qll @@ -0,0 +1,78 @@ +/** + * Models the libxml2 XML library. + */ + +import cpp +import XML +import semmle.code.cpp.valuenumbering.GlobalValueNumbering + +/** + * A call to a `libxml2` function that parses XML. + */ +class Libxml2ParseCall extends FunctionCall { + int optionsArg; + + Libxml2ParseCall() { + exists(string fname | this.getTarget().getName() = fname | + fname = "xmlCtxtUseOptions" and optionsArg = 1 + or + fname = "xmlReadFile" and optionsArg = 2 + or + fname = ["xmlCtxtReadFile", "xmlParseInNodeContext", "xmlReadDoc", "xmlReadFd"] and + optionsArg = 3 + or + fname = ["xmlCtxtReadDoc", "xmlCtxtReadFd", "xmlReadMemory"] and optionsArg = 4 + or + fname = ["xmlCtxtReadMemory", "xmlReadIO"] and optionsArg = 5 + or + fname = "xmlCtxtReadIO" and optionsArg = 6 + ) + } + + /** + * Gets the argument that specifies `xmlParserOption`s. + */ + Expr getOptions() { result = this.getArgument(optionsArg) } +} + +/** + * An `xmlParserOption` for `libxml2` that is considered unsafe. + */ +class Libxml2BadOption extends EnumConstant { + Libxml2BadOption() { this.getName() = ["XML_PARSE_NOENT", "XML_PARSE_DTDLOAD"] } +} + +/** + * The libxml2 XML library. + */ +class LibXml2Library extends XmlLibrary { + LibXml2Library() { this = "LibXml2Library" } + + override predicate configurationSource(DataFlow::Node node, string flowstate) { + // source is an `options` argument on a libxml2 parse call that specifies + // at least one unsafe option. + // + // note: we don't need to track an XML object for libxml2, so we don't + // really need data flow. Nevertheless we jam it into this configuration, + // with matching sources and sinks. This allows results to be presented by + // the same query, in a consistent way as other results with flow paths. + exists(Libxml2ParseCall call, Expr options | + options = call.getOptions() and + node.asExpr() = options and + flowstate = "libxml2" and + exists(Libxml2BadOption opt | + globalValueNumber(options).getAnExpr().getValue().toInt().bitAnd(opt.getValue().toInt()) != + 0 + ) + ) + } + + override predicate configurationSink(DataFlow::Node node, string flowstate) { + // sink is the `options` argument on a `libxml2` parse call. + exists(Libxml2ParseCall call, Expr options | + options = call.getOptions() and + node.asExpr() = options and + flowstate = "libxml2" + ) + } +} diff --git a/cpp/ql/src/Security/CWE/CWE-611/XML.qll b/cpp/ql/src/Security/CWE/CWE-611/XML.qll new file mode 100644 index 00000000000..5d071ed7654 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/XML.qll @@ -0,0 +1,55 @@ +/** + * Provides a abstract classes for modeling XML libraries. This design is + * currently specialized for the purposes of the XXE query. + */ + +import cpp +import semmle.code.cpp.ir.dataflow.DataFlow +import Xerces +import Libxml2 + +/** + * A flow state representing a possible configuration of an XML object. + */ +abstract class XxeFlowState extends DataFlow::FlowState { + bindingset[this] + XxeFlowState() { any() } // required characteristic predicate +} + +/** + * An XML library or interface. + */ +abstract class XmlLibrary extends string { + bindingset[this] + XmlLibrary() { any() } // required characteristic predicate + + /** + * Holds if `node` is the source node for a potentially unsafe configuration + * object for this XML library, along with `flowstate` representing its + * initial state. + */ + abstract predicate configurationSource(DataFlow::Node node, string flowstate); + + /** + * Holds if `node` is the sink node where an unsafe configuration object is + * used to interpret XML. + */ + abstract predicate configurationSink(DataFlow::Node node, string flowstate); +} + +/** + * An `Expr` that changes the configuration of an XML object, transforming the + * `XxeFlowState` that flows through it. + */ +abstract class XxeFlowStateTransformer extends Expr { + /** + * Gets the flow state that `flowstate` is transformed into. + * + * Due to limitations of the implementation the transformation defined by this + * predicate must be idempotent, that is, for any input `x` it must be that: + * ``` + * transform(transform(x)) = transform(x) + * ``` + */ + abstract XxeFlowState transform(XxeFlowState flowstate); +} diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXE.qhelp b/cpp/ql/src/Security/CWE/CWE-611/XXE.qhelp new file mode 100644 index 00000000000..513f444ed0d --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/XXE.qhelp @@ -0,0 +1,57 @@ + + + + +

    +Parsing untrusted XML files with a weakly configured XML parser may lead to an +XML external entity (XXE) attack. This type of attack uses external entity references +to access arbitrary files on a system, carry out denial-of-service (DoS) attacks, or server-side +request forgery. Even when the result of parsing is not returned to the user, DoS attacks are still possible +and out-of-band data retrieval techniques may allow attackers to steal sensitive data. +

    +
    + + +

    +The easiest way to prevent XXE attacks is to disable external entity handling when +parsing untrusted data. How this is done depends on the library being used. Note that some +libraries, such as recent versions of libxml, disable entity expansion by default, +so unless you have explicitly enabled entity expansion, no further action needs to be taken. +

    +
    + + +

    +The following example uses the Xerces-C++ XML parser to parse a string data. +If that string is from an untrusted source, this code may be vulnerable to an XXE attack, since +the parser is constructed in its default state with setDisableDefaultEntityResolution +set to false: +

    + + +

    +To guard against XXE attacks, the setDisableDefaultEntityResolution option should be +set to true. +

    + +
    + + +
  • +OWASP: +XML External Entity (XXE) Processing. +
  • +
  • +OWASP: +XML External Entity Prevention Cheat Sheet. +
  • +
  • +Timothy Morgen: +XML Schema, DTD, and Entity Attacks. +
  • +
  • +Timur Yunusov, Alexey Osipov: +XML Out-Of-Band Data Retrieval. +
  • +
    +
    diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXE.ql b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql new file mode 100644 index 00000000000..da17913dec5 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql @@ -0,0 +1,51 @@ +/** + * @name XML external entity expansion + * @description Parsing user-controlled XML documents and allowing expansion of + * external entity references may lead to disclosure of + * confidential data or denial of service. + * @kind path-problem + * @id cpp/external-entity-expansion + * @problem.severity warning + * @security-severity 9.1 + * @precision high + * @tags security + * external/cwe/cwe-611 + */ + +import cpp +import XML +import DataFlow::PathGraph + +/** + * A configuration for tracking XML objects and their states. + */ +class XXEConfiguration extends DataFlow::Configuration { + XXEConfiguration() { this = "XXEConfiguration" } + + override predicate isSource(DataFlow::Node node, string flowstate) { + any(XmlLibrary l).configurationSource(node, flowstate) + } + + override predicate isSink(DataFlow::Node node, string flowstate) { + any(XmlLibrary l).configurationSink(node, flowstate) + } + + override predicate isAdditionalFlowStep( + DataFlow::Node node1, string state1, DataFlow::Node node2, string state2 + ) { + // create additional flow steps for `XxeFlowStateTransformer`s + state2 = node2.asConvertedExpr().(XxeFlowStateTransformer).transform(state1) and + DataFlow::simpleLocalFlowStep(node1, node2) + } + + override predicate isBarrier(DataFlow::Node node, string flowstate) { + // when the flowstate is transformed at a call node, block the original + // flowstate value. + node.asConvertedExpr().(XxeFlowStateTransformer).transform(flowstate) != flowstate + } +} + +from XXEConfiguration conf, DataFlow::PathNode source, DataFlow::PathNode sink +where conf.hasFlowPath(source, sink) +select sink, source, sink, + "This $@ is not configured to prevent an XML external entity (XXE) attack.", source, "XML parser" diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXEBad.cpp b/cpp/ql/src/Security/CWE/CWE-611/XXEBad.cpp new file mode 100644 index 00000000000..9cfbbc49f05 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/XXEBad.cpp @@ -0,0 +1,4 @@ + +XercesDOMParser *parser = new XercesDOMParser(); + +parser->parse(data); // BAD (parser is not correctly configured, may expand external entity references) diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXEGood.cpp b/cpp/ql/src/Security/CWE/CWE-611/XXEGood.cpp new file mode 100644 index 00000000000..731d818aba9 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/XXEGood.cpp @@ -0,0 +1,5 @@ + +XercesDOMParser *parser = new XercesDOMParser(); + +parser->setDisableDefaultEntityResolution(true); +parser->parse(data); diff --git a/cpp/ql/src/Security/CWE/CWE-611/Xerces.qll b/cpp/ql/src/Security/CWE/CWE-611/Xerces.qll new file mode 100644 index 00000000000..7b971f00293 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-611/Xerces.qll @@ -0,0 +1,376 @@ +/** + * Models the Xerces XML library. + */ + +import cpp +import XML +import semmle.code.cpp.valuenumbering.GlobalValueNumbering +import semmle.code.cpp.ir.IR + +/** + * Gets a valid flow state for `AbstractDOMParser` or `SAXParser` flow. + * + * These flow states take the form `Xerces-A-B`, where: + * - A is 1 if `setDisableDefaultEntityResolution` is `true`, 0 otherwise. + * - B is 1 if `setCreateEntityReferenceNodes` is `true`, 0 otherwise. + */ +predicate encodeXercesFlowState( + string flowstate, int disabledDefaultEntityResolution, int createEntityReferenceNodes +) { + flowstate = "Xerces-0-0" and + disabledDefaultEntityResolution = 0 and + createEntityReferenceNodes = 0 + or + flowstate = "Xerces-0-1" and + disabledDefaultEntityResolution = 0 and + createEntityReferenceNodes = 1 + or + flowstate = "Xerces-1-0" and + disabledDefaultEntityResolution = 1 and + createEntityReferenceNodes = 0 + or + flowstate = "Xerces-1-1" and + disabledDefaultEntityResolution = 1 and + createEntityReferenceNodes = 1 +} + +/** + * A flow state representing the configuration of an `AbstractDOMParser` or + * `SAXParser` object. + */ +class XercesFlowState extends XxeFlowState { + XercesFlowState() { encodeXercesFlowState(this, _, _) } +} + +/** + * The `AbstractDOMParser` class. + */ +class AbstractDomParserClass extends Class { + AbstractDomParserClass() { this.hasName("AbstractDOMParser") } +} + +/** + * The `XercesDOMParser` class. + */ +class XercesDomParserClass extends Class { + XercesDomParserClass() { this.hasName("XercesDOMParser") } +} + +/** + * The `XercesDOMParser` interface for the Xerces XML library. + */ +class XercesDomParserLibrary extends XmlLibrary { + XercesDomParserLibrary() { this = "XercesDomParserLibrary" } + + override predicate configurationSource(DataFlow::Node node, string flowstate) { + // source is the write on `this` of a call to the `XercesDOMParser` + // constructor. + exists(CallInstruction call | + call.getStaticCallTarget() = any(XercesDomParserClass c).getAConstructor() and + node.asInstruction().(WriteSideEffectInstruction).getDestinationAddress() = + call.getThisArgument() and + encodeXercesFlowState(flowstate, 0, 1) // default configuration + ) + } + + override predicate configurationSink(DataFlow::Node node, string flowstate) { + // sink is the read of the qualifier of a call to `AbstractDOMParser.parse`. + exists(Call call | + call.getTarget().getClassAndName("parse") instanceof AbstractDomParserClass and + call.getQualifier() = node.asConvertedExpr() + ) and + flowstate instanceof XercesFlowState and + not encodeXercesFlowState(flowstate, 1, 1) // safe configuration + } +} + +/** + * The `DOMLSParser` class. + */ +class DomLSParserClass extends Class { + DomLSParserClass() { this.hasName("DOMLSParser") } +} + +/** + * The `createLSParser` function that returns a newly created `DOMLSParser` + * object. + */ +class CreateLSParser extends Function { + CreateLSParser() { + this.hasName("createLSParser") and + this.getUnspecifiedType().(PointerType).getBaseType() instanceof DomLSParserClass // returns a `DOMLSParser *`. + } +} + +/** + * The createLSParser interface for the Xerces XML library. + */ +class CreateLSParserLibrary extends XmlLibrary { + CreateLSParserLibrary() { this = "CreateLSParserLibrary" } + + override predicate configurationSource(DataFlow::Node node, string flowstate) { + // source is the result of a call to `createLSParser`. + exists(Call call | + call.getTarget() instanceof CreateLSParser and + call = node.asExpr() and + encodeXercesFlowState(flowstate, 0, 1) // default configuration + ) + } + + override predicate configurationSink(DataFlow::Node node, string flowstate) { + // sink is the read of the qualifier of a call to `DOMLSParserClass.parse`. + exists(Call call | + call.getTarget().getClassAndName("parse") instanceof DomLSParserClass and + call.getQualifier() = node.asConvertedExpr() + ) and + flowstate instanceof XercesFlowState and + not encodeXercesFlowState(flowstate, 1, 1) // safe configuration + } +} + +/** + * The `SAXParser` class. + */ +class SaxParserClass extends Class { + SaxParserClass() { this.hasName("SAXParser") } +} + +/** + * The `SAX2XMLReader` class. + */ +class Sax2XmlReader extends Class { + Sax2XmlReader() { this.hasName("SAX2XMLReader") } +} + +/** + * The SAXParser interface for the Xerces XML library. + */ +class SaxParserLibrary extends XmlLibrary { + SaxParserLibrary() { this = "SaxParserLibrary" } + + override predicate configurationSource(DataFlow::Node node, string flowstate) { + // source is the write on `this` of a call to the `SAXParser` + // constructor. + exists(CallInstruction call | + call.getStaticCallTarget() = any(SaxParserClass c).getAConstructor() and + node.asInstruction().(WriteSideEffectInstruction).getDestinationAddress() = + call.getThisArgument() and + encodeXercesFlowState(flowstate, 0, 1) // default configuration + ) + } + + override predicate configurationSink(DataFlow::Node node, string flowstate) { + // sink is the read of the qualifier of a call to `SAXParser.parse`. + exists(Call call | + call.getTarget().getClassAndName("parse") instanceof SaxParserClass and + call.getQualifier() = node.asConvertedExpr() + ) and + flowstate instanceof XercesFlowState and + not encodeXercesFlowState(flowstate, 1, 1) // safe configuration + } +} + +/** + * The `createXMLReader` function that returns a newly created `SAX2XMLReader` + * object. + */ +class CreateXmlReader extends Function { + CreateXmlReader() { + this.hasName("createXMLReader") and + this.getUnspecifiedType().(PointerType).getBaseType() instanceof Sax2XmlReader // returns a `SAX2XMLReader *`. + } +} + +/** + * The SAX2XMLReader interface for the Xerces XML library. + */ +class Sax2XmlReaderLibrary extends XmlLibrary { + Sax2XmlReaderLibrary() { this = "Sax2XmlReaderLibrary" } + + override predicate configurationSource(DataFlow::Node node, string flowstate) { + // source is the result of a call to `createXMLReader`. + exists(Call call | + call.getTarget() instanceof CreateXmlReader and + call = node.asExpr() and + encodeXercesFlowState(flowstate, 0, 1) // default configuration + ) + } + + override predicate configurationSink(DataFlow::Node node, string flowstate) { + // sink is the read of the qualifier of a call to `SAX2XMLReader.parse`. + exists(Call call | + call.getTarget().getClassAndName("parse") instanceof Sax2XmlReader and + call.getQualifier() = node.asConvertedExpr() + ) and + flowstate instanceof XercesFlowState and + not encodeXercesFlowState(flowstate, 1, 1) // safe configuration + } +} + +/** + * A flow state transformer for a call to + * `AbstractDOMParser.setDisableDefaultEntityResolution` or + * `SAXParser.setDisableDefaultEntityResolution`. Transforms the flow + * state through the qualifier according to the setting in the parameter. + */ +class DisableDefaultEntityResolutionTransformer extends XxeFlowStateTransformer { + Expr newValue; + + DisableDefaultEntityResolutionTransformer() { + exists(Call call, Function f | + call.getTarget() = f and + ( + f.getDeclaringType() instanceof AbstractDomParserClass or + f.getDeclaringType() instanceof SaxParserClass + ) and + f.hasName("setDisableDefaultEntityResolution") and + this = call.getQualifier() and + newValue = call.getArgument(0) + ) + } + + final override XxeFlowState transform(XxeFlowState flowstate) { + exists(int createEntityReferenceNodes | + encodeXercesFlowState(flowstate, _, createEntityReferenceNodes) and + ( + globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // true + encodeXercesFlowState(result, 1, createEntityReferenceNodes) + or + not globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // false or unknown + encodeXercesFlowState(result, 0, createEntityReferenceNodes) + ) + ) + } +} + +/** + * A flow state transformer for a call to + * `AbstractDOMParser.setCreateEntityReferenceNodes`. Transforms the flow + * state through the qualifier according to the setting in the parameter. + */ +class CreateEntityReferenceNodesTransformer extends XxeFlowStateTransformer { + Expr newValue; + + CreateEntityReferenceNodesTransformer() { + exists(Call call, Function f | + call.getTarget() = f and + f.getClassAndName("setCreateEntityReferenceNodes") instanceof AbstractDomParserClass and + this = call.getQualifier() and + newValue = call.getArgument(0) + ) + } + + final override XxeFlowState transform(XxeFlowState flowstate) { + exists(int disabledDefaultEntityResolution | + encodeXercesFlowState(flowstate, disabledDefaultEntityResolution, _) and + ( + globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // true + encodeXercesFlowState(result, disabledDefaultEntityResolution, 1) + or + not globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // false or unknown + encodeXercesFlowState(result, disabledDefaultEntityResolution, 0) + ) + ) + } +} + +/** + * The `XMLUni.fgXercesDisableDefaultEntityResolution` constant. + */ +class FeatureDisableDefaultEntityResolution extends Variable { + FeatureDisableDefaultEntityResolution() { + this.getName() = "fgXercesDisableDefaultEntityResolution" and + this.getDeclaringType().getName() = "XMLUni" + } +} + +/** + * A flow state transformer for a call to `SAX2XMLReader.setFeature` + * specifying the feature `XMLUni::fgXercesDisableDefaultEntityResolution`. + * Transforms the flow state through the qualifier according to this setting. + */ +class SetFeatureTransformer extends XxeFlowStateTransformer { + Expr newValue; + + SetFeatureTransformer() { + exists(Call call, Function f | + call.getTarget() = f and + f.getClassAndName("setFeature") instanceof Sax2XmlReader and + this = call.getQualifier() and + globalValueNumber(call.getArgument(0)).getAnExpr().(VariableAccess).getTarget() instanceof + FeatureDisableDefaultEntityResolution and + newValue = call.getArgument(1) + ) + } + + final override XxeFlowState transform(XxeFlowState flowstate) { + exists(int createEntityReferenceNodes | + encodeXercesFlowState(flowstate, _, createEntityReferenceNodes) and + ( + globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // true + encodeXercesFlowState(result, 1, createEntityReferenceNodes) + or + not globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // false or unknown + encodeXercesFlowState(result, 0, createEntityReferenceNodes) + ) + ) + } +} + +/** + * The `DOMLSParser.getDomConfig` function. + */ +class GetDomConfig extends Function { + GetDomConfig() { this.getClassAndName("getDomConfig") instanceof DomLSParserClass } +} + +/** + * The `DOMConfiguration.setParameter` function. + */ +class DomConfigurationSetParameter extends Function { + DomConfigurationSetParameter() { + this.getClassAndName("setParameter").getName() = "DOMConfiguration" + } +} + +/** + * A flow state transformer for a call to `DOMConfiguration.setParameter` + * specifying the feature `XMLUni::fgXercesDisableDefaultEntityResolution`. + * This is a slightly more complex transformer because the qualifier is a + * `DOMConfiguration` pointer returned by `DOMLSParser.getDomConfig` - and it + * is *that* qualifier we want to transform the flow state of. + */ +class DomConfigurationSetParameterTransformer extends XxeFlowStateTransformer { + Expr newValue; + + DomConfigurationSetParameterTransformer() { + exists(FunctionCall getDomConfigCall, FunctionCall setParameterCall | + // this is the qualifier of a call to `DOMLSParser.getDomConfig`. + getDomConfigCall.getTarget() instanceof GetDomConfig and + this = getDomConfigCall.getQualifier() and + // `setParameterCall` is a call to `setParameter` on the return value of + // the same call to `DOMLSParser.getDomConfig`. + setParameterCall.getTarget() instanceof DomConfigurationSetParameter and + globalValueNumber(setParameterCall.getQualifier()).getAnExpr() = getDomConfigCall and + // the parameter being set is + // `XMLUni::fgXercesDisableDefaultEntityResolution`. + globalValueNumber(setParameterCall.getArgument(0)).getAnExpr().(VariableAccess).getTarget() + instanceof FeatureDisableDefaultEntityResolution and + // the value being set is `newValue`. + newValue = setParameterCall.getArgument(1) + ) + } + + final override XxeFlowState transform(XxeFlowState flowstate) { + exists(int createEntityReferenceNodes | + encodeXercesFlowState(flowstate, _, createEntityReferenceNodes) and + ( + globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // true + encodeXercesFlowState(result, 1, createEntityReferenceNodes) + or + not globalValueNumber(newValue).getAnExpr().getValue().toInt() = 1 and // false or unknown + encodeXercesFlowState(result, 0, createEntityReferenceNodes) + ) + ) + } +} diff --git a/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md b/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md deleted file mode 100644 index 6da48a433da..00000000000 --- a/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: newQuery ---- - -- A new query titled "Use of expired stack-address" (`cpp/using-expired-stack-address`) has been added. - This query finds accesses to expired stack-allocated memory that escaped via a global variable. diff --git a/cpp/ql/src/change-notes/2022-02-24-non-https-url.md b/cpp/ql/src/change-notes/2022-02-24-non-https-url.md deleted file mode 100644 index ac1523d5e53..00000000000 --- a/cpp/ql/src/change-notes/2022-02-24-non-https-url.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Failure to use HTTPS URLs" (`cpp/non-https-url`) has been improved reducing false positive results, and its precision has been increased to 'high'. diff --git a/cpp/ql/src/change-notes/2022-04-12-unused-local-variable.md b/cpp/ql/src/change-notes/2022-04-12-unused-local-variable.md new file mode 100644 index 00000000000..d4120401e1a --- /dev/null +++ b/cpp/ql/src/change-notes/2022-04-12-unused-local-variable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/unused-local-variable` no longer ignores functions that include `if` and `switch` statements with C++17-style initializers. diff --git a/cpp/ql/src/change-notes/2022-05-12-external-entity-expansion.md b/cpp/ql/src/change-notes/2022-05-12-external-entity-expansion.md new file mode 100644 index 00000000000..7d2f38c5040 --- /dev/null +++ b/cpp/ql/src/change-notes/2022-05-12-external-entity-expansion.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "XML external entity expansion" (`cpp/external-entity-expansion`) query precision has been increased to `high`. diff --git a/cpp/ql/src/change-notes/2022-02-11-code-duplication.md b/cpp/ql/src/change-notes/released/0.0.10.md similarity index 78% rename from cpp/ql/src/change-notes/2022-02-11-code-duplication.md rename to cpp/ql/src/change-notes/released/0.0.10.md index e9f676022b7..9ee2cd7e2cb 100644 --- a/cpp/ql/src/change-notes/2022-02-11-code-duplication.md +++ b/cpp/ql/src/change-notes/released/0.0.10.md @@ -1,4 +1,5 @@ ---- -category: deprecated ---- +## 0.0.10 + +### Deprecated Classes + * The `CodeDuplication.Copy`, `CodeDuplication.DuplicateBlock`, and `CodeDuplication.SimilarBlock` classes have been deprecated. diff --git a/cpp/ql/src/change-notes/released/0.0.11.md b/cpp/ql/src/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..589cd05a6fb --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.11.md @@ -0,0 +1,20 @@ +## 0.0.11 + +### Breaking Changes + +* The deprecated queries `cpp/duplicate-block`, `cpp/duplicate-function`, `cpp/duplicate-class`, `cpp/duplicate-file`, `cpp/mostly-duplicate-function`,`cpp/similar-file`, `cpp/duplicated-lines-in-files` have been removed. + +### Deprecated Predicates and Classes + +* The predicates and classes in the `CodeDuplication` library have been deprecated. + +### New Queries + +* A new query titled "Use of expired stack-address" (`cpp/using-expired-stack-address`) has been added. + This query finds accesses to expired stack-allocated memory that escaped via a global variable. +* A new `cpp/insufficient-key-size` query has been added to the default query suite for C/C++. The query finds uses of certain cryptographic algorithms where the key size is too small to provide adequate encryption strength. + +### Minor Analysis Improvements + +* The "Failure to use HTTPS URLs" (`cpp/non-https-url`) has been improved reducing false positive results, and its precision has been increased to 'high'. +* The `cpp/system-data-exposure` query has been modernized and has converted to a `path-problem` query. There are now fewer false positive results. diff --git a/cpp/ql/src/change-notes/released/0.0.12.md b/cpp/ql/src/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..1d690444435 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.12.md @@ -0,0 +1,6 @@ +## 0.0.12 + +### Minor Analysis Improvements + +* The `cpp/overflow-destination`, `cpp/unclear-array-index-validation`, and `cpp/uncontrolled-allocation-size` queries have been modernized and converted to `path-problem` queries and provide more true positive results. +* The `cpp/system-data-exposure` query has been increased from `medium` to `high` precision, following a number of improvements to the query logic. diff --git a/cpp/ql/src/change-notes/released/0.0.13.md b/cpp/ql/src/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..30ff8ab8dd0 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.13.md @@ -0,0 +1 @@ +## 0.0.13 diff --git a/cpp/ql/src/change-notes/released/0.1.0.md b/cpp/ql/src/change-notes/released/0.1.0.md new file mode 100644 index 00000000000..0a2431741da --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.1.0.md @@ -0,0 +1,8 @@ +## 0.1.0 + +### Minor Analysis Improvements + +* The `cpp/cleartext-transmission` query now recognizes additional sources, for sensitive private data such as e-mail addresses and credit card numbers. +* The `cpp/unused-local-variable` no longer ignores functions that include lambda expressions capturing trivially copyable objects. +* The `cpp/command-line-injection` query now takes into account calling contexts across string concatenations. This removes false positives due to mismatched calling contexts before and after string concatenations. +* A new query, "Potential exposure of sensitive system data to an unauthorized control sphere" (`cpp/potential-system-data-exposure`) has been added. This query is focused on exposure of information that is highly likely to be sensitive, whereas the similar query "Exposure of system data to an unauthorized control sphere" (`cpp/system-data-exposure`) is focused on exposure of information on a channel that is more likely to be intercepted by an attacker. diff --git a/cpp/ql/src/change-notes/released/0.1.1.md b/cpp/ql/src/change-notes/released/0.1.1.md new file mode 100644 index 00000000000..56f7297cf67 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.1.1.md @@ -0,0 +1,5 @@ +## 0.1.1 + +### New Queries + +* An new query `cpp/external-entity-expansion` has been added. The query detects XML objects that are vulnerable to external entity expansion (XXE) attacks. diff --git a/cpp/ql/src/change-notes/released/0.1.2.md b/cpp/ql/src/change-notes/released/0.1.2.md new file mode 100644 index 00000000000..ca3236f5950 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.1.2.md @@ -0,0 +1,5 @@ +## 0.1.2 + +### Minor Analysis Improvements + +* The "XML external entity expansion" (`cpp/external-entity-expansion`) query has been extended to support a broader selection of XML libraries and interfaces. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index ecdd64fbab8..6abd14b1ef8 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.9 +lastReleaseVersion: 0.1.2 diff --git a/cpp/ql/src/codeql-suites/cpp-code-scanning.qls b/cpp/ql/src/codeql-suites/cpp-code-scanning.qls index d14d1004b2a..7bc6de35a14 100644 --- a/cpp/ql/src/codeql-suites/cpp-code-scanning.qls +++ b/cpp/ql/src/codeql-suites/cpp-code-scanning.qls @@ -3,4 +3,3 @@ - apply: code-scanning-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml - from: codeql/cpp-queries diff --git a/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls b/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls index 7bc269050bf..b71dea795b0 100644 --- a/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls +++ b/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls @@ -3,7 +3,6 @@ - apply: lgtm-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml - from: codeql/cpp-queries # These are only for IDE use. - exclude: tags contain: diff --git a/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls b/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls index 968883e26ea..b4f85c4e306 100644 --- a/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls +++ b/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls @@ -3,4 +3,3 @@ - apply: security-and-quality-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml - from: codeql/cpp-queries diff --git a/cpp/ql/src/codeql-suites/cpp-security-extended.qls b/cpp/ql/src/codeql-suites/cpp-security-extended.qls index bf81c30e473..69c014c4c6f 100644 --- a/cpp/ql/src/codeql-suites/cpp-security-extended.qls +++ b/cpp/ql/src/codeql-suites/cpp-security-extended.qls @@ -3,4 +3,3 @@ - apply: security-extended-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml - from: codeql/cpp-queries diff --git a/cpp/ql/src/codeql-suites/exclude-slow-queries.yml b/cpp/ql/src/codeql-suites/exclude-slow-queries.yml index a1a4ced9c7d..5a604f4a8e4 100644 --- a/cpp/ql/src/codeql-suites/exclude-slow-queries.yml +++ b/cpp/ql/src/codeql-suites/exclude-slow-queries.yml @@ -2,7 +2,6 @@ # These queries are infeasible to compute on large projects: - exclude: query path: - - Security/CWE/CWE-497/ExposedSystemData.ql - Critical/DescriptorMayNotBeClosed.ql - Critical/DescriptorNeverClosed.ql - Critical/FileMayNotBeClosed.ql diff --git a/cpp/ql/src/experimental/Best Practices/WrongUintAccess.cpp b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.cpp new file mode 100644 index 00000000000..f0704299ffc --- /dev/null +++ b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.cpp @@ -0,0 +1,7 @@ +void test() +{ + uint16_t j = 256; + char testSubject[122]; + + testSubject[j] = 12; // You can use a uint8 here +} diff --git a/cpp/ql/src/experimental/Best Practices/WrongUintAccess.qhelp b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.qhelp new file mode 100644 index 00000000000..d298db04ed7 --- /dev/null +++ b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.qhelp @@ -0,0 +1,18 @@ + + + + +

    Find access to an array with a Uint16 when the array has a size lower than 256.

    +
    + + +

    Use a int with a lower bit size instead. For instance in this example use a 8 bit int.

    +
    + + + + + +
    diff --git a/cpp/ql/src/experimental/Best Practices/WrongUintAccess.ql b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.ql new file mode 100644 index 00000000000..ee1cca9b6e9 --- /dev/null +++ b/cpp/ql/src/experimental/Best Practices/WrongUintAccess.ql @@ -0,0 +1,25 @@ +/** + * @id cpp/wrong-uint-access + * @name Wrong Uint + * @descripion Acess an array of size lower than 256 with a uint16. + * @kind problem + * @problem.severity recommendation + * @tags efficiency + */ + +import cpp + +from Variable var, ArrayExpr useExpr, ArrayType defLine, VariableAccess use +where + var.getUnspecifiedType() = defLine and + use = useExpr.getArrayBase() and + var = use.getTarget() and + ( + useExpr.getArrayOffset().getType() instanceof UInt16_t or + useExpr.getArrayOffset().getType() instanceof UInt32_t or + useExpr.getArrayOffset().getType() instanceof UInt64_t + ) and + defLine.getArraySize() <= 256 +select useExpr, + "Using a " + useExpr.getArrayOffset().getType() + " to acess the array $@ of size " + + defLine.getArraySize() + ".", var, var.getName() diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser.ql b/cpp/ql/src/experimental/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser.ql new file mode 100644 index 00000000000..a6fac4a40d9 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser.ql @@ -0,0 +1,59 @@ +/** + * @name Linux kernel no check before unsafe_put_user vulnerability detection + * @description unsafe_put_user which is used to write data to user-mode + * memory is widely used in Linux kernel codebase, but if + * there is no security check for user-mode pointer used as + * parameter of unsafe_put_user, attacker can exploit the issue + * to obtain root privilege. CVE-2017-5123 is quite a good + * example for your information. + * @kind problem + * @id cpp/linux-kernel-no-check-before-unsafe-put-user + * @problem.severity warning + * @security-severity 7.5 + * @tags security + * external/cwe/cwe-020 + */ + +import cpp +import semmle.code.cpp.dataflow.DataFlow + +class WriteAccessCheckMacro extends Macro { + VariableAccess va; + + WriteAccessCheckMacro() { + this.getName() = ["user_write_access_begin", "user_access_begin", "access_ok"] and + va.getEnclosingElement() = this.getAnInvocation().getAnExpandedElement() + } + + VariableAccess getArgument() { result = va } +} + +class UnSafePutUserMacro extends Macro { + PointerDereferenceExpr writeUserPtr; + + UnSafePutUserMacro() { + this.getName() = "unsafe_put_user" and + writeUserPtr.getEnclosingElement() = this.getAnInvocation().getAnExpandedElement() + } + + Expr getUserModePtr() { + result = writeUserPtr.getOperand().(AddressOfExpr).getOperand().(FieldAccess).getQualifier() or + result = writeUserPtr.getOperand() + } +} + +class ExploitableUserModePtrParam extends Parameter { + ExploitableUserModePtrParam() { + not exists(WriteAccessCheckMacro writeAccessCheck | + DataFlow::localFlow(DataFlow::parameterNode(this), + DataFlow::exprNode(writeAccessCheck.getArgument())) + ) and + exists(UnSafePutUserMacro unsafePutUser | + DataFlow::localFlow(DataFlow::parameterNode(this), + DataFlow::exprNode(unsafePutUser.getUserModePtr())) + ) + } +} + +from ExploitableUserModePtrParam p +select p, "unsafe_put_user write user-mode pointer $@ without check.", p, p.toString() diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.cpp new file mode 100644 index 00000000000..6a16e992471 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.cpp @@ -0,0 +1,5 @@ +... + vUnsignedLong = (unsigned long)(vUnsignedInt*vUnsignedInt); // BAD +... + vUnsignedLong = ((unsigned long)vUnsignedInt*vUnsignedInt); // GOOD +... diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.qhelp new file mode 100644 index 00000000000..458b5e50866 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.qhelp @@ -0,0 +1,24 @@ + + + +

    Search for places where the result of the multiplication is subjected to explicit conversion, not the arguments. Therefore, during the multiplication period, you can lose meaningful data.

    + + +
    + + +

    The following example demonstrates erroneous and fixed methods for working with type conversion.

    + + +
    + + +
  • + CERT C Coding Standard: + INT30-C. Ensure that unsigned integer operations do not wrap. +
  • + +
    +
    diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql new file mode 100644 index 00000000000..0bebc69a8bf --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql @@ -0,0 +1,102 @@ +/** + * @name Dangerous use of transformation after operation. + * @description By using the transformation after the operation, you are doing a pointless and dangerous action. + * @kind problem + * @id cpp/dangerous-use-of-transformation-after-operation + * @problem.severity warning + * @precision medium + * @tags correctness + * security + * external/cwe/cwe-190 + */ + +import cpp + +/** Returns the number of the expression in the function call arguments. */ +int argumentPosition(FunctionCall fc, Expr exp, int n) { + n in [0 .. fc.getNumberOfArguments() - 1] and + fc.getArgument(n) = exp and + result = n +} + +/** Holds if a nonsensical type conversion situation is found. */ +predicate conversionDoneLate(MulExpr mexp) { + exists(Expr e1, Expr e2 | + mexp.hasOperands(e1, e2) and + not e1.isConstant() and + not e1.hasConversion() and + not e1.hasConversion() and + ( + e2.isConstant() or + not e2.hasConversion() + ) and + mexp.getConversion().hasExplicitConversion() and + mexp.getConversion() instanceof ParenthesisExpr and + mexp.getConversion().getConversion() instanceof CStyleCast and + mexp.getConversion().getConversion().getType().getSize() > mexp.getType().getSize() and + mexp.getConversion().getConversion().getType().getSize() > e2.getType().getSize() and + mexp.getConversion().getConversion().getType().getSize() > e1.getType().getSize() and + exists(Expr e0 | + e0.(AssignExpr).getRValue() = mexp.getParent*() and + e0.(AssignExpr).getLValue().getType().getSize() = + mexp.getConversion().getConversion().getType().getSize() + or + mexp.getEnclosingElement().(ComparisonOperation).hasOperands(mexp, e0) and + e0.getType().getSize() = mexp.getConversion().getConversion().getType().getSize() + or + e0.(FunctionCall) + .getTarget() + .getParameter(argumentPosition(e0.(FunctionCall), mexp, _)) + .getType() + .getSize() = mexp.getConversion().getConversion().getType().getSize() + ) + ) +} + +/** Holds if the situation of a possible signed overflow used in pointer arithmetic is found. */ +predicate signSmallerWithEqualSizes(MulExpr mexp) { + exists(Expr e1, Expr e2 | + mexp.hasOperands(e1, e2) and + not e1.isConstant() and + not e1.hasConversion() and + not e1.hasConversion() and + ( + e2.isConstant() or + not e2.hasConversion() + ) and + mexp.getConversion+().getUnderlyingType().getSize() = e1.getUnderlyingType().getSize() and + ( + e2.isConstant() or + mexp.getConversion+().getUnderlyingType().getSize() = e2.getUnderlyingType().getSize() + ) and + mexp.getConversion+().getUnderlyingType().getSize() = e1.getUnderlyingType().getSize() and + exists(AssignExpr ae | + ae.getRValue() = mexp.getParent*() and + ae.getRValue().getUnderlyingType().(IntegralType).isUnsigned() and + ae.getLValue().getUnderlyingType().(IntegralType).isSigned() and + ( + not exists(DivExpr de | mexp.getParent*() = de) + or + exists(DivExpr de, Expr ec | + e2.isConstant() and + de.hasOperands(mexp.getParent*(), ec) and + ec.isConstant() and + e2.getValue().toInt() > ec.getValue().toInt() + ) + ) and + exists(PointerAddExpr pa | + ae.getASuccessor+() = pa and + pa.getAnOperand().(VariableAccess).getTarget() = ae.getLValue().(VariableAccess).getTarget() + ) + ) + ) +} + +from MulExpr mexp, string msg +where + conversionDoneLate(mexp) and + msg = "This transformation is applied after multiplication." + or + signSmallerWithEqualSizes(mexp) and + msg = "Possible signed overflow followed by offset of the pointer out of bounds." +select mexp, msg diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.cpp new file mode 100644 index 00000000000..4e29879a94d --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.cpp @@ -0,0 +1,10 @@ +... + FILE *fp = fopen(filename,"w"); // BAD +... + umask(S_IXUSR|S_IRWXG|S_IRWXO); + FILE *fp; + fp = fopen(filename,"w"); // GOOD + chmod(filename,S_IRUSR|S_IWUSR); + fprintf(fp,"%s\n","data to file"); + fclose(fp); +... diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.qhelp new file mode 100644 index 00000000000..e46dd08f57e --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.qhelp @@ -0,0 +1,24 @@ + + + +

    When creating a file using a library function such as fopen, the access rights for the newly created file are not specified as part of the call. Instead these rights are determined by the system unless the programmer takes specific measures, such as calling the Posix umask function at some point before the call to fopen. For some applications, the default access rights assigned by the system are not sufficient to protect a file against access by an attacker.

    + + +
    + + +

    The following example demonstrates erroneous and fixed methods for working with files.

    + + +
    + + +
  • + CERT C Coding Standard: + FIO06-C. Create files with appropriate access permissions. +
  • + +
    +
    diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql new file mode 100644 index 00000000000..ec32ccd4bfc --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql @@ -0,0 +1,65 @@ +/** + * @name Writing to a file without setting permissions. + * @description Lack of restriction on file access rights can be unsafe. + * @kind problem + * @id cpp/work-with-file-without-permissions-rights + * @problem.severity warning + * @precision medium + * @tags correctness + * maintainability + * security + * external/cwe/cwe-200 + * external/cwe/cwe-264 + */ + +import cpp +import semmle.code.cpp.valuenumbering.GlobalValueNumbering + +/** Holds for a function `f` that has an argument at index `apos` used to read the file. */ +predicate numberArgumentRead(Function f, int apos) { + f.hasGlobalOrStdName("fgets") and apos = 2 + or + f.hasGlobalOrStdName("fread") and apos = 3 + or + f.hasGlobalOrStdName("read") and apos = 0 + or + f.hasGlobalOrStdName("fscanf") and apos = 0 +} + +/** Holds for a function `f` that has an argument at index `apos` used to write to file */ +predicate numberArgumentWrite(Function f, int apos) { + f.hasGlobalOrStdName("fprintf") and apos = 0 + or + f.hasGlobalOrStdName("fputs") and apos = 1 + or + f.hasGlobalOrStdName("write") and apos = 0 + or + f.hasGlobalOrStdName("fwrite") and apos = 3 + or + f.hasGlobalOrStdName("fflush") and apos = 0 +} + +from FunctionCall fc +where + // a file is opened + ( + fc.getTarget().hasGlobalOrStdName("fopen") or + fc.getTarget().hasGlobalOrStdName("open") + ) and + fc.getNumberOfArguments() = 2 and + // the file is used for writing (but not reading) + exists(FunctionCall fctmp, int i | + numberArgumentWrite(fctmp.getTarget(), i) and + globalValueNumber(fc) = globalValueNumber(fctmp.getArgument(i)) + ) and + not exists(FunctionCall fctmp, int i | + numberArgumentRead(fctmp.getTarget(), i) and + globalValueNumber(fc) = globalValueNumber(fctmp.getArgument(i)) + ) and + // a file creation mode is not set globally by `umask` anywhere in the program + not exists(FunctionCall fctmp | + fctmp.getTarget().hasGlobalOrStdName("umask") or + fctmp.getTarget().hasGlobalOrStdName("fchmod") or + fctmp.getTarget().hasGlobalOrStdName("chmod") + ) +select fc, "You may have forgotten to restrict access rights when working with a file." diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-266/IncorrectPrivilegeAssignment.ql b/cpp/ql/src/experimental/Security/CWE/CWE-266/IncorrectPrivilegeAssignment.ql index 22e42d39147..5bdd5a21fe5 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-266/IncorrectPrivilegeAssignment.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-266/IncorrectPrivilegeAssignment.ql @@ -16,7 +16,6 @@ */ import cpp -import semmle.code.cpp.exprs.BitwiseOperation import semmle.code.cpp.valuenumbering.GlobalValueNumbering /** @@ -59,7 +58,7 @@ where // unfortunately cannot use numeric value here because // O_CREAT is defined differently on different OSes: // https://github.com/red/red/blob/92feb0c0d5f91e087ab35fface6906afbf99b603/runtime/definitions.reds#L477-L491 // this may introduce false negatives - fctmp.getArgument(1).(BitwiseOrExpr).getAChild*().getValueText().matches("O_CREAT") or + fctmp.getArgument(1).(BitwiseOrExpr).getAChild*().getValueText() = "O_CREAT" or fctmp.getArgument(1).getValueText().matches("%O_CREAT%") ) and fctmp.getNumberOfArguments() = 2 and diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.qhelp new file mode 100644 index 00000000000..debf30dfa65 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.qhelp @@ -0,0 +1,49 @@ + + + +

    + Using only a call to + pam_authenticate + to check the validity of a login can lead to authorization bypass vulnerabilities. +

    +

    + A + pam_authenticate + only verifies the credentials of a user. It does not check if a user has an appropriate authorization to actually login. This means a user with a expired login or a password can still access the system. +

    + +
    + + +

    + A call to + pam_authenticate + should be followed by a call to + pam_acct_mgmt + to check if a user is allowed to login. +

    +
    + + +

    + In the following example, the code only checks the credentials of a user. Hence, in this case, a user expired with expired creds can still login. This can be verified by creating a new user account, expiring it with + chage -E0 `username` + and then trying to log in. +

    + + +

    + This can be avoided by calling + pam_acct_mgmt + call to verify access as has been done in the snippet shown below. +

    + +
    + + +
  • + Man-Page: + pam_acct_mgmt +
  • +
    +
    \ No newline at end of file diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.ql b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.ql new file mode 100644 index 00000000000..5292a705d93 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorization.ql @@ -0,0 +1,34 @@ +/** + * @name PAM Authorization bypass + * @description Only using `pam_authenticate` call to authenticate users can lead to authorization vulnerabilities. + * @kind problem + * @problem.severity error + * @id cpp/pam-auth-bypass + * @tags security + * external/cwe/cwe-285 + */ + +import cpp +import semmle.code.cpp.dataflow.DataFlow +import semmle.code.cpp.valuenumbering.GlobalValueNumbering + +private class PamAuthCall extends FunctionCall { + PamAuthCall() { + exists(Function f | f.hasName("pam_authenticate") | f.getACallToThisFunction() = this) + } +} + +private class PamActMgmtCall extends FunctionCall { + PamActMgmtCall() { + exists(Function f | f.hasName("pam_acct_mgmt") | f.getACallToThisFunction() = this) + } +} + +from PamAuthCall pa, Expr handle +where + pa.getArgument(0) = handle and + not exists(PamActMgmtCall pac | + globalValueNumber(handle) = globalValueNumber(pac.getArgument(0)) or + DataFlow::localExprFlow(handle, pac.getArgument(0)) + ) +select pa, "This PAM authentication call may be lead to an authorization bypass." diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationBad.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationBad.cpp new file mode 100644 index 00000000000..cde024cde34 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationBad.cpp @@ -0,0 +1,20 @@ +bool PamAuthGood(const std::string &username_in, + const std::string &password_in, + std::string &authenticated_username) +{ + + struct pam_handle *pamh = nullptr; /* pam session handle */ + + const char *username = username_in.c_str(); + int err = pam_start("test", username, + 0, &pamh); + if (err != PAM_SUCCESS) + { + return false; + } + + err = pam_authenticate(pamh, 0); // BAD + if (err != PAM_SUCCESS) + return err; + return true; +} diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationGood.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationGood.cpp new file mode 100644 index 00000000000..e4a2ce008c5 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-285/PamAuthorizationGood.cpp @@ -0,0 +1,24 @@ +bool PamAuthGood(const std::string &username_in, + const std::string &password_in, + std::string &authenticated_username) +{ + + struct pam_handle *pamh = nullptr; /* pam session handle */ + + const char *username = username_in.c_str(); + int err = pam_start("test", username, + 0, &pamh); + if (err != PAM_SUCCESS) + { + return false; + } + + err = pam_authenticate(pamh, 0); + if (err != PAM_SUCCESS) + return err; + + err = pam_acct_mgmt(pamh, 0); // GOOD + if (err != PAM_SUCCESS) + return err; + return true; +} diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-362/double-fetch.ql b/cpp/ql/src/experimental/Security/CWE/CWE-362/double-fetch.ql new file mode 100644 index 00000000000..7169f3bead3 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-362/double-fetch.ql @@ -0,0 +1,46 @@ +/** + * @name Linux kernel double-fetch vulnerability detection + * @description Double-fetch is a very common vulnerability pattern + * in linux kernel, attacker can exploit double-fetch + * issues to obatain root privilege. + * Double-fetch is caused by fetching data from user + * mode by calling copy_from_user twice, CVE-2016-6480 + * is quite a good example for your information. + * @kind problem + * @id cpp/linux-kernel-double-fetch-vulnerability + * @problem.severity warning + * @security-severity 7.5 + * @tags security + * external/cwe/cwe-362 + */ + +import cpp +import semmle.code.cpp.valuenumbering.GlobalValueNumbering + +class CopyFromUserFunctionCall extends FunctionCall { + CopyFromUserFunctionCall() { + this.getTarget().getName() = "copy_from_user" and + not this.getArgument(1) instanceof AddressOfExpr + } + + //root cause of double-fetech issue is read from + //the same user mode memory twice, so it makes + //sense that only check user mode pointer + predicate readFromSameUserModePointer(CopyFromUserFunctionCall another) { + globalValueNumber(this.getArgument(1)) = globalValueNumber(another.getArgument(1)) + } +} + +from CopyFromUserFunctionCall p1, CopyFromUserFunctionCall p2 +where + not p1 = p2 and + p1.readFromSameUserModePointer(p2) and + exists(IfStmt ifStmt | + p1.getBasicBlock().getAFalseSuccessor*() = ifStmt.getBasicBlock() and + ifStmt.getBasicBlock().getAFalseSuccessor*() = p2.getBasicBlock() + ) and + not exists(AssignPointerAddExpr assignPtrAdd | + globalValueNumber(p1.getArgument(1)) = globalValueNumber(assignPtrAdd.getLValue()) and + p1.getBasicBlock().getAFalseSuccessor*() = assignPtrAdd.getBasicBlock() + ) +select p2, "Double fetch vulnerability. First fetch was $@.", p1, p1.toString() diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-377/InsecureTemporaryFile.ql b/cpp/ql/src/experimental/Security/CWE/CWE-377/InsecureTemporaryFile.ql index 877b67cbbf8..0852cb90918 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-377/InsecureTemporaryFile.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-377/InsecureTemporaryFile.ql @@ -13,30 +13,6 @@ import cpp import semmle.code.cpp.valuenumbering.GlobalValueNumbering -/** Holds for a function `f` that has an argument at index `apos` used to read the file. */ -predicate numberArgumentRead(Function f, int apos) { - f.hasGlobalOrStdName("fgets") and apos = 2 - or - f.hasGlobalOrStdName("fread") and apos = 3 - or - f.hasGlobalOrStdName("read") and apos = 0 - or - f.hasGlobalOrStdName("fscanf") and apos = 0 -} - -/** Holds for a function `f` that has an argument at index `apos` used to write to file */ -predicate numberArgumentWrite(Function f, int apos) { - f.hasGlobalOrStdName("fprintf") and apos = 0 - or - f.hasGlobalOrStdName("fputs") and apos = 1 - or - f.hasGlobalOrStdName("write") and apos = 0 - or - f.hasGlobalOrStdName("fwrite") and apos = 3 - or - f.hasGlobalOrStdName("fflush") and apos = 0 -} - from FunctionCall fc, string msg where // search for functions for generating a name, without a guarantee of the absence of a file during the period of work with it. @@ -59,54 +35,4 @@ where ) and msg = "Finding the name of a file that does not exist does not mean that it will not be exist at the next operation." - or - // finding places to work with a file without setting permissions, but with predictable names. - ( - fc.getTarget().hasGlobalOrStdName("fopen") or - fc.getTarget().hasGlobalOrStdName("open") - ) and - fc.getNumberOfArguments() = 2 and - exists(FunctionCall fctmp, int i | - numberArgumentWrite(fctmp.getTarget(), i) and - globalValueNumber(fc) = globalValueNumber(fctmp.getArgument(i)) - ) and - not exists(FunctionCall fctmp, int i | - numberArgumentRead(fctmp.getTarget(), i) and - globalValueNumber(fc) = globalValueNumber(fctmp.getArgument(i)) - ) and - exists(FunctionCall fctmp | - ( - fctmp.getTarget().hasGlobalOrStdName("strcat") or - fctmp.getTarget().hasGlobalOrStdName("strcpy") - ) and - globalValueNumber(fc.getArgument(0)) = globalValueNumber(fctmp.getAnArgument()) - or - fctmp.getTarget().hasGlobalOrStdName("getenv") and - globalValueNumber(fc.getArgument(0)) = globalValueNumber(fctmp) - or - ( - fctmp.getTarget().hasGlobalOrStdName("asprintf") or - fctmp.getTarget().hasGlobalOrStdName("vasprintf") or - fctmp.getTarget().hasGlobalOrStdName("xasprintf") or - fctmp.getTarget().hasGlobalOrStdName("xvasprintf ") - ) and - exists(Variable vrtmp | - vrtmp = fc.getArgument(0).(VariableAccess).getTarget() and - vrtmp = fctmp.getArgument(0).(AddressOfExpr).getAddressable() and - not vrtmp instanceof Field - ) - ) and - not exists(FunctionCall fctmp | - ( - fctmp.getTarget().hasGlobalOrStdName("umask") or - fctmp.getTarget().hasGlobalOrStdName("fchmod") or - fctmp.getTarget().hasGlobalOrStdName("chmod") - ) and - ( - fc.getBasicBlock().getASuccessor*() = fctmp.getBasicBlock() or - fctmp.getBasicBlock().getASuccessor*() = fc.getBasicBlock() - ) - ) and - msg = - "Creating a file for writing without evaluating its existence and setting permissions can be unsafe." select fc, msg diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.cpp new file mode 100644 index 00000000000..ea4686fdb8c --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.cpp @@ -0,0 +1,48 @@ +... +try { + if (checkValue) throw exception(); + bufMyData = new myData*[sizeInt]; + + } + catch (...) + { + for (size_t i = 0; i < sizeInt; i++) + { + delete[] bufMyData[i]->buffer; // BAD + delete bufMyData[i]; + } +... +try { + if (checkValue) throw exception(); + bufMyData = new myData*[sizeInt]; + + } + catch (...) + { + for (size_t i = 0; i < sizeInt; i++) + { + if(bufMyData[i]) + { + delete[] bufMyData[i]->buffer; // GOOD + delete bufMyData[i]; + } + } + +... + catch (const exception &) { + delete valData; + throw; + } + catch (...) + { + delete valData; // BAD +... + catch (const exception &) { + delete valData; + valData = NULL; + throw; + } + catch (...) + { + delete valData; // GOOD +... diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.qhelp new file mode 100644 index 00000000000..b9a2e3db331 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.qhelp @@ -0,0 +1,23 @@ + + + +

    When releasing memory in a catch block, be sure that the memory was allocated and has not already been released.

    + +
    + + +

    The following example shows erroneous and fixed ways to use exception handling.

    + + +
    + + +
  • + CERT C Coding Standard: + EXP34-C. Do not dereference null pointers. +
  • + +
    +
    diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.ql b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.ql new file mode 100644 index 00000000000..2feca267902 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.ql @@ -0,0 +1,199 @@ +/** + * @name Dangerous use of exception blocks. + * @description When clearing the data in the catch block, you must be sure that the memory was allocated before the exception. + * @kind problem + * @id cpp/dangerous-use-of-exception-blocks + * @problem.severity warning + * @precision medium + * @tags correctness + * security + * external/cwe/cwe-476 + * external/cwe/cwe-415 + */ + +import cpp + +/** Holds if `vr` may be released in the `try` block associated with `cb`, or in a `catch` block prior to `cb`. */ +pragma[inline] +predicate doubleCallDelete(BlockStmt b, CatchAnyBlock cb, Variable vr) { + // Search for exceptions after freeing memory. + exists(Expr e1 | + // `e1` is a delete of `vr` + ( + e1 = vr.getAnAccess().getEnclosingStmt().(ExprStmt).getExpr().(DeleteArrayExpr) or + e1 = vr.getAnAccess().getEnclosingStmt().(ExprStmt).getExpr().(DeleteExpr) + ) and + e1.getEnclosingFunction() = cb.getEnclosingFunction() and + // there is no assignment `vr = 0` in the `try` block after `e1` + not exists(AssignExpr ae | + ae.getLValue().(VariableAccess).getTarget() = vr and + ae.getRValue().getValue() = "0" and + e1.getASuccessor+() = ae and + ae.getEnclosingStmt().getParentStmt*() = b + ) and + // `e2` is a `throw` (or a function call that may throw) that occurs in the `try` or `catch` block after `e1` + exists(Expr e2, ThrowExpr th | + ( + e2 = th or + e2 = th.getEnclosingFunction().getACallToThisFunction() + ) and + e2.getEnclosingStmt().getParentStmt*() = b and + e1.getASuccessor+() = e2 + ) and + e1.getEnclosingStmt().getParentStmt*() = b and + ( + // Search for a situation where there is a release in the block of `try`. + b = cb.getTryStmt().getStmt() + or + // Search for a situation when there is a higher catch block that also frees memory. + exists(b.(CatchBlock).getParameter()) + ) and + // Exclude the presence of a check in catch block. + not exists(IfStmt ifst | ifst.getEnclosingStmt().getParentStmt*() = cb.getAStmt()) + ) +} + +/** Holds if an exception can be thrown before the memory is allocated, and when the exception is handled, an attempt is made to access unallocated memory in the catch block. */ +pragma[inline] +predicate pointerDereference(CatchAnyBlock cb, Variable vr, Variable vro) { + // Search exceptions before allocating memory. + exists(Expr e0, Expr e1 | + ( + // `e0` is a `new` expression (or equivalent function call) assigned to `vro` + exists(AssignExpr ase | + ase = vro.getAnAccess().getEnclosingStmt().(ExprStmt).getExpr() and + ( + e0 = ase.getRValue().(NewOrNewArrayExpr) or + e0 = ase.getRValue().(NewOrNewArrayExpr).getEnclosingFunction().getACallToThisFunction() + ) and + vro = ase.getLValue().(VariableAccess).getTarget() + ) + or + // `e0` is a `new` expression (or equivalent function call) assigned to the array element `vro` + exists(AssignExpr ase | + ase = vro.getAnAccess().(Qualifier).getEnclosingStmt().(ExprStmt).getExpr() and + ( + e0 = ase.getRValue().(NewOrNewArrayExpr) or + e0 = ase.getRValue().(NewOrNewArrayExpr).getEnclosingFunction().getACallToThisFunction() + ) and + not ase.getLValue() instanceof VariableAccess and + vro = ase.getLValue().getAPredecessor().(VariableAccess).getTarget() + ) + ) and + // `e1` is a `new` expression (or equivalent function call) assigned to `vr` + exists(AssignExpr ase | + ase = vr.getAnAccess().getEnclosingStmt().(ExprStmt).getExpr() and + ( + e1 = ase.getRValue().(NewOrNewArrayExpr) or + e1 = ase.getRValue().(NewOrNewArrayExpr).getEnclosingFunction().getACallToThisFunction() + ) and + vr = ase.getLValue().(VariableAccess).getTarget() + ) and + e0.getASuccessor*() = e1 and + e0.getEnclosingStmt().getParentStmt*() = cb.getTryStmt().getStmt() and + e1.getEnclosingStmt().getParentStmt*() = cb.getTryStmt().getStmt() and + // `e2` is a `throw` (or a function call that may throw) that occurs in the `try` block before `e0` + exists(Expr e2, ThrowExpr th | + ( + e2 = th or + e2 = th.getEnclosingFunction().getACallToThisFunction() + ) and + e2.getEnclosingStmt().getParentStmt*() = cb.getTryStmt().getStmt() and + e2.getASuccessor+() = e0 + ) + ) and + // We exclude checking the value of a variable or its parent in the catch block. + not exists(IfStmt ifst | + ifst.getEnclosingStmt().getParentStmt*() = cb.getAStmt() and + ( + ifst.getCondition().getAChild*().(VariableAccess).getTarget() = vr or + ifst.getCondition().getAChild*().(VariableAccess).getTarget() = vro + ) + ) +} + +/** Holds if `vro` may be released in the `catch`. */ +pragma[inline] +predicate newThrowDelete(CatchAnyBlock cb, Variable vro) { + exists(Expr e0, AssignExpr ase, NewOrNewArrayExpr nae | + ase = vro.getAnAccess().getEnclosingStmt().(ExprStmt).getExpr() and + nae = ase.getRValue() and + not nae.getAChild*().toString() = "nothrow" and + ( + e0 = nae or + e0 = nae.getEnclosingFunction().getACallToThisFunction() + ) and + vro = ase.getLValue().(VariableAccess).getTarget() and + e0.getEnclosingStmt().getParentStmt*() = cb.getTryStmt().getStmt() and + not exists(AssignExpr ase1 | + vro = ase1.getLValue().(VariableAccess).getTarget() and + ase1.getRValue().getValue() = "0" and + ase1.getASuccessor*() = e0 + ) + ) and + not exists(Initializer it | + vro.getInitializer() = it and + it.getExpr().getValue() = "0" + ) and + not exists(ConstructorFieldInit ci | vro = ci.getTarget()) +} + +from CatchAnyBlock cb, string msg +where + exists(Variable vr, Variable vro, Expr exp | + exp.getEnclosingStmt().getParentStmt*() = cb and + exists(VariableAccess va | + ( + ( + va = exp.(DeleteArrayExpr).getExpr().getAPredecessor+().(Qualifier) or + va = exp.(DeleteArrayExpr).getExpr().getAPredecessor+() + ) and + vr = exp.(DeleteArrayExpr).getExpr().(VariableAccess).getTarget() + or + ( + va = exp.(DeleteExpr).getExpr().getAPredecessor+().(Qualifier) or + va = exp.(DeleteExpr).getExpr().getAPredecessor+() + ) and + vr = exp.(DeleteExpr).getExpr().(VariableAccess).getTarget() + ) and + va.getEnclosingStmt() = exp.getEnclosingStmt() and + vro = va.getTarget() and + vr != vro + ) and + pointerDereference(cb, vr, vro) and + msg = + "it is possible to dereference a pointer when accessing a " + vr.getName() + + ", since it is possible to throw an exception before the memory for the " + vro.getName() + + " is allocated" + ) + or + exists(Expr exp, Variable vr | + ( + exp.(DeleteExpr).getEnclosingStmt().getParentStmt*() = cb and + vr = exp.(DeleteExpr).getExpr().(VariableAccess).getTarget() + or + exp.(DeleteArrayExpr).getEnclosingStmt().getParentStmt*() = cb and + vr = exp.(DeleteArrayExpr).getExpr().(VariableAccess).getTarget() + ) and + doubleCallDelete(_, cb, vr) and + msg = + "This allocation may have been released in the try block or a previous catch block." + + vr.getName() + ) + or + exists(Variable vro, Expr exp | + exp.getEnclosingStmt().getParentStmt*() = cb and + exists(VariableAccess va | + ( + va = exp.(DeleteArrayExpr).getExpr() or + va = exp.(DeleteExpr).getExpr() + ) and + va.getEnclosingStmt() = exp.getEnclosingStmt() and + vro = va.getTarget() + ) and + newThrowDelete(cb, vro) and + msg = + "If the allocation in the try block fails, then an unallocated pointer " + vro.getName() + + " will be freed in the catch block." + ) +select cb, msg diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.cpp b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.cpp new file mode 100644 index 00000000000..4928db37a17 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.cpp @@ -0,0 +1,10 @@ +... + r = scanf("%i", &i); + if (r == 1) // GOOD + return i; + else + return -1; +... + scanf("%i", &i); // BAD + return i; +... diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.qhelp new file mode 100644 index 00000000000..ab40910f5d3 --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.qhelp @@ -0,0 +1,27 @@ + + + +

    The `scanf` family functions does not require the memory pointed to by its additional pointer arguments to be initialized before calling. The user is required to check the return value of `scanf` and similar functions to establish how many of the additional arguments were assigned values. Not checking the return value and reading one of the arguments not assigned a value is undefined behavior and may have unexpected consequences.

    +
    + + +

    +The user should check the return value of `scanf` and related functions and check that any additional argument was assigned a value before reading the additional argument. +

    +
    + +

    The first first example below is correct, as value of `i` is only read once it is checked that `scanf` has read one item. The second example is incorrect, as the return value of `scanf` is not checked, and as `scanf` might have failed to read any item before returning.

    + + +
    + + +
  • + CERT C Coding Standard: + EXP12-C. Do not ignore values returned by functions. +
  • + +
    +
    diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.ql b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.ql new file mode 100644 index 00000000000..5f296752c1c --- /dev/null +++ b/cpp/ql/src/experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.ql @@ -0,0 +1,103 @@ +/** + * @name Improper check of return value of scanf + * @description Not checking the return value of scanf and related functions may lead to undefined behavior. + * @kind problem + * @id cpp/improper-check-return-value-scanf + * @problem.severity warning + * @precision medium + * @tags correctness + * security + * external/cwe/cwe-754 + * external/cwe/cwe-908 + */ + +import cpp +import semmle.code.cpp.commons.Exclusions + +/** Returns the position of the first argument being filled. */ +int posArgumentInFunctionCall(FunctionCall fc) { + ( + fc.getTarget().hasGlobalOrStdName(["scanf", "scanf_s"]) and + result = 1 + or + fc.getTarget().hasGlobalOrStdName(["fscanf", "sscanf", "fscanf_s", "sscanf_s"]) and + result = 2 + ) +} + +/** Holds if a function argument was not initialized but used after the call. */ +predicate argumentIsNotInitializedAndIsUsed(Variable vt, FunctionCall fc) { + // Fillable argument was not initialized. + vt instanceof LocalScopeVariable and + not vt.getAnAssignment().getASuccessor+() = fc and + ( + not vt.hasInitializer() + or + exists(Expr e, Variable v | + e = vt.getInitializer().getExpr() and + v = e.(AddressOfExpr).getOperand().(VariableAccess).getTarget() and + ( + not v.hasInitializer() and + not v.getAnAssignment().getASuccessor+() = fc + ) + ) + ) and + not exists(AssignExpr ae | + ae.getLValue() = vt.getAnAccess().getParent() and + ae.getASuccessor+() = fc + ) and + not exists(FunctionCall f0 | + f0.getAnArgument().getAChild() = vt.getAnAccess() and + f0.getASuccessor+() = fc + ) and + exists(Expr e0 | + // After the call, the completed arguments are assigned or returned as the result of the operation of the upper function. + fc.getASuccessor+() = e0 and + ( + ( + e0.(Assignment).getRValue().(VariableAccess).getTarget() = vt or + e0.(Assignment).getRValue().(ArrayExpr).getArrayBase().(VariableAccess).getTarget() = vt + ) + or + e0.getEnclosingStmt() instanceof ReturnStmt and + e0.(VariableAccess).getTarget() = vt + or + not exists(Expr e1 | + fc.getASuccessor+() = e1 and + e1.(VariableAccess).getTarget() = vt + ) + ) + ) +} + +from FunctionCall fc, int i +where + // Function return value is not evaluated. + fc instanceof ExprInVoidContext and + not isFromMacroDefinition(fc) and + i in [posArgumentInFunctionCall(fc) .. fc.getNumberOfArguments() - 1] and + ( + argumentIsNotInitializedAndIsUsed(fc.getArgument(i).(VariableAccess).getTarget(), fc) or + argumentIsNotInitializedAndIsUsed(fc.getArgument(i) + .(AddressOfExpr) + .getOperand() + .(VariableAccess) + .getTarget(), fc) or + argumentIsNotInitializedAndIsUsed(fc.getArgument(i) + .(ArrayExpr) + .getArrayBase() + .(VariableAccess) + .getTarget(), fc) + ) and + // After the call, filled arguments are not evaluated. + not exists(Expr e0, int i1 | + i1 in [posArgumentInFunctionCall(fc) .. fc.getNumberOfArguments() - 1] and + fc.getASuccessor+() = e0 and + e0.getEnclosingElement() instanceof ComparisonOperation and + ( + e0.(VariableAccess).getTarget() = fc.getArgument(i1).(VariableAccess).getTarget() or + e0.(VariableAccess).getTarget() = + fc.getArgument(i1).(AddressOfExpr).getOperand().(VariableAccess).getTarget() + ) + ) +select fc, "Unchecked return value for call to '" + fc.getTarget().getName() + "'." diff --git a/cpp/ql/src/external/CodeDuplication.qll b/cpp/ql/src/external/CodeDuplication.qll index 26fe883fc2f..e50323f7087 100644 --- a/cpp/ql/src/external/CodeDuplication.qll +++ b/cpp/ql/src/external/CodeDuplication.qll @@ -2,14 +2,14 @@ import cpp -private newtype TDuplicationOrSimilarity = MKDuplicationOrSimilarity() +deprecated private newtype TDuplicationOrSimilarity = MKDuplicationOrSimilarity() /** * DEPRECATED: This class is no longer used. * * A token block used for detection of duplicate and similar code. */ -class Copy extends TDuplicationOrSimilarity { +deprecated class Copy extends TDuplicationOrSimilarity { /** Gets the index of the token in this block starting at the location `loc`, if any. */ int tokenStartingAt(Location loc) { none() } @@ -63,7 +63,7 @@ class Copy extends TDuplicationOrSimilarity { * * A block of duplicated code. */ -class DuplicateBlock extends Copy { +deprecated class DuplicateBlock extends Copy { override string toString() { result = "Duplicate code: " + this.sourceLines() + " duplicated lines." } @@ -74,21 +74,29 @@ class DuplicateBlock extends Copy { * * A block of similar code. */ -class SimilarBlock extends Copy { +deprecated class SimilarBlock extends Copy { override string toString() { result = "Similar code: " + this.sourceLines() + " almost duplicated lines." } } -/** Gets a function with a body and a location. */ -FunctionDeclarationEntry sourceMethod() { +/** + * DEPRECATED: The `CodeDuplication` library will be removed in a future release. + * + * Gets a function with a body and a location. + */ +deprecated FunctionDeclarationEntry sourceMethod() { result.isDefinition() and exists(result.getLocation()) and numlines(unresolveElement(result.getFunction()), _, _, _) } -/** Gets the number of member functions in `c` with a body and a location. */ -int numberOfSourceMethods(Class c) { +/** + * DEPRECATED: The `CodeDuplication` library will be removed in a future release. + * + * Gets the number of member functions in `c` with a body and a location. + */ +deprecated int numberOfSourceMethods(Class c) { result = count(FunctionDeclarationEntry m | m = sourceMethod() and @@ -96,7 +104,7 @@ int numberOfSourceMethods(Class c) { ) } -private predicate blockCoversStatement(int equivClass, int first, int last, Stmt stmt) { +deprecated private predicate blockCoversStatement(int equivClass, int first, int last, Stmt stmt) { exists(DuplicateBlock b, Location loc | stmt.getLocation() = loc and first = b.tokenStartingAt(loc) and @@ -105,13 +113,13 @@ private predicate blockCoversStatement(int equivClass, int first, int last, Stmt ) } -private Stmt statementInMethod(FunctionDeclarationEntry m) { +deprecated private Stmt statementInMethod(FunctionDeclarationEntry m) { result.getParent+() = m.getBlock() and not result.getLocation() instanceof UnknownStmtLocation and not result instanceof BlockStmt } -private predicate duplicateStatement( +deprecated private predicate duplicateStatement( FunctionDeclarationEntry m1, FunctionDeclarationEntry m2, Stmt s1, Stmt s2 ) { exists(int equivClass, int first, int last | @@ -125,31 +133,39 @@ private predicate duplicateStatement( } /** + * DEPRECATED: Information on duplicated statements is no longer available. + * * Holds if `m1` is a function with `total` lines, and `m2` is a function * that has `duplicate` lines in common with `m1`. */ -predicate duplicateStatements( +deprecated predicate duplicateStatements( FunctionDeclarationEntry m1, FunctionDeclarationEntry m2, int duplicate, int total ) { duplicate = strictcount(Stmt s | duplicateStatement(m1, m2, s, _)) and total = strictcount(statementInMethod(m1)) } -/** Holds if `m` and other are identical functions. */ -predicate duplicateMethod(FunctionDeclarationEntry m, FunctionDeclarationEntry other) { +/** + * DEPRECATED: Information on duplicated methods is no longer available. + * + * Holds if `m` and other are identical functions. + */ +deprecated predicate duplicateMethod(FunctionDeclarationEntry m, FunctionDeclarationEntry other) { exists(int total | duplicateStatements(m, other, total, total)) } /** + * DEPRECATED: Information on similar lines is no longer available. + * * INTERNAL: do not use. * * Holds if `line` in `f` is similar to a line somewhere else. */ -predicate similarLines(File f, int line) { +deprecated predicate similarLines(File f, int line) { exists(SimilarBlock b | b.sourceFile() = f and line in [b.sourceStartLine() .. b.sourceEndLine()]) } -private predicate similarLinesPerEquivalenceClass(int equivClass, int lines, File f) { +deprecated private predicate similarLinesPerEquivalenceClass(int equivClass, int lines, File f) { lines = strictsum(SimilarBlock b, int toSum | (b.sourceFile() = f and b.getEquivalenceClass() = equivClass) and @@ -159,7 +175,7 @@ private predicate similarLinesPerEquivalenceClass(int equivClass, int lines, Fil ) } -private predicate similarLinesCoveredFiles(File f, File otherFile) { +deprecated private predicate similarLinesCoveredFiles(File f, File otherFile) { exists(int numLines | numLines = f.getMetrics().getNumberOfLines() | exists(int coveredApprox | coveredApprox = @@ -175,8 +191,12 @@ private predicate similarLinesCoveredFiles(File f, File otherFile) { ) } -/** Holds if `coveredLines` lines of `f` are similar to lines in `otherFile`. */ -predicate similarLinesCovered(File f, int coveredLines, File otherFile) { +/** + * DEPRECATED: Information on similar lines is no longer available. + * + * Holds if `coveredLines` lines of `f` are similar to lines in `otherFile`. + */ +deprecated predicate similarLinesCovered(File f, int coveredLines, File otherFile) { exists(int numLines | numLines = f.getMetrics().getNumberOfLines() | similarLinesCoveredFiles(f, otherFile) and exists(int notCovered | @@ -191,17 +211,19 @@ predicate similarLinesCovered(File f, int coveredLines, File otherFile) { } /** + * DEPRECATED: Information on duplicate lines is no longer available. + * * INTERNAL: do not use. * * Holds if `line` in `f` is duplicated by a line somewhere else. */ -predicate duplicateLines(File f, int line) { +deprecated predicate duplicateLines(File f, int line) { exists(DuplicateBlock b | b.sourceFile() = f and line in [b.sourceStartLine() .. b.sourceEndLine()] ) } -private predicate duplicateLinesPerEquivalenceClass(int equivClass, int lines, File f) { +deprecated private predicate duplicateLinesPerEquivalenceClass(int equivClass, int lines, File f) { lines = strictsum(DuplicateBlock b, int toSum | (b.sourceFile() = f and b.getEquivalenceClass() = equivClass) and @@ -211,8 +233,12 @@ private predicate duplicateLinesPerEquivalenceClass(int equivClass, int lines, F ) } -/** Holds if `coveredLines` lines of `f` are duplicates of lines in `otherFile`. */ -predicate duplicateLinesCovered(File f, int coveredLines, File otherFile) { +/** + * DEPRECATED: Information on duplicate lines is no longer available. + * + * Holds if `coveredLines` lines of `f` are duplicates of lines in `otherFile`. + */ +deprecated predicate duplicateLinesCovered(File f, int coveredLines, File otherFile) { exists(int numLines | numLines = f.getMetrics().getNumberOfLines() | exists(int coveredApprox | coveredApprox = @@ -236,8 +262,12 @@ predicate duplicateLinesCovered(File f, int coveredLines, File otherFile) { ) } -/** Holds if most of `f` (`percent`%) is similar to `other`. */ -predicate similarFiles(File f, File other, int percent) { +/** + * DEPRECATED: Information on similar files is no longer available. + * + * Holds if most of `f` (`percent`%) is similar to `other`. + */ +deprecated predicate similarFiles(File f, File other, int percent) { exists(int covered, int total | similarLinesCovered(f, covered, other) and total = f.getMetrics().getNumberOfLines() and @@ -247,8 +277,12 @@ predicate similarFiles(File f, File other, int percent) { not duplicateFiles(f, other, _) } -/** Holds if most of `f` (`percent`%) is duplicated by `other`. */ -predicate duplicateFiles(File f, File other, int percent) { +/** + * DEPRECATED: Information on duplicate files is no longer available. + * + * Holds if most of `f` (`percent`%) is duplicated by `other`. + */ +deprecated predicate duplicateFiles(File f, File other, int percent) { exists(int covered, int total | duplicateLinesCovered(f, covered, other) and total = f.getMetrics().getNumberOfLines() and @@ -258,10 +292,12 @@ predicate duplicateFiles(File f, File other, int percent) { } /** + * DEPRECATED: Information on duplciate classes is no longer available. + * * Holds if most member functions of `c` (`numDup` out of `total`) are * duplicates of member functions in `other`. */ -predicate mostlyDuplicateClassBase(Class c, Class other, int numDup, int total) { +deprecated predicate mostlyDuplicateClassBase(Class c, Class other, int numDup, int total) { numDup = strictcount(FunctionDeclarationEntry m1 | exists(FunctionDeclarationEntry m2 | @@ -277,11 +313,13 @@ predicate mostlyDuplicateClassBase(Class c, Class other, int numDup, int total) } /** + * DEPRECATED: Information on duplciate classes is no longer available. + * * Holds if most member functions of `c` are duplicates of member functions in * `other`. Provides the human-readable `message` to describe the amount of * duplication. */ -predicate mostlyDuplicateClass(Class c, Class other, string message) { +deprecated predicate mostlyDuplicateClass(Class c, Class other, string message) { exists(int numDup, int total | mostlyDuplicateClassBase(c, other, numDup, total) and ( @@ -305,21 +343,31 @@ predicate mostlyDuplicateClass(Class c, Class other, string message) { ) } -/** Holds if `f` and `other` are similar or duplicates. */ -predicate fileLevelDuplication(File f, File other) { +/** + * DEPRECATED: Information on file duplication is no longer available. + * + * Holds if `f` and `other` are similar or duplicates. + */ +deprecated predicate fileLevelDuplication(File f, File other) { similarFiles(f, other, _) or duplicateFiles(f, other, _) } /** + * DEPRECATED: Information on class duplication is no longer available. + * * Holds if most member functions of `c` are duplicates of member functions in * `other`. */ -predicate classLevelDuplication(Class c, Class other) { mostlyDuplicateClass(c, other, _) } +deprecated predicate classLevelDuplication(Class c, Class other) { + mostlyDuplicateClass(c, other, _) +} /** + * DEPRECATED: The CodeDuplication library will be removed in a future release. + * * Holds if `line` in `f` should be allowed to be duplicated. This is the case * for `#include` directives. */ -predicate whitelistedLineForDuplication(File f, int line) { +deprecated predicate whitelistedLineForDuplication(File f, int line) { exists(Include i | i.getFile() = f and i.getLocation().getStartLine() = line) } diff --git a/cpp/ql/src/external/DuplicateBlock.ql b/cpp/ql/src/external/DuplicateBlock.ql deleted file mode 100644 index 3fdef9b510d..00000000000 --- a/cpp/ql/src/external/DuplicateBlock.ql +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @deprecated - * @name Duplicate code - * @description This block of code is duplicated elsewhere. If possible, the shared code should be refactored so there is only one occurrence left. It may not always be possible to address these issues; other duplicate code checks (such as duplicate function, duplicate class) give subsets of the results with higher confidence. - * @kind problem - * @id cpp/duplicate-block - * @problem.severity recommendation - * @precision medium - * @tags testability - * maintainability - * duplicate-code - * non-attributable - */ - -import CodeDuplication - -from DuplicateBlock d, DuplicateBlock other, int lines, File otherFile, int otherLine -where - lines = d.sourceLines() and - lines > 10 and - other.getEquivalenceClass() = d.getEquivalenceClass() and - other != d and - otherFile = other.sourceFile() and - otherLine = other.sourceStartLine() -select d, - "Duplicate code: " + lines + " lines are duplicated at " + otherFile.getBaseName() + ":" + - otherLine diff --git a/cpp/ql/src/external/DuplicateFunction.qhelp b/cpp/ql/src/external/DuplicateFunction.qhelp deleted file mode 100644 index 8e81c11e5e6..00000000000 --- a/cpp/ql/src/external/DuplicateFunction.qhelp +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -

    A function should never be duplicated verbatim in several places in the code. Of course -the severity of this anti-pattern is higher for longer functions than for extremely short -functions of one or two statements, but there are usually better ways of achieving the same -effect.

    - -
    - -

    Code duplication in general is highly undesirable for a range of reasons: The artificially -inflated amount of code hinders comprehension, and ranges of similar but subtly different lines -can mask the real purpose or intention behind a function. There is also a risk of -update anomalies, where only one of several copies of the code is updated to address a defect or -add a feature.

    - -

    In the case of function duplication, how to address the issue depends on the functions themselves -and on the precise classes in which the duplication occurs. At its simplest, the duplication can -be addressed by removing all but one of the duplicate function definitions and making -callers of the removed functions refer to the (now canonical) single remaining definition -instead.

    - -

    This may not be possible for reasons of visibility or accessibility. A common example might -be where two classes implement the same functionality but neither is a subtype of the other, -so it is not possible to inherit a single function definition. In such cases, introducing a -common superclass to share the duplicated code is a viable option. Alternatively, if the functions -don't need access to private object state, they can be moved to a shared utility class that -just provides the functionality itself.

    - -
    - - -
  • Elmar Juergens, Florian Deissenboeck, Benjamin Hummel, and Stefan Wagner. 2009. -Do code clones matter? In Proceedings of the 31st International Conference on -Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, -485-495.
  • - -
    -
    diff --git a/cpp/ql/src/external/DuplicateFunction.ql b/cpp/ql/src/external/DuplicateFunction.ql deleted file mode 100644 index 1a861867fcb..00000000000 --- a/cpp/ql/src/external/DuplicateFunction.ql +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @deprecated - * @name Duplicate function - * @description There is another identical implementation of this function. Extract the code to a common file or superclass or delegate to improve sharing. - * @kind problem - * @id cpp/duplicate-function - * @problem.severity recommendation - * @precision medium - * @tags testability - * maintainability - * duplicate-code - * non-attributable - */ - -import cpp -import CodeDuplication - -predicate relevant(FunctionDeclarationEntry m) { - exists(Location loc | - loc = m.getBlock().getLocation() and - ( - loc.getStartLine() + 5 < loc.getEndLine() and not m.getName().matches("get%") - or - loc.getStartLine() + 10 < loc.getEndLine() - ) - ) -} - -from FunctionDeclarationEntry m, FunctionDeclarationEntry other -where - duplicateMethod(m, other) and - relevant(m) and - not m.getFunction().isConstructedFrom(_) and - not other.getFunction().isConstructedFrom(_) and - not fileLevelDuplication(m.getFile(), other.getFile()) and - not classLevelDuplication(m.getFunction().getDeclaringType(), - other.getFunction().getDeclaringType()) -select m, "Function " + m.getName() + " is duplicated at $@.", other, - other.getFile().getBaseName() + ":" + other.getLocation().getStartLine().toString() diff --git a/cpp/ql/src/external/MostlyDuplicateClass.qhelp b/cpp/ql/src/external/MostlyDuplicateClass.qhelp deleted file mode 100644 index 113eb6bf243..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateClass.qhelp +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -

    In cases where several methods are duplicated between two (or more) classes, -the classes themselves are highlighted as "mostly duplicate", rather than creating a large -number of method-level warnings. The same caveats apply here, too.

    - -
    - -

    Code duplication in general is highly undesirable for a range of reasons: The artificially -inflated amount of code hinders comprehension, and ranges of similar but subtly different lines -can mask the real purpose or intention behind a method. There's also an omnipresent risk of -update anomalies, where only one of several copies of the code is updated to address a defect or -add a feature.

    - -

    While completely duplicated classes are rare, they are usually a sign of a simple -oversight (or deliberate copy/paste) on a developer's part. Usually the required remedy -action is to remove all but one of them.

    - -

    It is far more common to see duplication of many methods between two classes, leaving just -a few that are actually different. Such situations warrant close inspection. Are the differences -deliberate or a result of an inconsistent update to one of the clones? If the latter, then -treating the classes as completely duplicate and eliminating all but one (while preserving any -corrections or new features that may have been introduced) is the best course. If two classes serve -genuinely different purposes but almost all of their methods are the same, that can be a sign -that there is a missing level of abstraction. Introducing a common superclass to define the -common methods and sharing the code is likely to prevent many problems in the long term.

    - -

    Modern IDEs may provide refactoring support for this sort of transformation, usually -under the names of "Pull up" or "Extract supertype".

    - -
    - - -
  • Elmar Juergens, Florian Deissenboeck, Benjamin Hummel, and Stefan Wagner. 2009. -Do code clones matter? In Proceedings of the 31st International Conference on -Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, -485-495.
  • - -
    -
    diff --git a/cpp/ql/src/external/MostlyDuplicateClass.ql b/cpp/ql/src/external/MostlyDuplicateClass.ql deleted file mode 100644 index 20b9f39214e..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateClass.ql +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @deprecated - * @name Mostly duplicate class - * @description More than 80% of the methods in this class are duplicated in another class. Create a common supertype to improve code sharing. - * @kind problem - * @id cpp/duplicate-class - * @problem.severity recommendation - * @precision medium - * @tags testability - * maintainability - * duplicate-code - * non-attributable - */ - -import cpp -import CodeDuplication - -from Class c, Class other, string message -where - mostlyDuplicateClass(c, other, message) and - not c.isConstructedFrom(_) and - not other.isConstructedFrom(_) and - not fileLevelDuplication(c.getFile(), _) -select c, message, other, other.getQualifiedName() diff --git a/cpp/ql/src/external/MostlyDuplicateFile.qhelp b/cpp/ql/src/external/MostlyDuplicateFile.qhelp deleted file mode 100644 index b3b319f346b..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateFile.qhelp +++ /dev/null @@ -1,46 +0,0 @@ - - - - - -

    In cases where most of a file's lines have been duplicated in one or more other -files, the files themselves are highlighted as "mostly duplicate", rather than -creating a large number of method-level or class-level warnings. The same caveats -apply here, too.

    - -
    - -

    Code duplication in general is highly undesirable for a range of reasons: The artificially -inflated amount of code hinders comprehension, and ranges of similar but subtly different lines -can mask the real purpose or intention behind a method. There's also an omnipresent risk of -update anomalies, where only one of several copies of the code is updated to address a defect or -add a feature.

    - -

    While completely duplicated files are rare, they are usually a sign of a simple -oversight (or deliberate copy/paste) on a developer's part. Usually the required remedy -action is to remove all but one of them. A common exception may arise from generated code -that simply occurs in several places in the source tree; the check can be adapted to -exclude such results.

    - -

    It is far more common to see duplication of many lines between two files, leaving just -a few that are actually different. Such situations warrant close inspection. Are the differences -deliberate or a result of an inconsistent update to one of the clones? If the latter, then -treating the files as completely duplicate and eliminating all but one (while preserving any -corrections or new features that may have been introduced) is the best course. If two files serve -genuinely different purposes but almost all of their lines are the same, that can be a sign -that there is a missing level of abstraction. Look for ways to share the functionality, either -by extracting a utility class for parts of it or by encapsulating the common parts into a new -super class of any classes involved.

    - -
    - - -
  • Elmar Juergens, Florian Deissenboeck, Benjamin Hummel, and Stefan Wagner. 2009. -Do code clones matter? In Proceedings of the 31st International Conference on -Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, -485-495.
  • - -
    -
    diff --git a/cpp/ql/src/external/MostlyDuplicateFile.ql b/cpp/ql/src/external/MostlyDuplicateFile.ql deleted file mode 100644 index 8cb23a432d2..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateFile.ql +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @deprecated - * @name Mostly duplicate file - * @description There is another file that shares a lot of the code with this file. Merge the two files to improve maintainability. - * @kind problem - * @id cpp/duplicate-file - * @problem.severity recommendation - * @precision medium - * @tags testability - * maintainability - * duplicate-code - * non-attributable - */ - -import cpp -import CodeDuplication - -from File f, File other, int percent -where duplicateFiles(f, other, percent) -select f, percent + "% of the lines in " + f.getBaseName() + " are copies of lines in $@.", other, - other.getBaseName() diff --git a/cpp/ql/src/external/MostlyDuplicateFunction.qhelp b/cpp/ql/src/external/MostlyDuplicateFunction.qhelp deleted file mode 100644 index a981eef6e87..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateFunction.qhelp +++ /dev/null @@ -1,55 +0,0 @@ - - - - -

    A "mostly duplicate function" is a function for which there is at least one -almost exact duplicate somewhere else in the code, but for which there are no -exact duplicates. There will be minor typographical differences between this -function and any "mostly duplicate function" to which it corresponds (for -example, comments and small code changes), preventing an exact match. Pairs of -such functions are sometimes referred to as "similar".

    - -

    This class of problem can often be more insidious than mere duplication, because the two -implementations have diverged. This may be on purpose (when a function is copy-and-pasted -and adapted to a new context) or accidentally (when a correction is only introduced in one of -several identical pieces of code), and to address the problem one needs to understand which -of the two situations applies.

    - -
    - -

    Code duplication in general is highly undesirable for a range of reasons: The artificially -inflated amount of code hinders comprehension, and ranges of similar but subtly different lines -can mask the real purpose or intention behind a function. There's also a risk of -update anomalies, where only one of several copies of the code is updated to address a defect or -add a feature.

    - -

    In the case of function similarity, how to address the issue depends on the functions -themselves and on the precise classes in which they occur. At its simplest, if the differences -are accidental, the problem can be addressed by unifying the functions to behave identically. -Then, we can remove all but one of the duplicate function definitions and make -callers of the removed functions refer to the (now canonical) single remaining definition -instead.

    - -

    In more complex cases, look for ways of encapsulating the commonality and sharing it while -retaining the differences in functionality. Perhaps the function can be moved to a single place -and given an additional parameter, allowing it to cover all use cases? Alternatively, there -may be a common preprocessing or postprocessing step which can be extracted to its own (shared) -function, leaving only the specific parts in the existing functions.

    - -

    Modern IDEs may provide refactoring support for this sort of transformation. Relevant -refactorings might be "Extract function", "Change function signature", "Pull up" or "Extract -supertype".

    - -
    - - -
  • Elmar Juergens, Florian Deissenboeck, Benjamin Hummel, and Stefan Wagner. 2009. -Do code clones matter? In Proceedings of the 31st International Conference on -Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, -485-495.
  • - - -
    -
    diff --git a/cpp/ql/src/external/MostlyDuplicateFunction.ql b/cpp/ql/src/external/MostlyDuplicateFunction.ql deleted file mode 100644 index 8a7454e4c97..00000000000 --- a/cpp/ql/src/external/MostlyDuplicateFunction.ql +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @deprecated - * @name Mostly duplicate function - * @description There is another function that shares a lot of the code with this one. Extract the code to a common file/superclass or delegate to improve sharing. - * @kind problem - * @id cpp/mostly-duplicate-function - * @problem.severity recommendation - * @precision medium - * @tags testability - * duplicate-code - * non-attributable - */ - -import cpp -import CodeDuplication - -from FunctionDeclarationEntry m, int covered, int total, FunctionDeclarationEntry other, int percent -where - duplicateStatements(m, other, covered, total) and - covered != total and - total > 5 and - covered * 100 / total = percent and - percent > 80 and - not m.getFunction().isConstructedFrom(_) and - not other.getFunction().isConstructedFrom(_) and - not duplicateMethod(m, other) and - not classLevelDuplication(m.getFunction().getDeclaringType(), - other.getFunction().getDeclaringType()) and - not fileLevelDuplication(m.getFile(), other.getFile()) -select m, percent + "% of the statements in " + m.getName() + " are duplicated in $@.", other, - other.getFunction().getQualifiedName() diff --git a/cpp/ql/src/external/MostlySimilarFile.qhelp b/cpp/ql/src/external/MostlySimilarFile.qhelp deleted file mode 100644 index e1a41a16321..00000000000 --- a/cpp/ql/src/external/MostlySimilarFile.qhelp +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -

    Two lines are defined as similar if they are either identical or contain only very minor -differences. In cases where most of the lines in a file have corresponding "similar" lines in another file, -the files themselves are highlighted as "mostly similar", instead of creating a large number of method-level or class-level -warnings. The same caveats apply here, too.

    - -
    - -

    Code duplication in general is highly undesirable for a range of reasons: The artificially -inflated amount of code hinders comprehension, and ranges of similar but subtly different lines -can mask the real purpose or intention behind a method. There's also an omnipresent risk of -update anomalies, where only one of several copies of the code is updated to address a defect or -add a feature.

    - -

    With files that are marked as mostly similar, special care should be taken. Why are -they almost the same, and why are there differences? If the differences are accidental (for -example from corrections that were only applied to one copy), then unifying the files and removing -all but one is the best thing to do. If the files have genuinely different tasks, it is worth -thinking about the reasons for the similarity. Can some of the shared code be extracted into -methods (perhaps with additional parameters, to cover the differences in behavior)? Should it -be moved into a utility class or file that is accessible to all current implementations, or -should a new level of abstraction be introduced?

    - -
    - - -
  • Elmar Juergens, Florian Deissenboeck, Benjamin Hummel, and Stefan Wagner. 2009. -Do code clones matter? In Proceedings of the 31st International Conference on -Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, -485-495.
  • - -
    -
    diff --git a/cpp/ql/src/external/MostlySimilarFile.ql b/cpp/ql/src/external/MostlySimilarFile.ql deleted file mode 100644 index 81a6ed02d6c..00000000000 --- a/cpp/ql/src/external/MostlySimilarFile.ql +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @deprecated - * @name Mostly similar file - * @description There is another file that shares a lot of the code with this file. Notice that names of variables and types may have been changed. Merge the two files to improve maintainability. - * @kind problem - * @id cpp/similar-file - * @problem.severity recommendation - * @precision medium - * @tags testability - * maintainability - * duplicate-code - * non-attributable - */ - -import cpp -import CodeDuplication - -from File f, File other, int percent -where similarFiles(f, other, percent) -select f, percent + "% of the lines in " + f.getBaseName() + " are similar to lines in $@.", other, - other.getBaseName() diff --git a/cpp/ql/src/jsf/4.05 Libraries/AV Rule 23.ql b/cpp/ql/src/jsf/4.05 Libraries/AV Rule 23.ql index 9bb63cb6b29..ff4b1baec76 100644 --- a/cpp/ql/src/jsf/4.05 Libraries/AV Rule 23.ql +++ b/cpp/ql/src/jsf/4.05 Libraries/AV Rule 23.ql @@ -13,7 +13,7 @@ import cpp from Function f where - f.getName().regexpMatch("atof|atoi|atol") and + f.getName() = ["atof", "atoi", "atol"] and f.getFile().getAbsolutePath().matches("%stdlib.h") select f.getACallToThisFunction(), "AV Rule 23: The library functions atof, atoi and atol from library shall not be used." diff --git a/cpp/ql/src/jsf/4.05 Libraries/AV Rule 24.ql b/cpp/ql/src/jsf/4.05 Libraries/AV Rule 24.ql index 9e0fd1d5de8..3bf27d8121c 100644 --- a/cpp/ql/src/jsf/4.05 Libraries/AV Rule 24.ql +++ b/cpp/ql/src/jsf/4.05 Libraries/AV Rule 24.ql @@ -13,7 +13,7 @@ import cpp from Function f where - f.getName().regexpMatch("abort|exit|getenv|system") and + f.getName() = ["abort", "exit", "getenv", "system"] and f.getFile().getAbsolutePath().matches("%stdlib.h") select f.getACallToThisFunction(), "The library functions abort, exit, getenv and system from library should not be used." diff --git a/cpp/ql/src/jsf/4.10 Classes/AV Rule 97.ql b/cpp/ql/src/jsf/4.10 Classes/AV Rule 97.ql index 872a7443e6e..58b83e4bd13 100644 --- a/cpp/ql/src/jsf/4.10 Classes/AV Rule 97.ql +++ b/cpp/ql/src/jsf/4.10 Classes/AV Rule 97.ql @@ -27,13 +27,13 @@ predicate containsArray(Type t) { ) } -predicate functionAPIViolation(MemberFunction f) { +predicate functionApiViolation(MemberFunction f) { f.isPublic() and containsArray(f.getAParameter().getType()) } from MemberFunction m where - functionAPIViolation(m) and + functionApiViolation(m) and not m.getDeclaringType() instanceof Struct select m, "Raw arrays should not be used in interfaces. A container class should be used instead." diff --git a/cpp/ql/src/jsf/4.24 Control Flow Structures/AV Rule 186.ql b/cpp/ql/src/jsf/4.24 Control Flow Structures/AV Rule 186.ql index ed713c4b109..4c1f8cfdd7f 100644 --- a/cpp/ql/src/jsf/4.24 Control Flow Structures/AV Rule 186.ql +++ b/cpp/ql/src/jsf/4.24 Control Flow Structures/AV Rule 186.ql @@ -12,13 +12,13 @@ import cpp // whether f is to be considered an API entry point, and hence reachable by default -predicate isAPI(Function f) { +predicate isApi(Function f) { f.hasName("main") or f.(MemberFunction).hasSpecifier("public") } predicate unusedFunction(Function f) { - not isAPI(f) and + not isApi(f) and not exists(FunctionCall c | c.getTarget() = f) and not exists(Access acc | acc.getTarget() = f) and f.hasDefinition() diff --git a/cpp/ql/src/printAst.ql b/cpp/ql/src/printAst.ql index f800fa3be3e..ae6b3052ec7 100644 --- a/cpp/ql/src/printAst.ql +++ b/cpp/ql/src/printAst.ql @@ -16,7 +16,7 @@ import definitions */ external string selectedSourceFile(); -class Cfg extends PrintASTConfiguration { +class Cfg extends PrintAstConfiguration { /** * Holds if the AST for `func` should be printed. * Print All functions from the selected file. diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index ca4d832566f..b31a20cb12a 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.0.10-dev +version: 0.1.3-dev groups: - cpp - queries diff --git a/cpp/ql/test/TestUtilities/InlineExpectationsTest.qll b/cpp/ql/test/TestUtilities/InlineExpectationsTest.qll index 7d605a491ee..3891fcf13a1 100644 --- a/cpp/ql/test/TestUtilities/InlineExpectationsTest.qll +++ b/cpp/ql/test/TestUtilities/InlineExpectationsTest.qll @@ -124,7 +124,9 @@ abstract class InlineExpectationsTest extends string { abstract predicate hasActualResult(Location location, string element, string tag, string value); /** - * Like `hasActualResult`, but returns results that do not require a matching annotation. + * Holds if there is an optional result on the specified location. + * + * This is similar to `hasActualResult`, but returns results that do not require a matching annotation. * A failure will still arise if there is an annotation that does not match any results, but not vice versa. * Override this predicate to specify optional results. */ @@ -179,7 +181,7 @@ private string expectationCommentPattern() { result = "\\s*\\$((?:[^/]|/[^/])*)( /** * The possible columns in an expectation comment. The `TDefaultColumn` branch represents the first * column in a comment. This column is not precedeeded by a name. `TNamedColumn(name)` represents a - * column containing expected results preceeded by the string `name:`. + * column containing expected results preceded by the string `name:`. */ private newtype TColumn = TDefaultColumn() or diff --git a/cpp/ql/test/TestUtilities/dataflow/FlowTestCommon.qll b/cpp/ql/test/TestUtilities/dataflow/FlowTestCommon.qll index 87602ef0e4c..5841412331d 100644 --- a/cpp/ql/test/TestUtilities/dataflow/FlowTestCommon.qll +++ b/cpp/ql/test/TestUtilities/dataflow/FlowTestCommon.qll @@ -42,8 +42,8 @@ class IRFlowTest extends InlineExpectationsTest { } } -class ASTFlowTest extends InlineExpectationsTest { - ASTFlowTest() { this = "ASTFlowTest" } +class AstFlowTest extends InlineExpectationsTest { + AstFlowTest() { this = "ASTFlowTest" } override string getARelevantTag() { result = "ast" } @@ -69,3 +69,6 @@ class ASTFlowTest extends InlineExpectationsTest { ) } } + +/** DEPRECATED: Alias for AstFlowTest */ +deprecated class ASTFlowTest = AstFlowTest; diff --git a/cpp/ql/test/examples/expressions/PrintAST.expected b/cpp/ql/test/examples/expressions/PrintAST.expected index eb81accc996..68ade61e255 100644 --- a/cpp/ql/test/examples/expressions/PrintAST.expected +++ b/cpp/ql/test/examples/expressions/PrintAST.expected @@ -128,7 +128,7 @@ ConstructorCall.cpp: # 1| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] C && -# 3| [ConversionConstructor] void C::C(int) +# 3| [Constructor] void C::C(int) # 3| : # 3| getParameter(0): [Parameter] i # 3| Type = [IntType] int diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.expected new file mode 100644 index 00000000000..ffb7941f1cd --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.expected @@ -0,0 +1 @@ +| test.cpp:14:16:14:16 | p | unsafe_put_user write user-mode pointer $@ without check. | test.cpp:14:16:14:16 | p | p | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.qlref new file mode 100644 index 00000000000..a4543b332dd --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/NoCheckBeforeUnsafePutUser.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/test.cpp new file mode 100644 index 00000000000..755a73864c7 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-020/NoCheckBeforeUnsafePutUser/test.cpp @@ -0,0 +1,82 @@ + +typedef unsigned long size_t; + +void SYSC_SOMESYSTEMCALL(void *param); + +bool user_access_begin_impl(const void *where, size_t sz); +void user_access_end_impl(); +#define user_access_begin(where, sz) user_access_begin_impl(where, sz) +#define user_access_end() user_access_end_impl() + +void unsafe_put_user_impl(int what, const void *where, size_t sz); +#define unsafe_put_user(what, where) unsafe_put_user_impl( (what), (where), sizeof(*(where)) ) + +void test1(int p) +{ + SYSC_SOMESYSTEMCALL(&p); + + unsafe_put_user(123, &p); // BAD +} + +void test2(int p) +{ + SYSC_SOMESYSTEMCALL(&p); + + if (user_access_begin(&p, sizeof(p))) + { + unsafe_put_user(123, &p); // GOOD + + user_access_end(); + } +} + +void test3() +{ + int v; + + SYSC_SOMESYSTEMCALL(&v); + + unsafe_put_user(123, &v); // BAD [NOT DETECTED] +} + +void test4() +{ + int v; + + SYSC_SOMESYSTEMCALL(&v); + + if (user_access_begin(&v, sizeof(v))) + { + unsafe_put_user(123, &v); // GOOD + + user_access_end(); + } +} + +struct data +{ + int x; +}; + +void test5() +{ + data myData; + + SYSC_SOMESYSTEMCALL(&myData); + + unsafe_put_user(123, &(myData.x)); // BAD [NOT DETECTED] +} + +void test6() +{ + data myData; + + SYSC_SOMESYSTEMCALL(&myData); + + if (user_access_begin(&myData, sizeof(myData))) + { + unsafe_put_user(123, &(myData.x)); // GOOD + + user_access_end(); + } +} diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.expected new file mode 100644 index 00000000000..dd37faf2d56 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.expected @@ -0,0 +1,4 @@ +| test.cpp:9:8:9:12 | ... * ... | Possible signed overflow followed by offset of the pointer out of bounds. | +| test.cpp:13:24:13:28 | ... * ... | This transformation is applied after multiplication. | +| test.cpp:16:28:16:32 | ... * ... | This transformation is applied after multiplication. | +| test.cpp:19:22:19:26 | ... * ... | This transformation is applied after multiplication. | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.qlref new file mode 100644 index 00000000000..84f717acda7 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/DangerousUseOfTransformationAfterOperation.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/test.cpp new file mode 100644 index 00000000000..472c8ac0afa --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation/test.cpp @@ -0,0 +1,23 @@ +void testCall (unsigned long); +void functionWork(char aA[10],unsigned int aUI) { + + unsigned long aL; + char *aP; + int aI; + + aI = (aUI*8)/10; // GOOD + aI = aUI*8; // BAD + aP = aA+aI; + aI = (int)aUI*8; // GOOD + + aL = (unsigned long)(aI*aI); // BAD + aL = ((unsigned long)aI*aI); // GOOD + + testCall((unsigned long)(aI*aI)); // BAD + testCall(((unsigned long)aI*aI)); // GOOD + + if((unsigned long)(aI*aI) > aL) // BAD + return; + if(((unsigned long)aI*aI) > aL) // GOOD + return; +} diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.expected new file mode 100644 index 00000000000..0e9e0870680 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.expected @@ -0,0 +1 @@ +| test.cpp:12:8:12:12 | call to fopen | You may have forgotten to restrict access rights when working with a file. | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.qlref new file mode 100644 index 00000000000..0fa00ffe3ab --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/ExposureSensitiveInformationUnauthorizedActor.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/test.cpp new file mode 100644 index 00000000000..6323d617ff1 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test1/test.cpp @@ -0,0 +1,17 @@ +typedef int FILE; +FILE *fopen(const char *filename, const char *mode); +int umask(int pmode); +int chmod(char * filename,int pmode); +int fprintf(FILE *fp,const char *fmt, ...); +int fclose(FILE *stream); + +int main(int argc, char *argv[]) +{ + //umask(0022); + FILE *fp; + fp = fopen("myFile.txt","w"); // BAD + //chmod("myFile.txt",0644); + fprintf(fp,"%s\n","data to file"); + fclose(fp); + return 0; +} diff --git a/python/ql/test/experimental/dataflow/ApiGraphs/awaited.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/ExposureSensitiveInformationUnauthorizedActor.expected similarity index 100% rename from python/ql/test/experimental/dataflow/ApiGraphs/awaited.expected rename to cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/ExposureSensitiveInformationUnauthorizedActor.expected diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/ExposureSensitiveInformationUnauthorizedActor.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/ExposureSensitiveInformationUnauthorizedActor.qlref new file mode 100644 index 00000000000..0fa00ffe3ab --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/ExposureSensitiveInformationUnauthorizedActor.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/test.cpp new file mode 100644 index 00000000000..27a86d49937 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test2/test.cpp @@ -0,0 +1,17 @@ +typedef int FILE; +FILE *fopen(const char *filename, const char *mode); +int umask(int pmode); +int chmod(char * filename,int pmode); +int fprintf(FILE *fp,const char *fmt, ...); +int fclose(FILE *stream); + +int main(int argc, char *argv[]) +{ + umask(0022); + FILE *fp; + fp = fopen("myFile.txt","w"); // GOOD + chmod("myFile.txt",0644); + fprintf(fp,"%s\n","data to file"); + fclose(fp); + return 0; +} diff --git a/python/ql/test/experimental/dataflow/ApiGraphs/use.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/ExposureSensitiveInformationUnauthorizedActor.expected similarity index 100% rename from python/ql/test/experimental/dataflow/ApiGraphs/use.expected rename to cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/ExposureSensitiveInformationUnauthorizedActor.expected diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/ExposureSensitiveInformationUnauthorizedActor.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/ExposureSensitiveInformationUnauthorizedActor.qlref new file mode 100644 index 00000000000..0fa00ffe3ab --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/ExposureSensitiveInformationUnauthorizedActor.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-200/ExposureSensitiveInformationUnauthorizedActor.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/test.cpp new file mode 100644 index 00000000000..cadf28ca6ec --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-200/test3/test.cpp @@ -0,0 +1,18 @@ +typedef int FILE; +FILE *fopen(const char *filename, const char *mode); +int umask(int pmode); +int chmod(char * filename,int pmode); +int fprintf(FILE *fp,const char *fmt, ...); +char *fgets(char *str, int num, FILE *stream); +int fclose(FILE *stream); + +int main(int argc, char *argv[]) +{ + FILE *fp; + char buf[128]; + fp = fopen("myFile.txt","r+"); // BAD [NOT DETECTED] + fgets(buf,128,fp); + fprintf(fp,"%s\n","data to file"); + fclose(fp); + return 0; +} diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.expected new file mode 100644 index 00000000000..af34f888df2 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.expected @@ -0,0 +1 @@ +| test.cpp:29:11:29:26 | call to pam_authenticate | This PAM authentication call may be lead to an authorization bypass. | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.qlref new file mode 100644 index 00000000000..f1135f7d536 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/PamAuthorization.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-285/PamAuthorization.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/test.cpp new file mode 100644 index 00000000000..e2753f10775 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-285/test.cpp @@ -0,0 +1,59 @@ +#include "../../../../../library-tests/dataflow/taint-tests/stl.h" + +using namespace std; + +#define PAM_SUCCESS 1 + +typedef struct pam_handle +{ +}; +int pam_start(std::string servicename, std::string username, int a, struct pam_handle **); +int pam_authenticate(struct pam_handle *, int e); +int pam_acct_mgmt(struct pam_handle *, int e); + +bool PamAuthBad(const std::string &username_in, + const std::string &password_in, + std::string &authenticated_username) +{ + + struct pam_handle *pamh = nullptr; /* pam session handle */ + + const char *username = username_in.c_str(); + int err = pam_start("test", username, + 0, &pamh); + if (err != PAM_SUCCESS) + { + return false; + } + + err = pam_authenticate(pamh, 0); + if (err != PAM_SUCCESS) + return err; + + return true; +} + +bool PamAuthGood(const std::string &username_in, + const std::string &password_in, + std::string &authenticated_username) +{ + + struct pam_handle *pamh = nullptr; /* pam session handle */ + + const char *username = username_in.c_str(); + int err = pam_start("test", username, + 0, &pamh); + if (err != PAM_SUCCESS) + { + return false; + } + + err = pam_authenticate(pamh, 0); + if (err != PAM_SUCCESS) + return err; + + err = pam_acct_mgmt(pamh, 0); + if (err != PAM_SUCCESS) + return err; + return true; +} diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/InsecureTemporaryFile.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/InsecureTemporaryFile.expected index b0632edcd2a..545b301922a 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/InsecureTemporaryFile.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/InsecureTemporaryFile.expected @@ -1,2 +1 @@ | test.cpp:16:20:16:25 | call to tmpnam | Finding the name of a file that does not exist does not mean that it will not be exist at the next operation. | -| test.cpp:42:8:42:12 | call to fopen | Creating a file for writing without evaluating its existence and setting permissions can be unsafe. | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/test.cpp index ceffdf11fa9..07efea49e78 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/test.cpp +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-377/semmle/tests/test.cpp @@ -39,7 +39,7 @@ int funcTest3() FILE *fp; char filename[80]; strcat(filename, "/tmp/tmp.name"); - fp = fopen(filename,"w"); // BAD + fp = fopen(filename,"w"); // BAD [NOT DETECTED] fprintf(fp,"%s\n","data to file"); fclose(fp); return 0; diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.expected new file mode 100644 index 00000000000..728a9e8b3d5 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.expected @@ -0,0 +1,8 @@ +| test.cpp:63:3:71:3 | { ... } | If the allocation in the try block fails, then an unallocated pointer bufMyData will be freed in the catch block. | +| test.cpp:63:3:71:3 | { ... } | If the allocation in the try block fails, then an unallocated pointer buffer will be freed in the catch block. | +| test.cpp:63:3:71:3 | { ... } | it is possible to dereference a pointer when accessing a buffer, since it is possible to throw an exception before the memory for the bufMyData is allocated | +| test.cpp:91:3:100:3 | { ... } | If the allocation in the try block fails, then an unallocated pointer buffer will be freed in the catch block. | +| test.cpp:120:3:128:3 | { ... } | If the allocation in the try block fails, then an unallocated pointer buffer will be freed in the catch block. | +| test.cpp:143:3:151:3 | { ... } | If the allocation in the try block fails, then an unallocated pointer buffer will be freed in the catch block. | +| test.cpp:181:3:183:3 | { ... } | This allocation may have been released in the try block or a previous catch block.valData | +| test.cpp:219:3:221:3 | { ... } | This allocation may have been released in the try block or a previous catch block.valData | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.qlref new file mode 100644 index 00000000000..c67adb8774b --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/DangerousUseOfExceptionBlocks.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-476/DangerousUseOfExceptionBlocks.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/test.cpp new file mode 100644 index 00000000000..de0be1efff2 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-476/semmle/tests/test.cpp @@ -0,0 +1,255 @@ +#define NULL ((void*)0) +typedef unsigned long size_t; +namespace std { + enum class align_val_t : size_t {}; +} + +class exception {}; + +void cleanFunction(); + +void* operator new(size_t, float); +void* operator new[](size_t, float); +void* operator new(size_t, std::align_val_t, float); +void* operator new[](size_t, std::align_val_t, float); +void operator delete(void*, float); +void operator delete[](void*, float); +void operator delete(void*, std::align_val_t, float); +void operator delete[](void*, std::align_val_t, float); + +struct myData +{ + int sizeInt; + char* buffer; +}; + +struct myGlobalData +{ + int sizeInt; + myData** bufMyData; +}; + +void allocData(myData ** bufMyData) { + for (size_t i = 0; i < 10; i++) + { + bufMyData[i] = new myData; + bufMyData[i]->sizeInt = 10; + bufMyData[i]->buffer = new char[10]; + } +} + + +void throwFunction(int a) { + if (a == 5) throw "my exception!"; +} +void throwFunction2(int a) { + if (a == 5) throw exception(); +} +void funcWork1b() { + int a; + myData **bufMyData; + + try { + cleanFunction(); + throwFunction(a); + + bufMyData = new myData*[10]; + cleanFunction(); + allocData(bufMyData); + cleanFunction(); + + } + catch (...) + { + for (size_t i = 0; i < 10; i++) + { + delete[] bufMyData[i]->buffer; // BAD + delete bufMyData[i]; + } + delete [] bufMyData; + + } +} + +void funcWork1() { + int a; + int i; + myData **bufMyData; + + bufMyData = new myData*[10]; + for (i = 0; i < 10; i++) + bufMyData[i] = 0; + try { + cleanFunction(); + throwFunction(a); + cleanFunction(); + allocData(bufMyData); + cleanFunction(); + + } + catch (...) + { + for (size_t i = 0; i < 10; i++) + { + if (bufMyData[i]) + delete[] bufMyData[i]->buffer; // BAD + delete bufMyData[i]; + } + delete [] bufMyData; + + } +} + +void funcWork2() { + int a; + myData **bufMyData; + + bufMyData = new myData*[10]; + try { + do { + cleanFunction(); + allocData(bufMyData); + cleanFunction(); + throwFunction(a); + + } + while(0); + + } + catch (...) + { + for (size_t i = 0; i < 10; i++) + { + delete[] bufMyData[i]->buffer; // BAD + delete bufMyData[i]; + } + delete [] bufMyData; + + } +} +void funcWork3() { + int a; + myData **bufMyData; + + bufMyData = new myData*[10]; + try { + cleanFunction(); + allocData(bufMyData); + cleanFunction(); + throwFunction(a); + + } + catch (...) + { + for (size_t i = 0; i < 10; i++) + { + delete[] bufMyData[i]->buffer; // BAD + delete bufMyData[i]; + } + delete [] bufMyData; + + } +} + + +void funcWork4() { + int a; + myGlobalData *valData = 0; + try { + valData = new myGlobalData; + cleanFunction(); + delete valData; + valData = 0; + throwFunction(a); + } + catch (...) + { + delete valData; // GOOD + } +} + +void funcWork4b() { + int a; + myGlobalData *valData = 0; + try { + valData = new myGlobalData; + cleanFunction(); + delete valData; + throwFunction(a); + } + catch (...) + { + delete valData; // BAD + } +} +void funcWork5() { + int a; + myGlobalData *valData = 0; + try { + valData = new myGlobalData; + cleanFunction(); + delete valData; + valData = 0; + throwFunction2(a); + } + catch (const exception &) { + delete valData; + valData = 0; + throw; + } + catch (...) + { + delete valData; // GOOD + } +} + +void funcWork5b() { + int a; + myGlobalData *valData = 0; + try { + valData = new myGlobalData; + cleanFunction(); + throwFunction2(a); + } + catch (const exception &) { + delete valData; + throw; + } + catch (...) + { + delete valData; // BAD + } +} +void funcWork6() { + int a; + int flagB = 0; + myGlobalData *valData = 0; + try { + valData = new myGlobalData; + cleanFunction(); + throwFunction2(a); + } + catch (const exception &) { + delete valData; + flagB = 1; + throw; + } + catch (...) + { + if(flagB == 0) + delete valData; // GOOD + } +} + +void runnerFunc() +{ + funcWork1(); + funcWork1b(); + funcWork2(); + funcWork3(); + funcWork4(); + funcWork4b(); + funcWork5(); + funcWork5b(); + funcWork6(); +} diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.expected new file mode 100644 index 00000000000..85a929ed39c --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.expected @@ -0,0 +1,8 @@ +| test.cpp:52:3:52:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:53:3:53:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:54:3:54:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:105:3:105:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:106:3:106:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:107:3:107:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:115:3:115:7 | call to scanf | Unchecked return value for call to 'scanf'. | +| test.cpp:120:3:120:7 | call to scanf | Unchecked return value for call to 'scanf'. | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.qlref new file mode 100644 index 00000000000..f0cb9dd57c1 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/ImproperCheckReturnValueScanf.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-754/ImproperCheckReturnValueScanf.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/test.cpp new file mode 100644 index 00000000000..b9608b757b9 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-754/semmle/tests/test.cpp @@ -0,0 +1,129 @@ +int scanf(const char *format, ...); +int sscanf(const char *str, const char *format, ...); +int globalVal; +char * globalVala; +int * globalValp; +char globalVala2; +int functionWork1(int retIndex) { + int i; + char a[10]; + int b; + int *p = &b; + if (scanf("%i", &i) != 1) // GOOD + return -1; + if (scanf("%s", a) != 1) // GOOD + return -1; + if (scanf("%i", p) != 1) // GOOD + return -1; + if(retIndex == 0) + return (int)*a; + if(retIndex == 1) + return *p; + return i; +} + +int functionWork1_(int retIndex) { + int i; + char a[10]; + int b; + int *p = &b; + int r; + r = scanf("%i", &i); + if (r != 1) // GOOD + return -1; + r = scanf("%s", a); + if (r == 1) // GOOD + return -1; + r = scanf("%i", p); + if (r != 1) // GOOD + return -1; + if(retIndex == 0) + return (int)*a; + if(retIndex == 1) + return *p; + return i; +} + +int functionWork1b(int retIndex) { + int i; + char a[10]; + int b; + int *p = &b; + scanf("%i", &i); // BAD + scanf("%s", a); // BAD + scanf("%i", p); // BAD + if(retIndex == 0) + return (int)*a; + if(retIndex == 1) + return *p; + return i; +} +int functionWork1_() { + int i; + scanf("%i",&i); // BAD [NOT DETECTED] + if(i<10) + return -1; + return i; +} +int functionWork2(int retIndex) { + int i = 0; + char a[10] = ""; + int b = 1; + int *p = &b; + scanf("%i", &i); // GOOD:Argument initialized even when scanf fails. + scanf("%s", a); // GOOD:Argument initialized even when scanf fails. + scanf("%i", p); // GOOD:Argument initialized even when scanf fails. + if(retIndex == 0) + return (int)*a; + if(retIndex == 1) + return *p; + return i; +} + +int functionWork2_(int retIndex) { + int i; + i = 0; + char a[10]; + a[0] = '\0'; + int b; + b=1; + int *p = &b; + scanf("%i", &i); // GOOD:Argument initialized even when scanf fails. + scanf("%s", a); // GOOD:Argument initialized even when scanf fails. + scanf("%i", p); // GOOD:Argument initialized even when scanf fails. + if(retIndex == 0) + return (int)*a; + if(retIndex == 1) + return *p; + return i; +} +int functionWork2b() { + int i; + char a[10]; + int b; + int *p = &b; + scanf("%i", &i); // BAD + scanf("%s", a); // BAD + scanf("%i", p); // BAD + globalVal = i; + globalVala = a; + globalValp = p; + return 0; +} +int functionWork2b_() { + char a[10]; + scanf("%s", a); // BAD + globalVala2 = a[0]; + return 0; +} +int functionWork3b(int * i) { + scanf("%i", i); // BAD + return 0; +} +int functionWork3() { + char number[] = "42"; + int d; + sscanf(number, "%d", &d); // GOOD: sscanf always succeeds + if (d < 16) + return -1; +} diff --git a/cpp/ql/test/library-tests/controlflow/dominance/bbIDominates.expected b/cpp/ql/test/library-tests/controlflow/dominance/bbIDominates.expected index c860887c1b8..5ed3df039e2 100644 --- a/cpp/ql/test/library-tests/controlflow/dominance/bbIDominates.expected +++ b/cpp/ql/test/library-tests/controlflow/dominance/bbIDominates.expected @@ -31,4 +31,4 @@ | test2 | 83 | if (...) ... | 74 | test2 | | test2 | 83 | if (...) ... | 84 | break; | | test2 | 83 | if (...) ... | 85 | if (...) ... | -| test2 | 85 | if (...) ... | 0 | { ... } | +| test2 | 85 | if (...) ... | 86 | { ... } | diff --git a/cpp/ql/test/library-tests/controlflow/dominance/dominator.expected b/cpp/ql/test/library-tests/controlflow/dominance/dominator.expected index ca0b894b1bd..9b4ebf651f6 100644 --- a/cpp/ql/test/library-tests/controlflow/dominance/dominator.expected +++ b/cpp/ql/test/library-tests/controlflow/dominance/dominator.expected @@ -118,7 +118,7 @@ | test | 44 | ... = ... | 42 | j | | test | 44 | ExprStmt | 44 | 10 | | test | 44 | w | 44 | ... = ... | -| test | 47 | ... += ... | 50 | for(...;...;...) ... | +| test | 47 | ... += ... | 50 | { ... } | | test | 47 | ExprStmt | 47 | z | | test | 47 | w | 47 | ... += ... | | test | 47 | z | 47 | w | @@ -133,6 +133,7 @@ | test | 50 | j | 50 | ... ++ | | test | 50 | j | 50 | ... = ... | | test | 50 | label ...: | 50 | j | +| test | 50 | { ... } | 50 | for(...;...;...) ... | | test | 50 | { ... } | 51 | ExprStmt | | test | 51 | 30 | 51 | y | | test | 51 | ... = ... | 52 | if (...) ... | @@ -181,10 +182,10 @@ | test | 70 | ExprStmt | 70 | 40 | | test | 70 | w | 70 | ... = ... | | test | 71 | return ... | 71 | w | -| test2 | 0 | { ... } | 86 | ExprStmt | | test2 | 74 | { ... } | 76 | declaration | -| test2 | 76 | declaration | 77 | for(...;...;...) ... | +| test2 | 76 | declaration | 77 | { ... } | | test2 | 77 | for(...;...;...) ... | 77 | { ... } | +| test2 | 77 | { ... } | 77 | for(...;...;...) ... | | test2 | 77 | { ... } | 78 | ExprStmt | | test2 | 78 | 10 | 78 | b | | test2 | 78 | ... = ... | 79 | if (...) ... | @@ -211,11 +212,12 @@ | test2 | 83 | if (...) ... | 83 | a | | test2 | 84 | break; | 87 | label ...: | | test2 | 85 | 20 | 85 | ... == ... | -| test2 | 85 | ... == ... | 0 | { ... } | +| test2 | 85 | ... == ... | 86 | { ... } | | test2 | 85 | a | 85 | 20 | | test2 | 85 | if (...) ... | 85 | a | | test2 | 86 | ExprStmt | 86 | c | | test2 | 86 | c | 86 | return ... | +| test2 | 86 | { ... } | 86 | ExprStmt | | test2 | 87 | label ...: | 88 | ExprStmt | | test2 | 88 | ExprStmt | 88 | b | | test2 | 88 | b | 88 | return ... | diff --git a/cpp/ql/test/library-tests/cpp11_g/cfg.ql b/cpp/ql/test/library-tests/cpp11_g/cfg.ql index 5fe85186273..105b4e709ee 100644 --- a/cpp/ql/test/library-tests/cpp11_g/cfg.ql +++ b/cpp/ql/test/library-tests/cpp11_g/cfg.ql @@ -1,5 +1,4 @@ import cpp -import semmle.code.cpp.exprs.ObjectiveC string arguments(Function f, int i) { result = "," and i = -1 diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_path_to_sink/tainted.ql b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_path_to_sink/tainted.ql index c1477d788ca..1737bb0bb33 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_path_to_sink/tainted.ql +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_path_to_sink/tainted.ql @@ -67,8 +67,8 @@ class IRDefaultTaintTrackingTest extends InlineExpectationsTest { } } -class ASTTaintTrackingTest extends InlineExpectationsTest { - ASTTaintTrackingTest() { this = "ASTTaintTrackingTest" } +class AstTaintTrackingTest extends InlineExpectationsTest { + AstTaintTrackingTest() { this = "ASTTaintTrackingTest" } override string getARelevantTag() { result = "ast" } diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_sinks_only/tainted.ql b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_sinks_only/tainted.ql index 5784906862b..61014bbd48f 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_sinks_only/tainted.ql +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_sinks_only/tainted.ql @@ -55,8 +55,8 @@ class IRDefaultTaintTrackingTest extends InlineExpectationsTest { } } -class ASTTaintTrackingTest extends InlineExpectationsTest { - ASTTaintTrackingTest() { this = "ASTTaintTrackingTest" } +class AstTaintTrackingTest extends InlineExpectationsTest { + AstTaintTrackingTest() { this = "ASTTaintTrackingTest" } override string getARelevantTag() { result = "ast" } diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/globals/global.ql b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/globals/global.ql index 953b15a9f9c..a9a4a1af231 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/globals/global.ql +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/globals/global.ql @@ -27,8 +27,8 @@ class IRGlobalDefaultTaintTrackingTest extends InlineExpectationsTest { } } -class ASTGlobalDefaultTaintTrackingTest extends InlineExpectationsTest { - ASTGlobalDefaultTaintTrackingTest() { this = "ASTGlobalDefaultTaintTrackingTest" } +class AstGlobalDefaultTaintTrackingTest extends InlineExpectationsTest { + AstGlobalDefaultTaintTrackingTest() { this = "ASTGlobalDefaultTaintTrackingTest" } override string getARelevantTag() { result = "ast" } diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected index 1d9d16d9086..f04db828a25 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected @@ -208,18 +208,25 @@ postWithInFlow | lambdas.cpp:13:7:13:7 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:13:10:17:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:13:10:17:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:13:11:13:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:13:11:13:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:16:3:16:11 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:20:7:20:7 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:20:10:24:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:20:10:24:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:20:10:24:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | -| lambdas.cpp:23:3:23:3 | (reference dereference) [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:20:11:20:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:20:11:20:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:20:11:20:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:23:3:23:14 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:23:3:23:14 | VariableAddress [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. | +| lambdas.cpp:23:15:23:15 | (reference dereference) [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:28:7:28:7 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:28:10:31:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:28:10:31:2 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:28:11:28:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| lambdas.cpp:28:11:28:11 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:34:7:34:7 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:34:13:34:13 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:40:7:40:7 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql index 331956083ad..63c20affad1 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql @@ -1,6 +1,6 @@ import TestUtilities.dataflow.FlowTestCommon -module ASTTest { +module AstTest { private import semmle.code.cpp.dataflow.DataFlow /** @@ -18,8 +18,8 @@ module ASTTest { } /** Common data flow configuration to be used by tests. */ - class ASTTestAllocationConfig extends DataFlow::Configuration { - ASTTestAllocationConfig() { this = "ASTTestAllocationConfig" } + class AstTestAllocationConfig extends DataFlow::Configuration { + AstTestAllocationConfig() { this = "ASTTestAllocationConfig" } override predicate isSource(DataFlow::Node source) { source.asExpr().(FunctionCall).getTarget().getName() = "source" @@ -100,10 +100,10 @@ module IRTest { } private predicate readsVariable(LoadInstruction load, Variable var) { - load.getSourceAddress().(VariableAddressInstruction).getASTVariable() = var + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var } private predicate writesVariable(StoreInstruction store, Variable var) { - store.getDestinationAddress().(VariableAddressInstruction).getASTVariable() = var + store.getDestinationAddress().(VariableAddressInstruction).getAstVariable() = var } } diff --git a/cpp/ql/test/library-tests/dataflow/fields/ASTConfiguration.qll b/cpp/ql/test/library-tests/dataflow/fields/ASTConfiguration.qll index 67017f63abd..39d6cff3492 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/ASTConfiguration.qll +++ b/cpp/ql/test/library-tests/dataflow/fields/ASTConfiguration.qll @@ -1,8 +1,8 @@ private import semmle.code.cpp.dataflow.DataFlow private import DataFlow -class ASTConf extends Configuration { - ASTConf() { this = "ASTFieldFlowConf" } +class AstConf extends Configuration { + AstConf() { this = "ASTFieldFlowConf" } override predicate isSource(Node src) { src.asExpr() instanceof NewExpr @@ -30,3 +30,6 @@ class ASTConf extends Configuration { b.asExpr().(AddressOfExpr).getOperand() = a.asExpr() } } + +/** DEPRECATED: Alias for AstConf */ +deprecated class ASTConf = AstConf; diff --git a/cpp/ql/test/library-tests/dataflow/fields/Nodes.qll b/cpp/ql/test/library-tests/dataflow/fields/Nodes.qll index eb6f3247b82..2c3186b3dfa 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/Nodes.qll +++ b/cpp/ql/test/library-tests/dataflow/fields/Nodes.qll @@ -3,7 +3,7 @@ private import semmle.code.cpp.dataflow.DataFlow as AST private import cpp private newtype TNode = - TASTNode(AST::DataFlow::Node n) or + TAstNode(AST::DataFlow::Node n) or TIRNode(IR::DataFlow::Node n) class Node extends TNode { @@ -11,23 +11,32 @@ class Node extends TNode { IR::DataFlow::Node asIR() { none() } - AST::DataFlow::Node asAST() { none() } + AST::DataFlow::Node asAst() { none() } + + /** DEPRECATED: Alias for asAst */ + deprecated AST::DataFlow::Node asAST() { result = asAst() } Location getLocation() { none() } } -class ASTNode extends Node, TASTNode { +class AstNode extends Node, TAstNode { AST::DataFlow::Node n; - ASTNode() { this = TASTNode(n) } + AstNode() { this = TAstNode(n) } override string toString() { result = n.toString() } - override AST::DataFlow::Node asAST() { result = n } + override AST::DataFlow::Node asAst() { result = n } + + /** DEPRECATED: Alias for asAst */ + deprecated override AST::DataFlow::Node asAST() { result = asAst() } override Location getLocation() { result = n.getLocation() } } +/** DEPRECATED: Alias for AstNode */ +deprecated class ASTNode = AstNode; + class IRNode extends Node, TIRNode { IR::DataFlow::Node n; diff --git a/cpp/ql/test/library-tests/dataflow/fields/flow.ql b/cpp/ql/test/library-tests/dataflow/fields/flow.ql index 23a7281c718..f902afd33db 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/flow.ql +++ b/cpp/ql/test/library-tests/dataflow/fields/flow.ql @@ -1,6 +1,6 @@ import TestUtilities.dataflow.FlowTestCommon -module ASTTest { +module AstTest { private import ASTConfiguration } diff --git a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.ql b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.ql index 5f39dd19737..b918417cd66 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.ql +++ b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.ql @@ -4,7 +4,6 @@ import semmle.code.cpp.ir.dataflow.DataFlow import IRConfiguration -import cpp import DataFlow::PathGraph from DataFlow::PathNode src, DataFlow::PathNode sink, IRConf conf diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.ql b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.ql index fae4b06da5a..3baba1a02ff 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.ql +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.ql @@ -7,8 +7,8 @@ import semmle.code.cpp.ir.dataflow.DataFlow::DataFlow as IR import semmle.code.cpp.dataflow.DataFlow::DataFlow as AST import Nodes -class ASTPartialDefNode extends ASTNode { - ASTPartialDefNode() { exists(n.asPartialDefinition()) } +class AstPartialDefNode extends AstNode { + AstPartialDefNode() { exists(n.asPartialDefinition()) } override string toString() { result = n.asPartialDefinition().toString() } } @@ -29,7 +29,7 @@ where msg = "IR only" or exists(AST::Node astNode, Expr partial | - node.asAST() = astNode and + node.asAst() = astNode and partial = astNode.asPartialDefinition() and not exists(IR::Node otherNode | otherNode.asPartialDefinition() = partial) ) and diff --git a/cpp/ql/test/library-tests/dataflow/fields/path-flow.ql b/cpp/ql/test/library-tests/dataflow/fields/path-flow.ql index 1772a3d6ad2..7456e114712 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/path-flow.ql +++ b/cpp/ql/test/library-tests/dataflow/fields/path-flow.ql @@ -4,9 +4,8 @@ import semmle.code.cpp.dataflow.DataFlow import ASTConfiguration -import cpp import DataFlow::PathGraph -from DataFlow::PathNode src, DataFlow::PathNode sink, ASTConf conf +from DataFlow::PathNode src, DataFlow::PathNode sink, AstConf conf where conf.hasFlowPath(src, sink) select sink, src, sink, sink + " flows from $@", src, src.toString() diff --git a/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.ql b/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.ql index 4f18139b2af..d16552d983d 100644 --- a/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.ql +++ b/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.ql @@ -1,10 +1,10 @@ import TestUtilities.dataflow.FlowTestCommon -module ASTTest { +module AstTest { private import semmle.code.cpp.dataflow.TaintTracking - class ASTSmartPointerTaintConfig extends TaintTracking::Configuration { - ASTSmartPointerTaintConfig() { this = "ASTSmartPointerTaintConfig" } + class AstSmartPointerTaintConfig extends TaintTracking::Configuration { + AstSmartPointerTaintConfig() { this = "ASTSmartPointerTaintConfig" } override predicate isSource(DataFlow::Node source) { source.asExpr().(FunctionCall).getTarget().getName() = "source" diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index d840d43f5d0..07bf9a85cf4 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -27,7 +27,8 @@ | arrayassignment.cpp:29:8:29:13 | call to source | arrayassignment.cpp:29:2:29:15 | ... = ... | | | arrayassignment.cpp:29:8:29:13 | call to source | arrayassignment.cpp:33:7:33:9 | r_x | | | arrayassignment.cpp:32:8:32:10 | p_x | arrayassignment.cpp:32:7:32:10 | * ... | TAINT | -| arrayassignment.cpp:37:7:37:7 | Unknown literal | arrayassignment.cpp:37:7:37:7 | constructor init of field i | TAINT | +| arrayassignment.cpp:37:7:37:7 | i | arrayassignment.cpp:37:7:37:7 | constructor init of field i | TAINT | +| arrayassignment.cpp:37:7:37:7 | i | arrayassignment.cpp:37:7:37:7 | i | | | arrayassignment.cpp:37:7:37:7 | this | arrayassignment.cpp:37:7:37:7 | constructor init of field i [pre-this] | | | arrayassignment.cpp:40:2:40:6 | this | arrayassignment.cpp:40:12:40:15 | constructor init of field i [pre-this] | | | arrayassignment.cpp:40:12:40:15 | 0 | arrayassignment.cpp:40:12:40:15 | constructor init of field i | TAINT | @@ -284,6 +285,7 @@ | copyableclass_declonly.cpp:67:13:67:18 | call to source | copyableclass_declonly.cpp:67:13:67:20 | call to MyCopyableClassDeclOnly | TAINT | | copyableclass_declonly.cpp:67:13:67:20 | call to MyCopyableClassDeclOnly | copyableclass_declonly.cpp:67:8:67:9 | ref arg s3 | TAINT | | copyableclass_declonly.cpp:67:13:67:20 | call to MyCopyableClassDeclOnly | copyableclass_declonly.cpp:67:11:67:11 | call to operator= | TAINT | +| file://:0:0:0:0 | (unnamed parameter 0) | arrayassignment.cpp:37:7:37:7 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | @@ -299,6 +301,27 @@ | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:75:8:75:8 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:75:8:75:8 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | stl.h:389:9:389:9 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | structlikeclass.cpp:5:7:5:7 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | structlikeclass.cpp:5:7:5:7 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:228:11:228:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:228:11:228:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:235:11:235:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:235:11:235:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:235:11:235:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:243:11:243:11 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | taint.cpp:243:11:243:11 | (unnamed parameter 0) | | | format.cpp:16:21:16:21 | s | format.cpp:16:21:16:21 | s | | | format.cpp:16:21:16:21 | s | format.cpp:22:22:22:22 | s | | | format.cpp:16:31:16:31 | n | format.cpp:22:25:22:25 | n | | @@ -3554,8 +3577,10 @@ | standalone_iterators.cpp:120:2:120:3 | it | standalone_iterators.cpp:120:5:120:5 | call to operator+= | TAINT | | standalone_iterators.cpp:120:2:120:3 | ref arg it | standalone_iterators.cpp:121:7:121:8 | it | | | standalone_iterators.cpp:120:8:120:13 | call to source | standalone_iterators.cpp:120:2:120:3 | ref arg it | TAINT | -| stl.h:75:8:75:8 | Unknown literal | stl.h:75:8:75:8 | constructor init of field container | TAINT | -| stl.h:75:8:75:8 | Unknown literal | stl.h:75:8:75:8 | constructor init of field container | TAINT | +| stl.h:75:8:75:8 | container | stl.h:75:8:75:8 | constructor init of field container | TAINT | +| stl.h:75:8:75:8 | container | stl.h:75:8:75:8 | constructor init of field container | TAINT | +| stl.h:75:8:75:8 | container | stl.h:75:8:75:8 | container | | +| stl.h:75:8:75:8 | container | stl.h:75:8:75:8 | container | | | stl.h:75:8:75:8 | this | stl.h:75:8:75:8 | constructor init of field container [pre-this] | | | stl.h:75:8:75:8 | this | stl.h:75:8:75:8 | constructor init of field container [pre-this] | | | stl.h:95:69:95:69 | x | stl.h:95:69:95:69 | x | | @@ -3573,16 +3598,6 @@ | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | | stl.h:292:53:292:63 | 0 | stl.h:292:46:292:64 | (no string representation) | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field first | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field first | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field first | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field first | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field first | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field second | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field second | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field second | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field second | TAINT | -| stl.h:389:9:389:9 | Unknown literal | stl.h:389:9:389:9 | constructor init of field second | TAINT | | stl.h:389:9:389:9 | constructor init of field first [post-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | | stl.h:389:9:389:9 | constructor init of field first [post-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | | stl.h:389:9:389:9 | constructor init of field first [post-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | @@ -3593,6 +3608,26 @@ | stl.h:389:9:389:9 | constructor init of field first [pre-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | | stl.h:389:9:389:9 | constructor init of field first [pre-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | | stl.h:389:9:389:9 | constructor init of field first [pre-this] | stl.h:389:9:389:9 | constructor init of field second [pre-this] | | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | constructor init of field first | TAINT | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | constructor init of field first | TAINT | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | constructor init of field first | TAINT | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | constructor init of field first | TAINT | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | constructor init of field first | TAINT | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | first | | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | first | | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | first | | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | first | | +| stl.h:389:9:389:9 | first | stl.h:389:9:389:9 | first | | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | constructor init of field second | TAINT | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | constructor init of field second | TAINT | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | constructor init of field second | TAINT | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | constructor init of field second | TAINT | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | constructor init of field second | TAINT | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | second | | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | second | | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | second | | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | second | | +| stl.h:389:9:389:9 | second | stl.h:389:9:389:9 | second | | | stl.h:389:9:389:9 | this | stl.h:389:9:389:9 | constructor init of field first [pre-this] | | | stl.h:389:9:389:9 | this | stl.h:389:9:389:9 | constructor init of field first [pre-this] | | | stl.h:389:9:389:9 | this | stl.h:389:9:389:9 | constructor init of field first [pre-this] | | @@ -5354,10 +5389,12 @@ | stringstream.cpp:266:54:266:58 | ref arg call to flush | stringstream.cpp:266:35:266:39 | ref arg call to write | TAINT | | stringstream.cpp:266:68:266:72 | xyz | stringstream.cpp:266:54:266:58 | ref arg call to flush | TAINT | | stringstream.cpp:266:68:266:72 | xyz | stringstream.cpp:266:62:266:66 | call to write | TAINT | -| structlikeclass.cpp:5:7:5:7 | Unknown literal | structlikeclass.cpp:5:7:5:7 | constructor init of field v | TAINT | -| structlikeclass.cpp:5:7:5:7 | Unknown literal | structlikeclass.cpp:5:7:5:7 | constructor init of field v | TAINT | | structlikeclass.cpp:5:7:5:7 | this | structlikeclass.cpp:5:7:5:7 | constructor init of field v [pre-this] | | | structlikeclass.cpp:5:7:5:7 | this | structlikeclass.cpp:5:7:5:7 | constructor init of field v [pre-this] | | +| structlikeclass.cpp:5:7:5:7 | v | structlikeclass.cpp:5:7:5:7 | constructor init of field v | TAINT | +| structlikeclass.cpp:5:7:5:7 | v | structlikeclass.cpp:5:7:5:7 | constructor init of field v | TAINT | +| structlikeclass.cpp:5:7:5:7 | v | structlikeclass.cpp:5:7:5:7 | v | | +| structlikeclass.cpp:5:7:5:7 | v | structlikeclass.cpp:5:7:5:7 | v | | | structlikeclass.cpp:8:2:8:16 | this | structlikeclass.cpp:8:28:8:32 | constructor init of field v [pre-this] | | | structlikeclass.cpp:8:22:8:23 | _v | structlikeclass.cpp:8:30:8:31 | _v | | | structlikeclass.cpp:8:30:8:31 | _v | structlikeclass.cpp:8:28:8:32 | constructor init of field v | TAINT | @@ -5973,24 +6010,29 @@ | taint.cpp:226:9:226:10 | 0 | taint.cpp:261:7:261:7 | w | | | taint.cpp:228:10:232:2 | [...](...){...} | taint.cpp:233:7:233:7 | a | | | taint.cpp:228:10:232:2 | {...} | taint.cpp:228:10:232:2 | [...](...){...} | | -| taint.cpp:228:11:228:11 | Unknown literal | taint.cpp:228:11:228:11 | constructor init of field t | TAINT | -| taint.cpp:228:11:228:11 | Unknown literal | taint.cpp:228:11:228:11 | constructor init of field u | TAINT | | taint.cpp:228:11:228:11 | constructor init of field t [post-this] | taint.cpp:228:11:228:11 | constructor init of field u [pre-this] | | | taint.cpp:228:11:228:11 | constructor init of field t [pre-this] | taint.cpp:228:11:228:11 | constructor init of field u [pre-this] | | +| taint.cpp:228:11:228:11 | t | taint.cpp:228:11:228:11 | constructor init of field t | TAINT | +| taint.cpp:228:11:228:11 | t | taint.cpp:228:11:228:11 | t | | | taint.cpp:228:11:228:11 | this | taint.cpp:228:11:228:11 | constructor init of field t [pre-this] | | +| taint.cpp:228:11:228:11 | u | taint.cpp:228:11:228:11 | constructor init of field u | TAINT | +| taint.cpp:228:11:228:11 | u | taint.cpp:228:11:228:11 | u | | | taint.cpp:228:17:228:17 | this | taint.cpp:229:3:229:6 | this | | | taint.cpp:229:3:229:6 | this | taint.cpp:230:3:230:6 | this | | | taint.cpp:230:3:230:6 | this | file://:0:0:0:0 | this | | | taint.cpp:235:10:239:2 | [...](...){...} | taint.cpp:240:2:240:2 | b | | | taint.cpp:235:10:239:2 | {...} | taint.cpp:235:10:239:2 | [...](...){...} | | -| taint.cpp:235:11:235:11 | Unknown literal | taint.cpp:235:11:235:11 | constructor init of field t | TAINT | -| taint.cpp:235:11:235:11 | Unknown literal | taint.cpp:235:11:235:11 | constructor init of field u | TAINT | -| taint.cpp:235:11:235:11 | Unknown literal | taint.cpp:235:11:235:11 | constructor init of field v | TAINT | | taint.cpp:235:11:235:11 | constructor init of field t [post-this] | taint.cpp:235:11:235:11 | constructor init of field u [pre-this] | | | taint.cpp:235:11:235:11 | constructor init of field t [pre-this] | taint.cpp:235:11:235:11 | constructor init of field u [pre-this] | | | taint.cpp:235:11:235:11 | constructor init of field u [post-this] | taint.cpp:235:11:235:11 | constructor init of field v [pre-this] | | | taint.cpp:235:11:235:11 | constructor init of field u [pre-this] | taint.cpp:235:11:235:11 | constructor init of field v [pre-this] | | +| taint.cpp:235:11:235:11 | t | taint.cpp:235:11:235:11 | constructor init of field t | TAINT | +| taint.cpp:235:11:235:11 | t | taint.cpp:235:11:235:11 | t | | | taint.cpp:235:11:235:11 | this | taint.cpp:235:11:235:11 | constructor init of field t [pre-this] | | +| taint.cpp:235:11:235:11 | u | taint.cpp:235:11:235:11 | constructor init of field u | TAINT | +| taint.cpp:235:11:235:11 | u | taint.cpp:235:11:235:11 | u | | +| taint.cpp:235:11:235:11 | v | taint.cpp:235:11:235:11 | constructor init of field v | TAINT | +| taint.cpp:235:11:235:11 | v | taint.cpp:235:11:235:11 | v | | | taint.cpp:235:15:235:15 | this | taint.cpp:236:3:236:6 | this | | | taint.cpp:236:3:236:6 | this | taint.cpp:237:3:237:6 | this | | | taint.cpp:237:3:237:6 | this | taint.cpp:238:3:238:14 | this | | @@ -5998,11 +6040,13 @@ | taint.cpp:238:7:238:12 | call to source | taint.cpp:238:3:238:14 | ... = ... | | | taint.cpp:243:10:246:2 | [...](...){...} | taint.cpp:247:2:247:2 | c | | | taint.cpp:243:10:246:2 | {...} | taint.cpp:243:10:246:2 | [...](...){...} | | -| taint.cpp:243:11:243:11 | Unknown literal | taint.cpp:243:11:243:11 | constructor init of field t | TAINT | -| taint.cpp:243:11:243:11 | Unknown literal | taint.cpp:243:11:243:11 | constructor init of field u | TAINT | | taint.cpp:243:11:243:11 | constructor init of field t [post-this] | taint.cpp:243:11:243:11 | constructor init of field u [pre-this] | | | taint.cpp:243:11:243:11 | constructor init of field t [pre-this] | taint.cpp:243:11:243:11 | constructor init of field u [pre-this] | | +| taint.cpp:243:11:243:11 | t | taint.cpp:243:11:243:11 | constructor init of field t | TAINT | +| taint.cpp:243:11:243:11 | t | taint.cpp:243:11:243:11 | t | | | taint.cpp:243:11:243:11 | this | taint.cpp:243:11:243:11 | constructor init of field t [pre-this] | | +| taint.cpp:243:11:243:11 | u | taint.cpp:243:11:243:11 | constructor init of field u | TAINT | +| taint.cpp:243:11:243:11 | u | taint.cpp:243:11:243:11 | u | | | taint.cpp:243:15:243:15 | this | taint.cpp:244:3:244:6 | this | | | taint.cpp:244:3:244:6 | this | taint.cpp:245:3:245:6 | this | | | taint.cpp:249:11:252:2 | [...](...){...} | taint.cpp:253:2:253:2 | d | | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql index 4bf7420a9fd..bd513adcef2 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql @@ -38,13 +38,13 @@ module TaintModels { } } -module ASTTest { +module AstTest { private import semmle.code.cpp.dataflow.TaintTracking private import semmle.code.cpp.models.interfaces.Taint /** Common data flow configuration to be used by tests. */ - class ASTTestAllocationConfig extends TaintTracking::Configuration { - ASTTestAllocationConfig() { this = "ASTTestAllocationConfig" } + class AstTestAllocationConfig extends TaintTracking::Configuration { + AstTestAllocationConfig() { this = "ASTTestAllocationConfig" } override predicate isSource(DataFlow::Node source) { source.asExpr().(FunctionCall).getTarget().getName() = "source" diff --git a/cpp/ql/test/library-tests/defuse/isAddressOfAccess.expected b/cpp/ql/test/library-tests/defuse/isAddressOfAccess.expected index e47d9faa980..6fd4e129ff2 100644 --- a/cpp/ql/test/library-tests/defuse/isAddressOfAccess.expected +++ b/cpp/ql/test/library-tests/defuse/isAddressOfAccess.expected @@ -12,8 +12,12 @@ | addressOf.cpp:40:15:40:15 | i | non-const address | | addressOf.cpp:42:19:42:22 | iref | non-const address | | addressOf.cpp:47:12:47:31 | captured | non-const address | +| addressOf.cpp:47:13:47:13 | (unnamed parameter 0) | | +| addressOf.cpp:47:13:47:13 | captured | | | addressOf.cpp:47:19:47:28 | captured | | | addressOf.cpp:48:3:48:4 | f1 | const address | +| addressOf.cpp:49:13:49:13 | (unnamed parameter 0) | | +| addressOf.cpp:49:13:49:13 | captured | | | addressOf.cpp:49:15:49:22 | captured | non-const address | | addressOf.cpp:49:27:49:36 | captured | | | addressOf.cpp:50:3:50:4 | f2 | const address | @@ -245,6 +249,10 @@ | test.cpp:173:19:173:19 | x | const address | | test.cpp:174:20:174:20 | x | const address | | test.cpp:175:7:175:7 | x | | +| test.cpp:178:8:178:8 | (unnamed parameter 0) | | +| test.cpp:178:8:178:8 | (unnamed parameter 0) | | +| test.cpp:178:8:178:8 | nested | | +| test.cpp:178:8:178:8 | x_ | | | test.cpp:183:38:183:41 | yptr | | | test.cpp:183:48:183:48 | z | | | test.cpp:184:28:184:35 | static_y | non-const address | diff --git a/cpp/ql/test/library-tests/defuse/parameterUsePair.expected b/cpp/ql/test/library-tests/defuse/parameterUsePair.expected index 5eb3d7d75c1..336f25beb32 100644 --- a/cpp/ql/test/library-tests/defuse/parameterUsePair.expected +++ b/cpp/ql/test/library-tests/defuse/parameterUsePair.expected @@ -8,6 +8,10 @@ | addressOf.cpp:61:33:61:35 | ref | addressOf.cpp:63:24:63:26 | ref | | addressOf.cpp:70:29:70:31 | obj | addressOf.cpp:71:32:71:34 | obj | | addressOf.cpp:70:29:70:31 | obj | addressOf.cpp:71:32:71:34 | obj | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:47:13:47:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:49:13:49:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | | indirect_use.cpp:19:31:19:32 | ip | indirect_use.cpp:20:14:20:15 | ip | | indirect_use.cpp:24:31:24:32 | ip | indirect_use.cpp:25:14:25:15 | ip | | indirect_use.cpp:30:28:30:30 | ppp | indirect_use.cpp:31:19:31:21 | ppp | diff --git a/cpp/ql/test/library-tests/defuse/useOfVar.expected b/cpp/ql/test/library-tests/defuse/useOfVar.expected index 404509c7326..b282de15df0 100644 --- a/cpp/ql/test/library-tests/defuse/useOfVar.expected +++ b/cpp/ql/test/library-tests/defuse/useOfVar.expected @@ -26,6 +26,10 @@ | addressOf.cpp:70:29:70:31 | obj | addressOf.cpp:71:32:71:34 | obj | | addressOf.cpp:76:7:76:7 | x | addressOf.cpp:77:27:77:27 | x | | addressOf.cpp:76:7:76:7 | x | addressOf.cpp:77:48:77:48 | x | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:47:13:47:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:49:13:49:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | | indirect_use.cpp:19:31:19:32 | ip | indirect_use.cpp:20:14:20:15 | ip | | indirect_use.cpp:20:10:20:10 | p | indirect_use.cpp:21:17:21:17 | p | | indirect_use.cpp:24:31:24:32 | ip | indirect_use.cpp:25:14:25:15 | ip | diff --git a/cpp/ql/test/library-tests/defuse/useOfVarActual.expected b/cpp/ql/test/library-tests/defuse/useOfVarActual.expected index 0b704dcc820..135fd16f212 100644 --- a/cpp/ql/test/library-tests/defuse/useOfVarActual.expected +++ b/cpp/ql/test/library-tests/defuse/useOfVarActual.expected @@ -12,6 +12,10 @@ | addressOf.cpp:61:23:61:25 | ptr | addressOf.cpp:63:19:63:21 | ptr | | addressOf.cpp:70:29:70:31 | obj | addressOf.cpp:71:32:71:34 | obj | | addressOf.cpp:76:7:76:7 | x | addressOf.cpp:77:48:77:48 | x | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:47:13:47:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | addressOf.cpp:49:13:49:13 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | +| file://:0:0:0:0 | (unnamed parameter 0) | test.cpp:178:8:178:8 | (unnamed parameter 0) | | indirect_use.cpp:19:31:19:32 | ip | indirect_use.cpp:20:14:20:15 | ip | | indirect_use.cpp:20:10:20:10 | p | indirect_use.cpp:21:17:21:17 | p | | indirect_use.cpp:24:31:24:32 | ip | indirect_use.cpp:25:14:25:15 | ip | diff --git a/cpp/ql/test/library-tests/depends_initializers/InitializerAccesses.expected b/cpp/ql/test/library-tests/depends_initializers/InitializerAccesses.expected index 71e0949fa52..d1ff0d6b52f 100644 --- a/cpp/ql/test/library-tests/depends_initializers/InitializerAccesses.expected +++ b/cpp/ql/test/library-tests/depends_initializers/InitializerAccesses.expected @@ -1,7 +1,7 @@ | initializers.cpp:18:8:18:15 | initializer for y | initializers.cpp:18:9:18:9 | x | | initializers.cpp:19:8:19:21 | initializer for z | initializers.cpp:19:9:19:9 | x | | initializers.cpp:23:8:23:9 | initializer for j | initializers.cpp:23:9:23:9 | i | -| initializers.cpp:27:8:27:10 | initializer for aax | initializers.cpp:27:9:27:10 | ax | +| initializers.cpp:27:9:27:10 | initializer for aax | initializers.cpp:27:9:27:10 | ax | | initializers.cpp:30:20:30:35 | initializer for myIntArray | initializers.cpp:30:22:30:22 | i | | template_static.cpp:9:24:9:24 | initializer for static_c | template_static.cpp:9:24:9:24 | c | | template_static.cpp:10:22:10:24 | initializer for static_v | template_static.cpp:10:24:10:24 | v | diff --git a/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.expected b/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.expected index 862cd295942..cc470e2eab4 100644 --- a/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.expected +++ b/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.expected @@ -8,7 +8,7 @@ | initializers.cpp:23:8:23:9 | initializer for j | | | initializers.cpp:25:3:25:3 | initializer for a | | | initializers.cpp:26:7:26:10 | initializer for ax | | -| initializers.cpp:27:8:27:10 | initializer for aax | | +| initializers.cpp:27:9:27:10 | initializer for aax | | | initializers.cpp:30:20:30:35 | initializer for myIntArray | | | initializers.cpp:31:3:31:15 | initializer for myObjectArray | | | template_static.cpp:2:15:2:15 | initializer for c | | diff --git a/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.ql b/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.ql index fdb42979dc5..a9c52dd8223 100644 --- a/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.ql +++ b/cpp/ql/test/library-tests/depends_initializers/InitializerCFG.ql @@ -1,7 +1,7 @@ import cpp -Function getCFGFunction(Initializer i) { result = i.getASuccessor*() } +Function getCfgFunction(Initializer i) { result = i.getASuccessor*() } from Initializer i, string f -where if exists(getCFGFunction(i)) then f = getCFGFunction(i).toString() else f = "" +where if exists(getCfgFunction(i)) then f = getCfgFunction(i).toString() else f = "" select i, f diff --git a/cpp/ql/test/library-tests/floats/float128/errors.expected b/cpp/ql/test/library-tests/floats/float128/errors.expected index 2f163e66cb0..d7891f3e9b6 100644 --- a/cpp/ql/test/library-tests/floats/float128/errors.expected +++ b/cpp/ql/test/library-tests/floats/float128/errors.expected @@ -1,3 +1,4 @@ | file://:0:0:0:0 | There was an error during this compilation | | float128.cpp:1:39:1:39 | 128-bit floating-point types are not supported in this configuration | -| float128.cpp:2:30:2:30 | 128-bit floating-point types are not supported in this configuration | +| float128.cpp:2:30:2:30 | an attribute specifies a mode incompatible with '' | +| float128.cpp:2:41:2:41 | invalid combination of type specifiers | diff --git a/cpp/ql/test/library-tests/floats/float128/usertypes.expected b/cpp/ql/test/library-tests/floats/float128/usertypes.expected index 42b6612aff9..84a38d93967 100644 --- a/cpp/ql/test/library-tests/floats/float128/usertypes.expected +++ b/cpp/ql/test/library-tests/floats/float128/usertypes.expected @@ -1,5 +1,4 @@ | float128.cpp:1:50:1:60 | _Complex128 | file://:0:0:0:0 | | -| float128.cpp:2:41:2:49 | _Float128 | file://:0:0:0:0 | | | float128.cpp:13:29:13:54 | __is_floating_point_helper | float128.cpp:10:8:10:17 | false_type | | float128.cpp:14:19:14:51 | __is_floating_point_helper | float128.cpp:11:8:11:16 | true_type | | float128.cpp:15:19:15:52 | __is_floating_point_helper | float128.cpp:11:8:11:16 | true_type | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 2577b27e974..9aedef96249 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -155,15 +155,27 @@ bad_asts.cpp: # 19| getInitializer(0): [ConstructorFieldInit] constructor init of field x # 19| Type = [IntType] int # 19| ValueCategory = prvalue -# 19| getExpr(): [Literal] Unknown literal +# 19| getExpr(): [ReferenceFieldAccess] x # 19| Type = [IntType] int -# 19| ValueCategory = prvalue +# 19| ValueCategory = prvalue(load) +# 19| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 19| Type = [LValueReferenceType] const Point & +# 19| ValueCategory = prvalue(load) +# 19| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 19| Type = [SpecifiedType] const Point +# 19| ValueCategory = lvalue # 19| getInitializer(1): [ConstructorFieldInit] constructor init of field y # 19| Type = [IntType] int # 19| ValueCategory = prvalue -# 19| getExpr(): [Literal] Unknown literal +# 19| getExpr(): [ReferenceFieldAccess] y # 19| Type = [IntType] int -# 19| ValueCategory = prvalue +# 19| ValueCategory = prvalue(load) +# 19| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 19| Type = [LValueReferenceType] const Point & +# 19| ValueCategory = prvalue(load) +# 19| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 19| Type = [SpecifiedType] const Point +# 19| ValueCategory = lvalue # 19| getEntryPoint(): [BlockStmt] { ... } # 19| getStmt(0): [ReturnStmt] return ... # 19| [MoveConstructor] void Bad::Point::Point(Bad::Point&&) @@ -5401,7 +5413,7 @@ ir.cpp: # 600| : # 600| getParameter(0): [Parameter] (unnamed parameter 0) # 600| Type = [RValueReferenceType] String && -# 601| [ConversionConstructor] void String::String(char const*) +# 601| [Constructor] void String::String(char const*) # 601| : # 601| getParameter(0): [Parameter] (unnamed parameter 0) # 601| Type = [PointerType] const char * @@ -10630,7 +10642,7 @@ ir.cpp: # 1330| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] constructor_only && -# 1335| [ConversionConstructor] void constructor_only::constructor_only(int) +# 1335| [Constructor] void constructor_only::constructor_only(int) # 1335| : # 1335| getParameter(0): [Parameter] x # 1335| Type = [IntType] int @@ -11503,9 +11515,9 @@ ir.cpp: # 1474| getExpr(): [ArrayExpr] access to array # 1474| Type = [IntType] int # 1474| ValueCategory = lvalue -# 1474| getArrayBase(): [VariableAccess] xs -# 1474| Type = [ArrayType] int[2] -# 1474| ValueCategory = lvalue +# 1474| getArrayBase(): [VariableAccess] unnamed_local_variable +# 1474| Type = [LValueReferenceType] int(&)[2] +# 1474| ValueCategory = prvalue(load) # 1474| getArrayOffset(): [Literal] 0 # 1474| Type = [IntType] int # 1474| Value = [Literal] 0 @@ -11513,6 +11525,9 @@ ir.cpp: # 1474| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion # 1474| Type = [IntPointerType] int * # 1474| ValueCategory = prvalue +# 1474| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1474| Type = [ArrayType] int[2] +# 1474| ValueCategory = lvalue # 1474| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) # 1474| Type = [LValueReferenceType] int & # 1474| ValueCategory = prvalue @@ -11523,9 +11538,9 @@ ir.cpp: # 1475| getExpr(): [ArrayExpr] access to array # 1475| Type = [IntType] int # 1475| ValueCategory = lvalue -# 1475| getArrayBase(): [VariableAccess] xs -# 1475| Type = [ArrayType] int[2] -# 1475| ValueCategory = lvalue +# 1475| getArrayBase(): [VariableAccess] unnamed_local_variable +# 1475| Type = [LValueReferenceType] int(&)[2] +# 1475| ValueCategory = prvalue(load) # 1475| getArrayOffset(): [Literal] 1 # 1475| Type = [IntType] int # 1475| Value = [Literal] 1 @@ -11533,6 +11548,9 @@ ir.cpp: # 1475| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion # 1475| Type = [IntPointerType] int * # 1475| ValueCategory = prvalue +# 1475| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1475| Type = [ArrayType] int[2] +# 1475| ValueCategory = lvalue # 1475| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) # 1475| Type = [LValueReferenceType] int & # 1475| ValueCategory = prvalue @@ -11574,688 +11592,2389 @@ ir.cpp: # 1478| Type = [IntType] int # 1478| ValueCategory = prvalue(load) # 1480| getStmt(3): [ReturnStmt] return ... -# 1482| [CopyAssignmentOperator] StructuredBindingDataMemberStruct& StructuredBindingDataMemberStruct::operator=(StructuredBindingDataMemberStruct const&) +# 1482| [CopyAssignmentOperator] StructuredBindingDataMemberMemberStruct& StructuredBindingDataMemberMemberStruct::operator=(StructuredBindingDataMemberMemberStruct const&) # 1482| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & -# 1482| [Constructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberMemberStruct & +# 1482| [MoveAssignmentOperator] StructuredBindingDataMemberMemberStruct& StructuredBindingDataMemberMemberStruct::operator=(StructuredBindingDataMemberMemberStruct&&) +# 1482| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingDataMemberMemberStruct && +# 1482| [Constructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() # 1482| : # 1482| : -# 1482| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1482| getInitializer(0): [ConstructorFieldInit] constructor init of field x # 1482| Type = [IntType] int # 1482| ValueCategory = prvalue -# 1482| getInitializer(1): [ConstructorFieldInit] constructor init of field d -# 1482| Type = [DoubleType] double -# 1482| ValueCategory = prvalue -# 1482| getInitializer(2): [ConstructorFieldInit] constructor init of field r -# 1482| Type = [LValueReferenceType] int & -# 1482| ValueCategory = prvalue # 1482| getEntryPoint(): [BlockStmt] { ... } # 1482| getStmt(0): [ReturnStmt] return ... -# 1482| [CopyConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) +# 1482| [CopyConstructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct(StructuredBindingDataMemberMemberStruct const&) # 1482| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & -# 1482| : -# 1482| getInitializer(0): [ConstructorFieldInit] constructor init of field i -# 1482| Type = [IntType] int -# 1482| ValueCategory = prvalue -# 1482| getExpr(): [Literal] Unknown literal -# 1482| Type = [IntType] int -# 1482| ValueCategory = prvalue -# 1482| getInitializer(1): [ConstructorFieldInit] constructor init of field d -# 1482| Type = [DoubleType] double -# 1482| ValueCategory = prvalue -# 1482| getExpr(): [Literal] Unknown literal -# 1482| Type = [DoubleType] double -# 1482| ValueCategory = prvalue -# 1482| getInitializer(2): [ConstructorFieldInit] constructor init of field b -# 1482| Type = [IntType] unsigned int -# 1482| ValueCategory = prvalue -# 1482| getExpr(): [Literal] Unknown literal -# 1482| Type = [IntType] unsigned int -# 1482| ValueCategory = prvalue -# 1482| getInitializer(3): [ConstructorFieldInit] constructor init of field r -# 1482| Type = [LValueReferenceType] int & -# 1482| ValueCategory = prvalue -# 1482| getExpr(): [Literal] Unknown literal -# 1482| Type = [LValueReferenceType] int & -# 1482| ValueCategory = prvalue -# 1482| getEntryPoint(): [BlockStmt] { ... } -# 1482| getStmt(0): [ReturnStmt] return ... -# 1482| [MoveConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct&&) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberMemberStruct & +# 1482| [MoveConstructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct(StructuredBindingDataMemberMemberStruct&&) # 1482| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingDataMemberMemberStruct && +# 1486| [CopyAssignmentOperator] StructuredBindingDataMemberStruct& StructuredBindingDataMemberStruct::operator=(StructuredBindingDataMemberStruct const&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| [Constructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1486| : +# 1486| : +# 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue +# 1486| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue +# 1486| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue +# 1486| getInitializer(3): [ConstructorFieldInit] constructor init of field p +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue +# 1486| getInitializer(4): [ConstructorFieldInit] constructor init of field xs +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(5): [ConstructorFieldInit] constructor init of field r_alt +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(6): [ConstructorFieldInit] constructor init of field m +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberMemberStruct +# 1486| Type = [VoidType] void +# 1486| ValueCategory = prvalue +# 1486| getEntryPoint(): [BlockStmt] { ... } +# 1486| getStmt(0): [ReturnStmt] return ... +# 1486| [CopyConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| : +# 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] i +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] d +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(2): [ConstructorFieldInit] constructor init of field b +# 1486| Type = [IntType] unsigned int +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] b +# 1486| Type = [IntType] unsigned int +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(3): [ConstructorFieldInit] constructor init of field r +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] r +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(4): [ConstructorFieldInit] constructor init of field p +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] p +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(5): [ConstructorFieldInit] constructor init of field xs +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] xs +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(6): [ConstructorFieldInit] constructor init of field r_alt +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] r_alt +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getInitializer(7): [ConstructorFieldInit] constructor init of field m +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ReferenceFieldAccess] m +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue +# 1486| getEntryPoint(): [BlockStmt] { ... } +# 1486| getStmt(0): [ReturnStmt] return ... +# 1486| [MoveConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct&&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] StructuredBindingDataMemberStruct && -# 1489| [TopLevelFunction] void data_member_structured_binding() -# 1489| : -# 1489| getEntryPoint(): [BlockStmt] { ... } -# 1490| getStmt(0): [DeclStmt] declaration -# 1490| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s -# 1490| Type = [Struct] StructuredBindingDataMemberStruct -# 1490| getVariable().getInitializer(): [Initializer] initializer for s -# 1490| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberStruct -# 1490| Type = [VoidType] void -# 1490| ValueCategory = prvalue -# 1492| getStmt(1): [BlockStmt] { ... } -# 1493| getStmt(0): [DeclStmt] declaration -# 1493| getDeclarationEntry(0): (no string representation) -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) -# 1493| getExpr(): [VariableAccess] s -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| ValueCategory = prvalue(load) -# 1493| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i -# 1493| Type = [IntType] int -#-----| getVariable().getInitializer(): [Initializer] initializer for i -# 1493| getExpr(): [ValueFieldAccess] i -# 1493| Type = [IntType] int -# 1493| ValueCategory = lvalue -# 1493| getQualifier(): [VariableAccess] (unnamed local variable) -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| ValueCategory = lvalue -# 1493| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d -# 1493| Type = [DoubleType] double -#-----| getVariable().getInitializer(): [Initializer] initializer for d -# 1493| getExpr(): [ValueFieldAccess] d -# 1493| Type = [DoubleType] double -# 1493| ValueCategory = lvalue -# 1493| getQualifier(): [VariableAccess] (unnamed local variable) -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| ValueCategory = lvalue -# 1493| getDeclarationEntry(3): [VariableDeclarationEntry] definition of b -# 1493| Type = [IntType] unsigned int -#-----| getVariable().getInitializer(): [Initializer] initializer for b -# 1493| getExpr(): [ValueFieldAccess] b -# 1493| Type = [IntType] unsigned int -# 1493| ValueCategory = lvalue -# 1493| getQualifier(): [VariableAccess] (unnamed local variable) -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| ValueCategory = lvalue -# 1493| getDeclarationEntry(4): [VariableDeclarationEntry] definition of r -# 1493| Type = [IntType] int -#-----| getVariable().getInitializer(): [Initializer] initializer for r -# 1493| getExpr(): [ValueFieldAccess] r -# 1493| Type = [LValueReferenceType] int & -# 1493| ValueCategory = prvalue(load) -# 1493| getQualifier(): [VariableAccess] (unnamed local variable) -# 1493| Type = [Struct] StructuredBindingDataMemberStruct -# 1493| ValueCategory = lvalue -# 1493| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1493| Type = [IntType] int -# 1493| ValueCategory = lvalue -# 1494| getStmt(1): [ExprStmt] ExprStmt -# 1494| getExpr(): [AssignExpr] ... = ... -# 1494| Type = [DoubleType] double -# 1494| ValueCategory = lvalue -# 1494| getLValue(): [VariableAccess] d -# 1494| Type = [DoubleType] double -# 1494| ValueCategory = lvalue -# 1494| getRValue(): [Literal] 4.0 -# 1494| Type = [DoubleType] double -# 1494| Value = [Literal] 4.0 -# 1494| ValueCategory = prvalue -# 1495| getStmt(2): [DeclStmt] declaration -# 1495| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd -# 1495| Type = [LValueReferenceType] double & -# 1495| getVariable().getInitializer(): [Initializer] initializer for rd -# 1495| getExpr(): [VariableAccess] d -# 1495| Type = [DoubleType] double -# 1495| ValueCategory = lvalue -# 1495| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1495| Type = [LValueReferenceType] double & -# 1495| ValueCategory = prvalue -# 1496| getStmt(3): [DeclStmt] declaration -# 1496| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v -# 1496| Type = [IntType] int -# 1496| getVariable().getInitializer(): [Initializer] initializer for v -# 1496| getExpr(): [VariableAccess] i -# 1496| Type = [IntType] int -# 1496| ValueCategory = prvalue(load) -# 1497| getStmt(4): [ExprStmt] ExprStmt -# 1497| getExpr(): [AssignExpr] ... = ... -# 1497| Type = [IntType] int -# 1497| ValueCategory = lvalue -# 1497| getLValue(): [VariableAccess] r -# 1497| Type = [IntType] int -# 1497| ValueCategory = lvalue -# 1497| getRValue(): [Literal] 5 -# 1497| Type = [IntType] int -# 1497| Value = [Literal] 5 -# 1497| ValueCategory = prvalue -# 1498| getStmt(5): [DeclStmt] declaration -# 1498| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr -# 1498| Type = [LValueReferenceType] int & -# 1498| getVariable().getInitializer(): [Initializer] initializer for rr -# 1498| getExpr(): [VariableAccess] r -# 1498| Type = [IntType] int -# 1498| ValueCategory = lvalue -# 1498| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1498| Type = [LValueReferenceType] int & -# 1498| ValueCategory = prvalue -# 1499| getStmt(6): [DeclStmt] declaration -# 1499| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w -# 1499| Type = [IntType] int -# 1499| getVariable().getInitializer(): [Initializer] initializer for w -# 1499| getExpr(): [VariableAccess] r -# 1499| Type = [IntType] int -# 1499| ValueCategory = prvalue(load) -# 1502| getStmt(2): [BlockStmt] { ... } +# 1499| [TopLevelFunction] void data_member_structured_binding() +# 1499| : +# 1499| getEntryPoint(): [BlockStmt] { ... } +# 1500| getStmt(0): [DeclStmt] declaration +# 1500| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 1500| Type = [Struct] StructuredBindingDataMemberStruct +# 1500| getVariable().getInitializer(): [Initializer] initializer for s +# 1500| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberStruct +# 1500| Type = [VoidType] void +# 1500| ValueCategory = prvalue +# 1502| getStmt(1): [BlockStmt] { ... } # 1503| getStmt(0): [DeclStmt] declaration -# 1503| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1503| getDeclarationEntry(0): (no string representation) # 1503| Type = [Struct] StructuredBindingDataMemberStruct -# 1503| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1503| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) # 1503| getExpr(): [VariableAccess] s # 1503| Type = [Struct] StructuredBindingDataMemberStruct # 1503| ValueCategory = prvalue(load) -# 1504| getStmt(1): [DeclStmt] declaration -# 1504| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i -# 1504| Type = [LValueReferenceType] int & -# 1504| getVariable().getInitializer(): [Initializer] initializer for i -# 1504| getExpr(): [ValueFieldAccess] i -# 1504| Type = [IntType] int -# 1504| ValueCategory = lvalue -# 1504| getQualifier(): [VariableAccess] unnamed_local_variable -# 1504| Type = [Struct] StructuredBindingDataMemberStruct -# 1504| ValueCategory = lvalue -# 1504| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1504| Type = [LValueReferenceType] int & -# 1504| ValueCategory = prvalue +# 1503| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1503| getExpr(): [ValueFieldAccess] i +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d +# 1503| Type = [DoubleType] double +#-----| getVariable().getInitializer(): [Initializer] initializer for d +# 1503| getExpr(): [ValueFieldAccess] d +# 1503| Type = [DoubleType] double +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(3): [VariableDeclarationEntry] definition of b +# 1503| Type = [IntType] unsigned int +#-----| getVariable().getInitializer(): [Initializer] initializer for b +# 1503| getExpr(): [ValueFieldAccess] b +# 1503| Type = [IntType] unsigned int +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(4): [VariableDeclarationEntry] definition of r +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1503| getExpr(): [ValueFieldAccess] r +# 1503| Type = [LValueReferenceType] int & +# 1503| ValueCategory = prvalue(load) +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(5): [VariableDeclarationEntry] definition of p +# 1503| Type = [IntPointerType] int * +#-----| getVariable().getInitializer(): [Initializer] initializer for p +# 1503| getExpr(): [ValueFieldAccess] p +# 1503| Type = [IntPointerType] int * +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(6): [VariableDeclarationEntry] definition of xs +# 1503| Type = [CTypedefType,NestedTypedefType] ArrayType +#-----| getVariable().getInitializer(): [Initializer] initializer for xs +# 1503| getExpr(): [ValueFieldAccess] xs +# 1503| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(7): [VariableDeclarationEntry] definition of r_alt +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for r_alt +# 1503| getExpr(): [ValueFieldAccess] r_alt +# 1503| Type = [CTypedefType,NestedTypedefType] RefType +# 1503| ValueCategory = prvalue(load) +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(8): [VariableDeclarationEntry] definition of m +# 1503| Type = [Struct] StructuredBindingDataMemberMemberStruct +#-----| getVariable().getInitializer(): [Initializer] initializer for m +# 1503| getExpr(): [ValueFieldAccess] m +# 1503| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1504| getStmt(1): [ExprStmt] ExprStmt +# 1504| getExpr(): [AssignExpr] ... = ... +# 1504| Type = [DoubleType] double +# 1504| ValueCategory = lvalue +# 1504| getLValue(): [VariableAccess] d +# 1504| Type = [DoubleType] double +# 1504| ValueCategory = lvalue +# 1504| getRValue(): [Literal] 4.0 +# 1504| Type = [DoubleType] double +# 1504| Value = [Literal] 4.0 +# 1504| ValueCategory = prvalue # 1505| getStmt(2): [DeclStmt] declaration -# 1505| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1505| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd # 1505| Type = [LValueReferenceType] double & -# 1505| getVariable().getInitializer(): [Initializer] initializer for d -# 1505| getExpr(): [ValueFieldAccess] d +# 1505| getVariable().getInitializer(): [Initializer] initializer for rd +# 1505| getExpr(): [VariableAccess] d # 1505| Type = [DoubleType] double # 1505| ValueCategory = lvalue -# 1505| getQualifier(): [VariableAccess] unnamed_local_variable -# 1505| Type = [Struct] StructuredBindingDataMemberStruct -# 1505| ValueCategory = lvalue # 1505| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) # 1505| Type = [LValueReferenceType] double & # 1505| ValueCategory = prvalue -# 1507| getStmt(3): [DeclStmt] declaration -# 1507| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r -# 1507| Type = [LValueReferenceType] int & -# 1507| getVariable().getInitializer(): [Initializer] initializer for r -# 1507| getExpr(): [ValueFieldAccess] r -# 1507| Type = [LValueReferenceType] int & -# 1507| ValueCategory = prvalue(load) -# 1507| getQualifier(): [VariableAccess] unnamed_local_variable -# 1507| Type = [Struct] StructuredBindingDataMemberStruct -# 1507| ValueCategory = lvalue -# 1507| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1507| Type = [LValueReferenceType] int & -# 1507| ValueCategory = prvalue -# 1507| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1507| Type = [IntType] int -# 1507| ValueCategory = lvalue -# 1508| getStmt(4): [ExprStmt] ExprStmt +# 1506| getStmt(3): [DeclStmt] declaration +# 1506| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1506| Type = [IntType] int +# 1506| getVariable().getInitializer(): [Initializer] initializer for v +# 1506| getExpr(): [VariableAccess] i +# 1506| Type = [IntType] int +# 1506| ValueCategory = prvalue(load) +# 1507| getStmt(4): [ExprStmt] ExprStmt +# 1507| getExpr(): [AssignExpr] ... = ... +# 1507| Type = [IntType] int +# 1507| ValueCategory = lvalue +# 1507| getLValue(): [VariableAccess] r +# 1507| Type = [IntType] int +# 1507| ValueCategory = lvalue +# 1507| getRValue(): [Literal] 5 +# 1507| Type = [IntType] int +# 1507| Value = [Literal] 5 +# 1507| ValueCategory = prvalue +# 1508| getStmt(5): [ExprStmt] ExprStmt # 1508| getExpr(): [AssignExpr] ... = ... -# 1508| Type = [DoubleType] double +# 1508| Type = [IntType] int # 1508| ValueCategory = lvalue -# 1508| getLValue(): [VariableAccess] d -# 1508| Type = [LValueReferenceType] double & -# 1508| ValueCategory = prvalue(load) -# 1508| getRValue(): [Literal] 4.0 -# 1508| Type = [DoubleType] double -# 1508| Value = [Literal] 4.0 -# 1508| ValueCategory = prvalue -# 1508| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1508| Type = [DoubleType] double +# 1508| getLValue(): [PointerDereferenceExpr] * ... +# 1508| Type = [IntType] int # 1508| ValueCategory = lvalue -# 1509| getStmt(5): [DeclStmt] declaration -# 1509| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd -# 1509| Type = [LValueReferenceType] double & -# 1509| getVariable().getInitializer(): [Initializer] initializer for rd -# 1509| getExpr(): [VariableAccess] d -# 1509| Type = [LValueReferenceType] double & -# 1509| ValueCategory = prvalue(load) +# 1508| getOperand(): [VariableAccess] p +# 1508| Type = [IntPointerType] int * +# 1508| ValueCategory = prvalue(load) +# 1508| getRValue(): [Literal] 6 +# 1508| Type = [IntType] int +# 1508| Value = [Literal] 6 +# 1508| ValueCategory = prvalue +# 1509| getStmt(6): [DeclStmt] declaration +# 1509| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1509| Type = [LValueReferenceType] int & +# 1509| getVariable().getInitializer(): [Initializer] initializer for rr +# 1509| getExpr(): [VariableAccess] r +# 1509| Type = [IntType] int +# 1509| ValueCategory = lvalue # 1509| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1509| Type = [LValueReferenceType] double & +# 1509| Type = [LValueReferenceType] int & # 1509| ValueCategory = prvalue -# 1509| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1509| Type = [DoubleType] double -# 1509| ValueCategory = lvalue -# 1510| getStmt(6): [DeclStmt] declaration -# 1510| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v -# 1510| Type = [IntType] int -# 1510| getVariable().getInitializer(): [Initializer] initializer for v -# 1510| getExpr(): [VariableAccess] i -# 1510| Type = [LValueReferenceType] int & -# 1510| ValueCategory = prvalue(load) -# 1510| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1510| Type = [IntType] int -# 1510| ValueCategory = prvalue(load) -# 1511| getStmt(7): [ExprStmt] ExprStmt -# 1511| getExpr(): [AssignExpr] ... = ... +# 1510| getStmt(7): [DeclStmt] declaration +# 1510| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pr +# 1510| Type = [IntPointerType] int * +# 1510| getVariable().getInitializer(): [Initializer] initializer for pr +# 1510| getExpr(): [AddressOfExpr] & ... +# 1510| Type = [IntPointerType] int * +# 1510| ValueCategory = prvalue +# 1510| getOperand(): [VariableAccess] r +# 1510| Type = [IntType] int +# 1510| ValueCategory = lvalue +# 1511| getStmt(8): [DeclStmt] declaration +# 1511| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w # 1511| Type = [IntType] int -# 1511| ValueCategory = lvalue -# 1511| getLValue(): [VariableAccess] r -# 1511| Type = [LValueReferenceType] int & -# 1511| ValueCategory = prvalue(load) -# 1511| getRValue(): [Literal] 5 -# 1511| Type = [IntType] int -# 1511| Value = [Literal] 5 -# 1511| ValueCategory = prvalue -# 1511| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1511| Type = [IntType] int -# 1511| ValueCategory = lvalue -# 1512| getStmt(8): [DeclStmt] declaration -# 1512| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr -# 1512| Type = [LValueReferenceType] int & -# 1512| getVariable().getInitializer(): [Initializer] initializer for rr -# 1512| getExpr(): [VariableAccess] r -# 1512| Type = [LValueReferenceType] int & -# 1512| ValueCategory = prvalue(load) -# 1512| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1512| Type = [LValueReferenceType] int & -# 1512| ValueCategory = prvalue -# 1512| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1512| Type = [IntType] int -# 1512| ValueCategory = lvalue -# 1513| getStmt(9): [DeclStmt] declaration -# 1513| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w -# 1513| Type = [IntType] int -# 1513| getVariable().getInitializer(): [Initializer] initializer for w -# 1513| getExpr(): [VariableAccess] r -# 1513| Type = [LValueReferenceType] int & -# 1513| ValueCategory = prvalue(load) -# 1513| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1513| Type = [IntType] int -# 1513| ValueCategory = prvalue(load) -# 1515| getStmt(3): [ReturnStmt] return ... -# 1522| [CopyAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size const&) -# 1522| : +# 1511| getVariable().getInitializer(): [Initializer] initializer for w +# 1511| getExpr(): [VariableAccess] r +# 1511| Type = [IntType] int +# 1511| ValueCategory = prvalue(load) +# 1514| getStmt(2): [BlockStmt] { ... } +# 1515| getStmt(0): [DeclStmt] declaration +# 1515| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1515| Type = [Struct] StructuredBindingDataMemberStruct +# 1515| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1515| getExpr(): [VariableAccess] s +# 1515| Type = [Struct] StructuredBindingDataMemberStruct +# 1515| ValueCategory = prvalue(load) +# 1516| getStmt(1): [DeclStmt] declaration +# 1516| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1516| Type = [LValueReferenceType] int & +# 1516| getVariable().getInitializer(): [Initializer] initializer for i +# 1516| getExpr(): [ValueFieldAccess] i +# 1516| Type = [IntType] int +# 1516| ValueCategory = lvalue +# 1516| getQualifier(): [VariableAccess] unnamed_local_variable +# 1516| Type = [Struct] StructuredBindingDataMemberStruct +# 1516| ValueCategory = lvalue +# 1516| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1516| Type = [LValueReferenceType] int & +# 1516| ValueCategory = prvalue +# 1517| getStmt(2): [DeclStmt] declaration +# 1517| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1517| Type = [LValueReferenceType] double & +# 1517| getVariable().getInitializer(): [Initializer] initializer for d +# 1517| getExpr(): [ValueFieldAccess] d +# 1517| Type = [DoubleType] double +# 1517| ValueCategory = lvalue +# 1517| getQualifier(): [VariableAccess] unnamed_local_variable +# 1517| Type = [Struct] StructuredBindingDataMemberStruct +# 1517| ValueCategory = lvalue +# 1517| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1517| Type = [LValueReferenceType] double & +# 1517| ValueCategory = prvalue +# 1519| getStmt(3): [DeclStmt] declaration +# 1519| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1519| Type = [LValueReferenceType] int & +# 1519| getVariable().getInitializer(): [Initializer] initializer for r +# 1519| getExpr(): [ValueFieldAccess] r +# 1519| Type = [LValueReferenceType] int & +# 1519| ValueCategory = prvalue(load) +# 1519| getQualifier(): [VariableAccess] unnamed_local_variable +# 1519| Type = [Struct] StructuredBindingDataMemberStruct +# 1519| ValueCategory = lvalue +# 1519| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1519| Type = [LValueReferenceType] int & +# 1519| ValueCategory = prvalue +# 1519| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1519| Type = [IntType] int +# 1519| ValueCategory = lvalue +# 1520| getStmt(4): [DeclStmt] declaration +# 1520| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p +# 1520| Type = [LValueReferenceType] int *& +# 1520| getVariable().getInitializer(): [Initializer] initializer for p +# 1520| getExpr(): [ValueFieldAccess] p +# 1520| Type = [IntPointerType] int * +# 1520| ValueCategory = lvalue +# 1520| getQualifier(): [VariableAccess] unnamed_local_variable +# 1520| Type = [Struct] StructuredBindingDataMemberStruct +# 1520| ValueCategory = lvalue +# 1520| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1520| Type = [LValueReferenceType] int *& +# 1520| ValueCategory = prvalue +# 1521| getStmt(5): [ExprStmt] ExprStmt +# 1521| getExpr(): [AssignExpr] ... = ... +# 1521| Type = [DoubleType] double +# 1521| ValueCategory = lvalue +# 1521| getLValue(): [VariableAccess] d +# 1521| Type = [LValueReferenceType] double & +# 1521| ValueCategory = prvalue(load) +# 1521| getRValue(): [Literal] 4.0 +# 1521| Type = [DoubleType] double +# 1521| Value = [Literal] 4.0 +# 1521| ValueCategory = prvalue +# 1521| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1521| Type = [DoubleType] double +# 1521| ValueCategory = lvalue +# 1522| getStmt(6): [DeclStmt] declaration +# 1522| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1522| Type = [LValueReferenceType] double & +# 1522| getVariable().getInitializer(): [Initializer] initializer for rd +# 1522| getExpr(): [VariableAccess] d +# 1522| Type = [LValueReferenceType] double & +# 1522| ValueCategory = prvalue(load) +# 1522| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1522| Type = [LValueReferenceType] double & +# 1522| ValueCategory = prvalue +# 1522| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1522| Type = [DoubleType] double +# 1522| ValueCategory = lvalue +# 1523| getStmt(7): [DeclStmt] declaration +# 1523| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1523| Type = [IntType] int +# 1523| getVariable().getInitializer(): [Initializer] initializer for v +# 1523| getExpr(): [VariableAccess] i +# 1523| Type = [LValueReferenceType] int & +# 1523| ValueCategory = prvalue(load) +# 1523| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1523| Type = [IntType] int +# 1523| ValueCategory = prvalue(load) +# 1524| getStmt(8): [ExprStmt] ExprStmt +# 1524| getExpr(): [AssignExpr] ... = ... +# 1524| Type = [IntType] int +# 1524| ValueCategory = lvalue +# 1524| getLValue(): [VariableAccess] r +# 1524| Type = [LValueReferenceType] int & +# 1524| ValueCategory = prvalue(load) +# 1524| getRValue(): [Literal] 5 +# 1524| Type = [IntType] int +# 1524| Value = [Literal] 5 +# 1524| ValueCategory = prvalue +# 1524| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1524| Type = [IntType] int +# 1524| ValueCategory = lvalue +# 1525| getStmt(9): [ExprStmt] ExprStmt +# 1525| getExpr(): [AssignExpr] ... = ... +# 1525| Type = [IntType] int +# 1525| ValueCategory = lvalue +# 1525| getLValue(): [PointerDereferenceExpr] * ... +# 1525| Type = [IntType] int +# 1525| ValueCategory = lvalue +# 1525| getOperand(): [VariableAccess] p +# 1525| Type = [LValueReferenceType] int *& +# 1525| ValueCategory = prvalue(load) +# 1525| getOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1525| Type = [IntPointerType] int * +# 1525| ValueCategory = prvalue(load) +# 1525| getRValue(): [Literal] 6 +# 1525| Type = [IntType] int +# 1525| Value = [Literal] 6 +# 1525| ValueCategory = prvalue +# 1526| getStmt(10): [DeclStmt] declaration +# 1526| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1526| Type = [LValueReferenceType] int & +# 1526| getVariable().getInitializer(): [Initializer] initializer for rr +# 1526| getExpr(): [VariableAccess] r +# 1526| Type = [LValueReferenceType] int & +# 1526| ValueCategory = prvalue(load) +# 1526| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1526| Type = [LValueReferenceType] int & +# 1526| ValueCategory = prvalue +# 1526| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1526| Type = [IntType] int +# 1526| ValueCategory = lvalue +# 1527| getStmt(11): [DeclStmt] declaration +# 1527| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pr +# 1527| Type = [IntPointerType] int * +# 1527| getVariable().getInitializer(): [Initializer] initializer for pr +# 1527| getExpr(): [AddressOfExpr] & ... +# 1527| Type = [IntPointerType] int * +# 1527| ValueCategory = prvalue +# 1527| getOperand(): [VariableAccess] r +# 1527| Type = [LValueReferenceType] int & +# 1527| ValueCategory = prvalue(load) +# 1527| getOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1527| Type = [IntType] int +# 1527| ValueCategory = lvalue +# 1528| getStmt(12): [DeclStmt] declaration +# 1528| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1528| Type = [IntType] int +# 1528| getVariable().getInitializer(): [Initializer] initializer for w +# 1528| getExpr(): [VariableAccess] r +# 1528| Type = [LValueReferenceType] int & +# 1528| ValueCategory = prvalue(load) +# 1528| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1528| Type = [IntType] int +# 1528| ValueCategory = prvalue(load) +# 1530| getStmt(3): [ReturnStmt] return ... +# 1539| [CopyAssignmentOperator] StructuredBindingTupleRefGet& StructuredBindingTupleRefGet::operator=(StructuredBindingTupleRefGet const&) +# 1539| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const tuple_size & -# 1522| [MoveAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size&&) -# 1522| : +#-----| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| [Constructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() +# 1539| : +# 1539| : +# 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue +# 1539| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue +# 1539| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue +# 1539| getEntryPoint(): [BlockStmt] { ... } +# 1539| getStmt(0): [ReturnStmt] return ... +# 1539| [CopyConstructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) +# 1539| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] tuple_size && -# 1529| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) -# 1529| : +#-----| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| : +# 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [ReferenceFieldAccess] i +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue +# 1539| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [ReferenceFieldAccess] d +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue +# 1539| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [ReferenceFieldAccess] r +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) +# 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue +# 1539| getEntryPoint(): [BlockStmt] { ... } +# 1539| getStmt(0): [ReturnStmt] return ... +# 1539| [MoveConstructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet&&) +# 1539| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const tuple_element<0, StructuredBindingTuple> & -# 1529| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) -# 1529| : +#-----| Type = [RValueReferenceType] StructuredBindingTupleRefGet && +# 1545| [MemberFunction,TemplateFunction] type& StructuredBindingTupleRefGet::get() +# 1545| : +# 1549| [CopyAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size const&) +# 1549| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] tuple_element<0, StructuredBindingTuple> && -# 1533| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) -# 1533| : +#-----| Type = [LValueReferenceType] const tuple_size & +# 1549| [MoveAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size&&) +# 1549| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const tuple_element<1, StructuredBindingTuple> & -# 1533| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) -# 1533| : +#-----| Type = [RValueReferenceType] tuple_size && +# 1554| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1554| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] tuple_element<1, StructuredBindingTuple> && -# 1537| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) -# 1537| : +#-----| Type = [LValueReferenceType] const tuple_element<0, StructuredBindingTupleRefGet> & +# 1554| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1554| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const tuple_element<2, StructuredBindingTuple> & -# 1537| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) -# 1537| : +#-----| Type = [RValueReferenceType] tuple_element<0, StructuredBindingTupleRefGet> && +# 1558| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1558| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] tuple_element<2, StructuredBindingTuple> && -# 1542| [CopyAssignmentOperator] StructuredBindingTuple& StructuredBindingTuple::operator=(StructuredBindingTuple const&) -# 1542| : +#-----| Type = [LValueReferenceType] const tuple_element<1, StructuredBindingTupleRefGet> & +# 1558| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1558| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const StructuredBindingTuple & -# 1542| [Constructor] void StructuredBindingTuple::StructuredBindingTuple() -# 1542| : -# 1542| : -# 1542| getInitializer(0): [ConstructorFieldInit] constructor init of field i -# 1542| Type = [IntType] int -# 1542| ValueCategory = prvalue -# 1542| getInitializer(1): [ConstructorFieldInit] constructor init of field d -# 1542| Type = [DoubleType] double -# 1542| ValueCategory = prvalue -# 1542| getInitializer(2): [ConstructorFieldInit] constructor init of field r -# 1542| Type = [LValueReferenceType] int & -# 1542| ValueCategory = prvalue -# 1542| getEntryPoint(): [BlockStmt] { ... } -# 1542| getStmt(0): [ReturnStmt] return ... -# 1542| [CopyConstructor] void StructuredBindingTuple::StructuredBindingTuple(StructuredBindingTuple const&) -# 1542| : +#-----| Type = [RValueReferenceType] tuple_element<1, StructuredBindingTupleRefGet> && +# 1562| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1562| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const StructuredBindingTuple & -# 1542| : -# 1542| getInitializer(0): [ConstructorFieldInit] constructor init of field i -# 1542| Type = [IntType] int -# 1542| ValueCategory = prvalue -# 1542| getExpr(): [Literal] Unknown literal -# 1542| Type = [IntType] int -# 1542| ValueCategory = prvalue -# 1542| getInitializer(1): [ConstructorFieldInit] constructor init of field d -# 1542| Type = [DoubleType] double -# 1542| ValueCategory = prvalue -# 1542| getExpr(): [Literal] Unknown literal -# 1542| Type = [DoubleType] double -# 1542| ValueCategory = prvalue -# 1542| getInitializer(2): [ConstructorFieldInit] constructor init of field r -# 1542| Type = [LValueReferenceType] int & -# 1542| ValueCategory = prvalue -# 1542| getExpr(): [Literal] Unknown literal -# 1542| Type = [LValueReferenceType] int & -# 1542| ValueCategory = prvalue -# 1542| getEntryPoint(): [BlockStmt] { ... } -# 1542| getStmt(0): [ReturnStmt] return ... -# 1542| [MoveConstructor] void StructuredBindingTuple::StructuredBindingTuple(StructuredBindingTuple&&) -# 1542| : +#-----| Type = [LValueReferenceType] const tuple_element<2, StructuredBindingTupleRefGet> & +# 1562| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1562| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] StructuredBindingTuple && -# 1548| [MemberFunction,TemplateFunction] type& StructuredBindingTuple::get() -# 1548| : -# 1552| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTuple::get() -# 1552| : -# 1552| getEntryPoint(): [BlockStmt] { ... } -# 1552| getStmt(0): [ReturnStmt] return ... -# 1552| getExpr(): [PointerFieldAccess] i -# 1552| Type = [IntType] int -# 1552| ValueCategory = lvalue -# 1552| getQualifier(): [ThisExpr] this -# 1552| Type = [PointerType] StructuredBindingTuple * -# 1552| ValueCategory = prvalue(load) +#-----| Type = [RValueReferenceType] tuple_element<2, StructuredBindingTupleRefGet> && +# 1567| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1567| : +# 1567| getEntryPoint(): [BlockStmt] { ... } +# 1568| getStmt(0): [ReturnStmt] return ... +# 1568| getExpr(): [PointerFieldAccess] i +# 1568| Type = [IntType] int +# 1568| ValueCategory = lvalue +# 1568| getQualifier(): [ThisExpr] this +# 1568| Type = [PointerType] StructuredBindingTupleRefGet * +# 1568| ValueCategory = prvalue(load) #-----| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] int & #-----| ValueCategory = prvalue -# 1554| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTuple::get() -# 1554| : -# 1554| getEntryPoint(): [BlockStmt] { ... } -# 1554| getStmt(0): [ReturnStmt] return ... -# 1554| getExpr(): [PointerFieldAccess] d -# 1554| Type = [DoubleType] double -# 1554| ValueCategory = lvalue -# 1554| getQualifier(): [ThisExpr] this -# 1554| Type = [PointerType] StructuredBindingTuple * -# 1554| ValueCategory = prvalue(load) +# 1571| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1571| : +# 1571| getEntryPoint(): [BlockStmt] { ... } +# 1572| getStmt(0): [ReturnStmt] return ... +# 1572| getExpr(): [PointerFieldAccess] d +# 1572| Type = [DoubleType] double +# 1572| ValueCategory = lvalue +# 1572| getQualifier(): [ThisExpr] this +# 1572| Type = [PointerType] StructuredBindingTupleRefGet * +# 1572| ValueCategory = prvalue(load) #-----| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] double & #-----| ValueCategory = prvalue -# 1556| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTuple::get() -# 1556| : -# 1556| getEntryPoint(): [BlockStmt] { ... } -# 1556| getStmt(0): [ReturnStmt] return ... -# 1556| getExpr(): [PointerFieldAccess] r -# 1556| Type = [LValueReferenceType] int & -# 1556| ValueCategory = prvalue(load) -# 1556| getQualifier(): [ThisExpr] this -# 1556| Type = [PointerType] StructuredBindingTuple * -# 1556| ValueCategory = prvalue(load) -# 1556| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1556| Type = [LValueReferenceType] int & -# 1556| ValueCategory = prvalue -# 1556| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1556| Type = [IntType] int -# 1556| ValueCategory = lvalue -# 1558| [TopLevelFunction] void tuple_structured_binding() -# 1558| : -# 1558| getEntryPoint(): [BlockStmt] { ... } -# 1559| getStmt(0): [DeclStmt] declaration -# 1559| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t -# 1559| Type = [Struct] StructuredBindingTuple -# 1559| getVariable().getInitializer(): [Initializer] initializer for t -# 1559| getExpr(): [ConstructorCall] call to StructuredBindingTuple -# 1559| Type = [VoidType] void -# 1559| ValueCategory = prvalue -# 1561| getStmt(1): [BlockStmt] { ... } -# 1562| getStmt(0): [DeclStmt] declaration -# 1562| getDeclarationEntry(0): (no string representation) -# 1562| Type = [Struct] StructuredBindingTuple -# 1562| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) -# 1562| getExpr(): [VariableAccess] t -# 1562| Type = [Struct] StructuredBindingTuple -# 1562| ValueCategory = prvalue(load) -# 1562| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i -# 1562| Type = [LValueReferenceType] type & -#-----| getVariable().getInitializer(): [Initializer] initializer for i -# 1562| getExpr(): [FunctionCall] call to get -# 1562| Type = [LValueReferenceType] type & -# 1562| ValueCategory = prvalue -# 1562| getQualifier(): [VariableAccess] (unnamed local variable) -# 1562| Type = [Struct] StructuredBindingTuple -# 1562| ValueCategory = xvalue -# 1562| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1562| Type = [LValueReferenceType] type & -# 1562| ValueCategory = prvalue -# 1562| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1562| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1562| ValueCategory = lvalue -# 1562| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d -# 1562| Type = [LValueReferenceType] type & -#-----| getVariable().getInitializer(): [Initializer] initializer for d -# 1562| getExpr(): [FunctionCall] call to get -# 1562| Type = [LValueReferenceType] type & -# 1562| ValueCategory = prvalue -# 1562| getQualifier(): [VariableAccess] (unnamed local variable) -# 1562| Type = [Struct] StructuredBindingTuple -# 1562| ValueCategory = xvalue -# 1562| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1562| Type = [LValueReferenceType] type & -# 1562| ValueCategory = prvalue -# 1562| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1562| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1562| ValueCategory = lvalue -# 1562| getDeclarationEntry(3): [VariableDeclarationEntry] definition of r -# 1562| Type = [NestedTypedefType,UsingAliasTypedefType] type -#-----| getVariable().getInitializer(): [Initializer] initializer for r -# 1562| getExpr(): [FunctionCall] call to get -# 1562| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1562| ValueCategory = prvalue -# 1562| getQualifier(): [VariableAccess] (unnamed local variable) -# 1562| Type = [Struct] StructuredBindingTuple -# 1562| ValueCategory = xvalue -# 1562| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1562| Type = [LValueReferenceType] int & -# 1562| ValueCategory = prvalue -# 1562| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1562| Type = [IntType] int -# 1562| ValueCategory = lvalue -# 1563| getStmt(1): [ExprStmt] ExprStmt -# 1563| getExpr(): [AssignExpr] ... = ... -# 1563| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1563| ValueCategory = lvalue -# 1563| getLValue(): [VariableAccess] d -# 1563| Type = [LValueReferenceType] type & -# 1563| ValueCategory = prvalue(load) -# 1563| getRValue(): [Literal] 4.0 -# 1563| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1563| Value = [Literal] 4.0 -# 1563| ValueCategory = prvalue -# 1563| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1563| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1563| ValueCategory = lvalue -# 1564| getStmt(2): [DeclStmt] declaration -# 1564| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd -# 1564| Type = [LValueReferenceType] double & -# 1564| getVariable().getInitializer(): [Initializer] initializer for rd -# 1564| getExpr(): [VariableAccess] d -# 1564| Type = [LValueReferenceType] type & -# 1564| ValueCategory = prvalue(load) -# 1564| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1564| Type = [LValueReferenceType] type & -# 1564| ValueCategory = prvalue -# 1564| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1564| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1564| ValueCategory = lvalue -# 1565| getStmt(3): [DeclStmt] declaration -# 1565| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v -# 1565| Type = [IntType] int -# 1565| getVariable().getInitializer(): [Initializer] initializer for v -# 1565| getExpr(): [VariableAccess] i -# 1565| Type = [LValueReferenceType] type & -# 1565| ValueCategory = prvalue(load) -# 1565| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1565| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1565| ValueCategory = prvalue(load) -# 1566| getStmt(4): [ExprStmt] ExprStmt -# 1566| getExpr(): [AssignExpr] ... = ... -# 1566| Type = [IntType] int -# 1566| ValueCategory = lvalue -# 1566| getLValue(): [VariableAccess] r -# 1566| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1566| ValueCategory = prvalue(load) -# 1566| getRValue(): [Literal] 5 -# 1566| Type = [IntType] int -# 1566| Value = [Literal] 5 -# 1566| ValueCategory = prvalue -# 1566| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1566| Type = [IntType] int -# 1566| ValueCategory = lvalue -# 1567| getStmt(5): [DeclStmt] declaration -# 1567| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr -# 1567| Type = [LValueReferenceType] int & -# 1567| getVariable().getInitializer(): [Initializer] initializer for rr -# 1567| getExpr(): [VariableAccess] r -# 1567| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1567| ValueCategory = prvalue(load) -# 1567| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1567| Type = [LValueReferenceType] int & -# 1567| ValueCategory = prvalue -# 1567| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1567| Type = [IntType] int -# 1567| ValueCategory = lvalue -# 1568| getStmt(6): [DeclStmt] declaration -# 1568| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w -# 1568| Type = [IntType] int -# 1568| getVariable().getInitializer(): [Initializer] initializer for w -# 1568| getExpr(): [VariableAccess] r -# 1568| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1568| ValueCategory = prvalue(load) -# 1568| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1568| Type = [IntType] int -# 1568| ValueCategory = prvalue(load) -# 1571| getStmt(2): [BlockStmt] { ... } -# 1572| getStmt(0): [DeclStmt] declaration -# 1572| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable -# 1572| Type = [Struct] StructuredBindingTuple -# 1572| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable -# 1572| getExpr(): [VariableAccess] t -# 1572| Type = [Struct] StructuredBindingTuple -# 1572| ValueCategory = prvalue(load) -# 1573| getStmt(1): [DeclStmt] declaration -# 1573| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i -# 1573| Type = [LValueReferenceType] type & -# 1573| getVariable().getInitializer(): [Initializer] initializer for i -# 1573| getExpr(): [FunctionCall] call to get -# 1573| Type = [LValueReferenceType] type & -# 1573| ValueCategory = prvalue -# 1573| getQualifier(): [VariableAccess] unnamed_local_variable -# 1573| Type = [Struct] StructuredBindingTuple -# 1573| ValueCategory = lvalue -# 1573| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1573| Type = [LValueReferenceType] type & -# 1573| ValueCategory = prvalue -# 1573| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1573| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1573| ValueCategory = lvalue -# 1574| getStmt(2): [DeclStmt] declaration -# 1574| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d -# 1574| Type = [LValueReferenceType] type & -# 1574| getVariable().getInitializer(): [Initializer] initializer for d -# 1574| getExpr(): [FunctionCall] call to get -# 1574| Type = [LValueReferenceType] type & -# 1574| ValueCategory = prvalue -# 1574| getQualifier(): [VariableAccess] unnamed_local_variable -# 1574| Type = [Struct] StructuredBindingTuple -# 1574| ValueCategory = lvalue -# 1574| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1574| Type = [LValueReferenceType] type & -# 1574| ValueCategory = prvalue -# 1574| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1574| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1574| ValueCategory = lvalue -# 1575| getStmt(3): [DeclStmt] declaration -# 1575| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r -# 1575| Type = [LValueReferenceType] int & -# 1575| getVariable().getInitializer(): [Initializer] initializer for r -# 1575| getExpr(): [FunctionCall] call to get -# 1575| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1575| ValueCategory = prvalue -# 1575| getQualifier(): [VariableAccess] unnamed_local_variable -# 1575| Type = [Struct] StructuredBindingTuple -# 1575| ValueCategory = lvalue -# 1575| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1575| Type = [LValueReferenceType] int & -# 1575| ValueCategory = prvalue -# 1575| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1575| Type = [IntType] int -# 1575| ValueCategory = lvalue -# 1576| getStmt(4): [ExprStmt] ExprStmt -# 1576| getExpr(): [AssignExpr] ... = ... -# 1576| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1575| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleRefGet::get() +# 1575| : +# 1575| getEntryPoint(): [BlockStmt] { ... } +# 1576| getStmt(0): [ReturnStmt] return ... +# 1576| getExpr(): [PointerFieldAccess] r +# 1576| Type = [LValueReferenceType] int & +# 1576| ValueCategory = prvalue(load) +# 1576| getQualifier(): [ThisExpr] this +# 1576| Type = [PointerType] StructuredBindingTupleRefGet * +# 1576| ValueCategory = prvalue(load) +# 1576| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1576| Type = [LValueReferenceType] int & +# 1576| ValueCategory = prvalue +# 1576| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1576| Type = [IntType] int # 1576| ValueCategory = lvalue -# 1576| getLValue(): [VariableAccess] d -# 1576| Type = [LValueReferenceType] type & -# 1576| ValueCategory = prvalue(load) -# 1576| getRValue(): [Literal] 4.0 -# 1576| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1576| Value = [Literal] 4.0 -# 1576| ValueCategory = prvalue -# 1576| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1576| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1576| ValueCategory = lvalue -# 1577| getStmt(5): [DeclStmt] declaration -# 1577| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd -# 1577| Type = [LValueReferenceType] double & -# 1577| getVariable().getInitializer(): [Initializer] initializer for rd -# 1577| getExpr(): [VariableAccess] d -# 1577| Type = [LValueReferenceType] type & -# 1577| ValueCategory = prvalue(load) -# 1577| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1577| Type = [LValueReferenceType] type & -# 1577| ValueCategory = prvalue -# 1577| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1577| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1577| ValueCategory = lvalue -# 1578| getStmt(6): [DeclStmt] declaration -# 1578| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v -# 1578| Type = [IntType] int -# 1578| getVariable().getInitializer(): [Initializer] initializer for v -# 1578| getExpr(): [VariableAccess] i -# 1578| Type = [LValueReferenceType] type & -# 1578| ValueCategory = prvalue(load) -# 1578| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1578| Type = [NestedTypedefType,UsingAliasTypedefType] type -# 1578| ValueCategory = prvalue(load) -# 1579| getStmt(7): [ExprStmt] ExprStmt -# 1579| getExpr(): [AssignExpr] ... = ... -# 1579| Type = [IntType] int -# 1579| ValueCategory = lvalue -# 1579| getLValue(): [VariableAccess] r -# 1579| Type = [LValueReferenceType] int & -# 1579| ValueCategory = prvalue(load) -# 1579| getRValue(): [Literal] 5 -# 1579| Type = [IntType] int -# 1579| Value = [Literal] 5 -# 1579| ValueCategory = prvalue -# 1579| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1579| Type = [IntType] int -# 1579| ValueCategory = lvalue -# 1580| getStmt(8): [DeclStmt] declaration -# 1580| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr -# 1580| Type = [LValueReferenceType] int & -# 1580| getVariable().getInitializer(): [Initializer] initializer for rr -# 1580| getExpr(): [VariableAccess] r -# 1580| Type = [LValueReferenceType] int & -# 1580| ValueCategory = prvalue(load) -# 1580| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) -# 1580| Type = [LValueReferenceType] int & -# 1580| ValueCategory = prvalue -# 1580| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1580| Type = [IntType] int -# 1580| ValueCategory = lvalue -# 1581| getStmt(9): [DeclStmt] declaration -# 1581| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w -# 1581| Type = [IntType] int -# 1581| getVariable().getInitializer(): [Initializer] initializer for w -# 1581| getExpr(): [VariableAccess] r -# 1581| Type = [LValueReferenceType] int & -# 1581| ValueCategory = prvalue(load) -# 1581| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1581| Type = [IntType] int -# 1581| ValueCategory = prvalue(load) -# 1583| getStmt(3): [ReturnStmt] return ... +# 1579| [TopLevelFunction] void tuple_structured_binding_ref_get() +# 1579| : +# 1579| getEntryPoint(): [BlockStmt] { ... } +# 1580| getStmt(0): [DeclStmt] declaration +# 1580| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 1580| Type = [Struct] StructuredBindingTupleRefGet +# 1580| getVariable().getInitializer(): [Initializer] initializer for t +# 1580| getExpr(): [ConstructorCall] call to StructuredBindingTupleRefGet +# 1580| Type = [VoidType] void +# 1580| ValueCategory = prvalue +# 1582| getStmt(1): [BlockStmt] { ... } +# 1583| getStmt(0): [DeclStmt] declaration +# 1583| getDeclarationEntry(0): (no string representation) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1583| getExpr(): [VariableAccess] t +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = prvalue(load) +# 1583| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1583| Type = [LValueReferenceType] type & +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = lvalue +# 1583| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d +# 1583| Type = [LValueReferenceType] type & +#-----| getVariable().getInitializer(): [Initializer] initializer for d +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = lvalue +# 1583| getDeclarationEntry(3): [VariableDeclarationEntry] definition of r +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] int & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [IntType] int +# 1583| ValueCategory = lvalue +# 1584| getStmt(1): [ExprStmt] ExprStmt +# 1584| getExpr(): [AssignExpr] ... = ... +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| ValueCategory = lvalue +# 1584| getLValue(): [VariableAccess] d +# 1584| Type = [LValueReferenceType] type & +# 1584| ValueCategory = prvalue(load) +# 1584| getRValue(): [Literal] 4.0 +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| Value = [Literal] 4.0 +# 1584| ValueCategory = prvalue +# 1584| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| ValueCategory = lvalue +# 1585| getStmt(2): [DeclStmt] declaration +# 1585| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1585| Type = [LValueReferenceType] double & +# 1585| getVariable().getInitializer(): [Initializer] initializer for rd +# 1585| getExpr(): [VariableAccess] d +# 1585| Type = [LValueReferenceType] type & +# 1585| ValueCategory = prvalue(load) +# 1585| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1585| Type = [LValueReferenceType] type & +# 1585| ValueCategory = prvalue +# 1585| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1585| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1585| ValueCategory = lvalue +# 1586| getStmt(3): [DeclStmt] declaration +# 1586| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1586| Type = [IntType] int +# 1586| getVariable().getInitializer(): [Initializer] initializer for v +# 1586| getExpr(): [VariableAccess] i +# 1586| Type = [LValueReferenceType] type & +# 1586| ValueCategory = prvalue(load) +# 1586| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1586| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1586| ValueCategory = prvalue(load) +# 1587| getStmt(4): [ExprStmt] ExprStmt +# 1587| getExpr(): [AssignExpr] ... = ... +# 1587| Type = [IntType] int +# 1587| ValueCategory = lvalue +# 1587| getLValue(): [VariableAccess] r +# 1587| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1587| ValueCategory = prvalue(load) +# 1587| getRValue(): [Literal] 5 +# 1587| Type = [IntType] int +# 1587| Value = [Literal] 5 +# 1587| ValueCategory = prvalue +# 1587| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1587| Type = [IntType] int +# 1587| ValueCategory = lvalue +# 1588| getStmt(5): [DeclStmt] declaration +# 1588| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1588| Type = [LValueReferenceType] int & +# 1588| getVariable().getInitializer(): [Initializer] initializer for rr +# 1588| getExpr(): [VariableAccess] r +# 1588| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1588| ValueCategory = prvalue(load) +# 1588| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1588| Type = [LValueReferenceType] int & +# 1588| ValueCategory = prvalue +# 1588| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1588| Type = [IntType] int +# 1588| ValueCategory = lvalue +# 1589| getStmt(6): [DeclStmt] declaration +# 1589| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1589| Type = [IntType] int +# 1589| getVariable().getInitializer(): [Initializer] initializer for w +# 1589| getExpr(): [VariableAccess] r +# 1589| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1589| ValueCategory = prvalue(load) +# 1589| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1589| Type = [IntType] int +# 1589| ValueCategory = prvalue(load) +# 1592| getStmt(2): [BlockStmt] { ... } +# 1593| getStmt(0): [DeclStmt] declaration +# 1593| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1593| Type = [Struct] StructuredBindingTupleRefGet +# 1593| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1593| getExpr(): [VariableAccess] t +# 1593| Type = [Struct] StructuredBindingTupleRefGet +# 1593| ValueCategory = prvalue(load) +# 1594| getStmt(1): [DeclStmt] declaration +# 1594| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1594| Type = [LValueReferenceType] type & +# 1594| getVariable().getInitializer(): [Initializer] initializer for i +# 1594| getExpr(): [FunctionCall] call to get +# 1594| Type = [LValueReferenceType] type & +# 1594| ValueCategory = prvalue +# 1594| getQualifier(): [VariableAccess] unnamed_local_variable +# 1594| Type = [Struct] StructuredBindingTupleRefGet +# 1594| ValueCategory = lvalue +# 1594| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1594| Type = [LValueReferenceType] type & +# 1594| ValueCategory = prvalue +# 1594| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1594| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1594| ValueCategory = lvalue +# 1595| getStmt(2): [DeclStmt] declaration +# 1595| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1595| Type = [LValueReferenceType] type & +# 1595| getVariable().getInitializer(): [Initializer] initializer for d +# 1595| getExpr(): [FunctionCall] call to get +# 1595| Type = [LValueReferenceType] type & +# 1595| ValueCategory = prvalue +# 1595| getQualifier(): [VariableAccess] unnamed_local_variable +# 1595| Type = [Struct] StructuredBindingTupleRefGet +# 1595| ValueCategory = lvalue +# 1595| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1595| Type = [LValueReferenceType] type & +# 1595| ValueCategory = prvalue +# 1595| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1595| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1595| ValueCategory = lvalue +# 1596| getStmt(3): [DeclStmt] declaration +# 1596| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1596| Type = [LValueReferenceType] int & +# 1596| getVariable().getInitializer(): [Initializer] initializer for r +# 1596| getExpr(): [FunctionCall] call to get +# 1596| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1596| ValueCategory = prvalue +# 1596| getQualifier(): [VariableAccess] unnamed_local_variable +# 1596| Type = [Struct] StructuredBindingTupleRefGet +# 1596| ValueCategory = lvalue +# 1596| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1596| Type = [LValueReferenceType] int & +# 1596| ValueCategory = prvalue +# 1596| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1596| Type = [IntType] int +# 1596| ValueCategory = lvalue +# 1597| getStmt(4): [ExprStmt] ExprStmt +# 1597| getExpr(): [AssignExpr] ... = ... +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| ValueCategory = lvalue +# 1597| getLValue(): [VariableAccess] d +# 1597| Type = [LValueReferenceType] type & +# 1597| ValueCategory = prvalue(load) +# 1597| getRValue(): [Literal] 4.0 +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| Value = [Literal] 4.0 +# 1597| ValueCategory = prvalue +# 1597| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| ValueCategory = lvalue +# 1598| getStmt(5): [DeclStmt] declaration +# 1598| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1598| Type = [LValueReferenceType] double & +# 1598| getVariable().getInitializer(): [Initializer] initializer for rd +# 1598| getExpr(): [VariableAccess] d +# 1598| Type = [LValueReferenceType] type & +# 1598| ValueCategory = prvalue(load) +# 1598| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1598| Type = [LValueReferenceType] type & +# 1598| ValueCategory = prvalue +# 1598| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1598| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1598| ValueCategory = lvalue +# 1599| getStmt(6): [DeclStmt] declaration +# 1599| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1599| Type = [IntType] int +# 1599| getVariable().getInitializer(): [Initializer] initializer for v +# 1599| getExpr(): [VariableAccess] i +# 1599| Type = [LValueReferenceType] type & +# 1599| ValueCategory = prvalue(load) +# 1599| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1599| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1599| ValueCategory = prvalue(load) +# 1600| getStmt(7): [ExprStmt] ExprStmt +# 1600| getExpr(): [AssignExpr] ... = ... +# 1600| Type = [IntType] int +# 1600| ValueCategory = lvalue +# 1600| getLValue(): [VariableAccess] r +# 1600| Type = [LValueReferenceType] int & +# 1600| ValueCategory = prvalue(load) +# 1600| getRValue(): [Literal] 5 +# 1600| Type = [IntType] int +# 1600| Value = [Literal] 5 +# 1600| ValueCategory = prvalue +# 1600| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1600| Type = [IntType] int +# 1600| ValueCategory = lvalue +# 1601| getStmt(8): [DeclStmt] declaration +# 1601| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1601| Type = [LValueReferenceType] int & +# 1601| getVariable().getInitializer(): [Initializer] initializer for rr +# 1601| getExpr(): [VariableAccess] r +# 1601| Type = [LValueReferenceType] int & +# 1601| ValueCategory = prvalue(load) +# 1601| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1601| Type = [LValueReferenceType] int & +# 1601| ValueCategory = prvalue +# 1601| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1601| Type = [IntType] int +# 1601| ValueCategory = lvalue +# 1602| getStmt(9): [DeclStmt] declaration +# 1602| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1602| Type = [IntType] int +# 1602| getVariable().getInitializer(): [Initializer] initializer for w +# 1602| getExpr(): [VariableAccess] r +# 1602| Type = [LValueReferenceType] int & +# 1602| ValueCategory = prvalue(load) +# 1602| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1602| Type = [IntType] int +# 1602| ValueCategory = prvalue(load) +# 1604| getStmt(3): [ReturnStmt] return ... +# 1606| [CopyAssignmentOperator] StructuredBindingTupleNoRefGet& StructuredBindingTupleNoRefGet::operator=(StructuredBindingTupleNoRefGet const&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleNoRefGet & +# 1606| [Constructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() +# 1606| : +# 1606| : +# 1606| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1606| Type = [IntType] int +# 1606| ValueCategory = prvalue +# 1606| getInitializer(1): [ConstructorFieldInit] constructor init of field r +# 1606| Type = [LValueReferenceType] int & +# 1606| ValueCategory = prvalue +# 1606| getEntryPoint(): [BlockStmt] { ... } +# 1606| getStmt(0): [ReturnStmt] return ... +# 1606| [CopyConstructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet(StructuredBindingTupleNoRefGet const&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleNoRefGet & +# 1606| [MoveConstructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet(StructuredBindingTupleNoRefGet&&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingTupleNoRefGet && +# 1611| [MemberFunction,TemplateFunction] type StructuredBindingTupleNoRefGet::get() +# 1611| : +# 1615| [CopyAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size const&) +# 1615| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_size & +# 1615| [MoveAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size&&) +# 1615| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_size && +# 1620| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1620| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<0, StructuredBindingTupleNoRefGet> & +# 1620| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1620| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<0, StructuredBindingTupleNoRefGet> && +# 1624| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1624| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<1, StructuredBindingTupleNoRefGet> & +# 1624| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1624| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<1, StructuredBindingTupleNoRefGet> && +# 1628| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1628| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<2, StructuredBindingTupleNoRefGet> & +# 1628| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1628| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<2, StructuredBindingTupleNoRefGet> && +# 1633| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1633| : +# 1633| getEntryPoint(): [BlockStmt] { ... } +# 1634| getStmt(0): [ReturnStmt] return ... +# 1634| getExpr(): [PointerFieldAccess] i +# 1634| Type = [IntType] int +# 1634| ValueCategory = prvalue(load) +# 1634| getQualifier(): [ThisExpr] this +# 1634| Type = [PointerType] StructuredBindingTupleNoRefGet * +# 1634| ValueCategory = prvalue(load) +# 1637| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1637| : +# 1637| getEntryPoint(): [BlockStmt] { ... } +# 1638| getStmt(0): [ReturnStmt] return ... +# 1638| getExpr(): [PointerFieldAccess] r +# 1638| Type = [LValueReferenceType] int & +# 1638| ValueCategory = prvalue(load) +# 1638| getQualifier(): [ThisExpr] this +# 1638| Type = [PointerType] StructuredBindingTupleNoRefGet * +# 1638| ValueCategory = prvalue(load) +# 1638| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1638| Type = [LValueReferenceType] int & +# 1638| ValueCategory = prvalue +# 1638| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1638| Type = [IntType] int +# 1638| ValueCategory = lvalue +# 1641| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1641| : +# 1641| getEntryPoint(): [BlockStmt] { ... } +# 1642| getStmt(0): [ReturnStmt] return ... +# 1642| getExpr(): [Literal] 5 +# 1642| Type = [IntType] int +# 1642| Value = [Literal] 5 +# 1642| ValueCategory = prvalue +# 1642| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1642| Type = [LValueReferenceType] int & +# 1642| ValueCategory = prvalue +# 1642| getExpr(): [TemporaryObjectExpr] temporary object +# 1642| Type = [IntType] int +# 1642| ValueCategory = lvalue +# 1645| [TopLevelFunction] void tuple_structured_binding_no_ref_get() +# 1645| : +# 1645| getEntryPoint(): [BlockStmt] { ... } +# 1646| getStmt(0): [DeclStmt] declaration +# 1646| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 1646| Type = [Struct] StructuredBindingTupleNoRefGet +# 1646| getVariable().getInitializer(): [Initializer] initializer for t +# 1646| getExpr(): [ConstructorCall] call to StructuredBindingTupleNoRefGet +# 1646| Type = [VoidType] void +# 1646| ValueCategory = prvalue +# 1648| getStmt(1): [BlockStmt] { ... } +# 1649| getStmt(0): [DeclStmt] declaration +# 1649| getDeclarationEntry(0): (no string representation) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1649| getExpr(): [VariableAccess] t +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue +# 1649| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1649| Type = [RValueReferenceType] type && +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] type & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [TemporaryObjectExpr] temporary object +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = lvalue +# 1649| getDeclarationEntry(2): [VariableDeclarationEntry] definition of r +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] int & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [IntType] int +# 1649| ValueCategory = lvalue +# 1649| getDeclarationEntry(3): [VariableDeclarationEntry] definition of rv +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for rv +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] int & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [IntType] int +# 1649| ValueCategory = xvalue +# 1650| getStmt(1): [ExprStmt] ExprStmt +# 1650| getExpr(): [AssignExpr] ... = ... +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| ValueCategory = lvalue +# 1650| getLValue(): [VariableAccess] i +# 1650| Type = [RValueReferenceType] type && +# 1650| ValueCategory = prvalue(load) +# 1650| getRValue(): [Literal] 4 +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| Value = [Literal] 4 +# 1650| ValueCategory = prvalue +# 1650| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| ValueCategory = lvalue +# 1651| getStmt(2): [DeclStmt] declaration +# 1651| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri +# 1651| Type = [LValueReferenceType] int & +# 1651| getVariable().getInitializer(): [Initializer] initializer for ri +# 1651| getExpr(): [VariableAccess] i +# 1651| Type = [RValueReferenceType] type && +# 1651| ValueCategory = prvalue(load) +# 1651| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1651| Type = [LValueReferenceType] type & +# 1651| ValueCategory = prvalue +# 1651| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1651| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1651| ValueCategory = lvalue +# 1652| getStmt(3): [DeclStmt] declaration +# 1652| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1652| Type = [IntType] int +# 1652| getVariable().getInitializer(): [Initializer] initializer for v +# 1652| getExpr(): [VariableAccess] i +# 1652| Type = [RValueReferenceType] type && +# 1652| ValueCategory = prvalue(load) +# 1652| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1652| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1652| ValueCategory = prvalue(load) +# 1653| getStmt(4): [ExprStmt] ExprStmt +# 1653| getExpr(): [AssignExpr] ... = ... +# 1653| Type = [IntType] int +# 1653| ValueCategory = lvalue +# 1653| getLValue(): [VariableAccess] r +# 1653| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1653| ValueCategory = prvalue(load) +# 1653| getRValue(): [Literal] 5 +# 1653| Type = [IntType] int +# 1653| Value = [Literal] 5 +# 1653| ValueCategory = prvalue +# 1653| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1653| Type = [IntType] int +# 1653| ValueCategory = lvalue +# 1654| getStmt(5): [DeclStmt] declaration +# 1654| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1654| Type = [LValueReferenceType] int & +# 1654| getVariable().getInitializer(): [Initializer] initializer for rr +# 1654| getExpr(): [VariableAccess] r +# 1654| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1654| ValueCategory = prvalue(load) +# 1654| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1654| Type = [LValueReferenceType] int & +# 1654| ValueCategory = prvalue +# 1654| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1654| Type = [IntType] int +# 1654| ValueCategory = lvalue +# 1655| getStmt(6): [DeclStmt] declaration +# 1655| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1655| Type = [IntType] int +# 1655| getVariable().getInitializer(): [Initializer] initializer for w +# 1655| getExpr(): [VariableAccess] r +# 1655| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1655| ValueCategory = prvalue(load) +# 1655| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1655| Type = [IntType] int +# 1655| ValueCategory = prvalue(load) +# 1658| getStmt(2): [BlockStmt] { ... } +# 1659| getStmt(0): [DeclStmt] declaration +# 1659| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1659| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1659| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1659| getExpr(): [VariableAccess] t +# 1659| Type = [Struct] StructuredBindingTupleNoRefGet +# 1659| ValueCategory = lvalue +# 1659| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1659| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1659| ValueCategory = prvalue +# 1660| getStmt(1): [DeclStmt] declaration +# 1660| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1660| Type = [RValueReferenceType] type && +# 1660| getVariable().getInitializer(): [Initializer] initializer for i +# 1660| getExpr(): [FunctionCall] call to get +# 1660| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1660| ValueCategory = prvalue +# 1660| getQualifier(): [VariableAccess] unnamed_local_variable +# 1660| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1660| ValueCategory = prvalue(load) +# 1660| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1660| Type = [Struct] StructuredBindingTupleNoRefGet +# 1660| ValueCategory = lvalue +# 1660| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1660| Type = [LValueReferenceType] type & +# 1660| ValueCategory = prvalue +# 1660| getExpr(): [TemporaryObjectExpr] temporary object +# 1660| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1660| ValueCategory = lvalue +# 1661| getStmt(2): [DeclStmt] declaration +# 1661| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1661| Type = [LValueReferenceType] int & +# 1661| getVariable().getInitializer(): [Initializer] initializer for r +# 1661| getExpr(): [FunctionCall] call to get +# 1661| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1661| ValueCategory = prvalue +# 1661| getQualifier(): [VariableAccess] unnamed_local_variable +# 1661| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1661| ValueCategory = prvalue(load) +# 1661| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1661| Type = [Struct] StructuredBindingTupleNoRefGet +# 1661| ValueCategory = lvalue +# 1661| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1661| Type = [LValueReferenceType] int & +# 1661| ValueCategory = prvalue +# 1661| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1661| Type = [IntType] int +# 1661| ValueCategory = lvalue +# 1662| getStmt(3): [DeclStmt] declaration +# 1662| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rv +# 1662| Type = [RValueReferenceType] int && +# 1662| getVariable().getInitializer(): [Initializer] initializer for rv +# 1662| getExpr(): [FunctionCall] call to get +# 1662| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1662| ValueCategory = prvalue +# 1662| getQualifier(): [VariableAccess] unnamed_local_variable +# 1662| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1662| ValueCategory = prvalue(load) +# 1662| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1662| Type = [Struct] StructuredBindingTupleNoRefGet +# 1662| ValueCategory = lvalue +# 1662| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1662| Type = [LValueReferenceType] int & +# 1662| ValueCategory = prvalue +# 1662| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1662| Type = [IntType] int +# 1662| ValueCategory = xvalue +# 1663| getStmt(4): [ExprStmt] ExprStmt +# 1663| getExpr(): [AssignExpr] ... = ... +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| ValueCategory = lvalue +# 1663| getLValue(): [VariableAccess] i +# 1663| Type = [RValueReferenceType] type && +# 1663| ValueCategory = prvalue(load) +# 1663| getRValue(): [Literal] 4 +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| Value = [Literal] 4 +# 1663| ValueCategory = prvalue +# 1663| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| ValueCategory = lvalue +# 1664| getStmt(5): [DeclStmt] declaration +# 1664| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri +# 1664| Type = [LValueReferenceType] int & +# 1664| getVariable().getInitializer(): [Initializer] initializer for ri +# 1664| getExpr(): [VariableAccess] i +# 1664| Type = [RValueReferenceType] type && +# 1664| ValueCategory = prvalue(load) +# 1664| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1664| Type = [LValueReferenceType] type & +# 1664| ValueCategory = prvalue +# 1664| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1664| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1664| ValueCategory = lvalue +# 1665| getStmt(6): [DeclStmt] declaration +# 1665| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1665| Type = [IntType] int +# 1665| getVariable().getInitializer(): [Initializer] initializer for v +# 1665| getExpr(): [VariableAccess] i +# 1665| Type = [RValueReferenceType] type && +# 1665| ValueCategory = prvalue(load) +# 1665| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1665| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1665| ValueCategory = prvalue(load) +# 1666| getStmt(7): [ExprStmt] ExprStmt +# 1666| getExpr(): [AssignExpr] ... = ... +# 1666| Type = [IntType] int +# 1666| ValueCategory = lvalue +# 1666| getLValue(): [VariableAccess] r +# 1666| Type = [LValueReferenceType] int & +# 1666| ValueCategory = prvalue(load) +# 1666| getRValue(): [Literal] 5 +# 1666| Type = [IntType] int +# 1666| Value = [Literal] 5 +# 1666| ValueCategory = prvalue +# 1666| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1666| Type = [IntType] int +# 1666| ValueCategory = lvalue +# 1667| getStmt(8): [DeclStmt] declaration +# 1667| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1667| Type = [LValueReferenceType] int & +# 1667| getVariable().getInitializer(): [Initializer] initializer for rr +# 1667| getExpr(): [VariableAccess] r +# 1667| Type = [LValueReferenceType] int & +# 1667| ValueCategory = prvalue(load) +# 1667| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1667| Type = [LValueReferenceType] int & +# 1667| ValueCategory = prvalue +# 1667| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1667| Type = [IntType] int +# 1667| ValueCategory = lvalue +# 1668| getStmt(9): [DeclStmt] declaration +# 1668| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1668| Type = [IntType] int +# 1668| getVariable().getInitializer(): [Initializer] initializer for w +# 1668| getExpr(): [VariableAccess] r +# 1668| Type = [LValueReferenceType] int & +# 1668| ValueCategory = prvalue(load) +# 1668| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1668| Type = [IntType] int +# 1668| ValueCategory = prvalue(load) +# 1670| getStmt(3): [ReturnStmt] return ... +# 1672| [TopLevelFunction] void array_structured_binding_non_ref_init() +# 1672| : +# 1672| getEntryPoint(): [BlockStmt] { ... } +# 1673| getStmt(0): [DeclStmt] declaration +# 1673| getDeclarationEntry(0): [VariableDeclarationEntry] definition of xs +# 1673| Type = [ArrayType] int[2] +# 1673| getVariable().getInitializer(): [Initializer] initializer for xs +# 1673| getExpr(): [ArrayAggregateLiteral] {...} +# 1673| Type = [ArrayType] int[2] +# 1673| ValueCategory = prvalue +# 1673| getElementExpr(0): [Literal] 1 +# 1673| Type = [IntType] int +# 1673| Value = [Literal] 1 +# 1673| ValueCategory = prvalue +# 1673| getElementExpr(1): [Literal] 2 +# 1673| Type = [IntType] int +# 1673| Value = [Literal] 2 +# 1673| ValueCategory = prvalue +# 1674| getStmt(1): [DeclStmt] declaration +# 1674| getDeclarationEntry(0): (no string representation) +# 1674| Type = [ArrayType] int[2] +# 1674| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1674| getExpr(): [VariableAccess] xs +# 1674| Type = [ArrayType] int[2] +# 1674| ValueCategory = prvalue(load) +# 1674| getDeclarationEntry(1): [VariableDeclarationEntry] definition of x0 +# 1674| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for x0 +#-----| getExpr(): [ArrayExpr] access to array +#-----| Type = [IntType] int +#-----| ValueCategory = lvalue +#-----| getArrayBase(): [VariableAccess] (unnamed local variable) +#-----| Type = [ArrayType] int[2] +#-----| ValueCategory = lvalue +#-----| getArrayOffset(): [Literal] 0 +#-----| Type = [LongType] unsigned long +#-----| Value = [Literal] 0 +#-----| ValueCategory = prvalue +#-----| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +#-----| Type = [IntPointerType] int * +#-----| ValueCategory = prvalue +# 1674| getDeclarationEntry(2): [VariableDeclarationEntry] definition of x1 +# 1674| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for x1 +#-----| getExpr(): [ArrayExpr] access to array +#-----| Type = [IntType] int +#-----| ValueCategory = lvalue +#-----| getArrayBase(): [VariableAccess] (unnamed local variable) +#-----| Type = [ArrayType] int[2] +#-----| ValueCategory = lvalue +#-----| getArrayOffset(): [Literal] 1 +#-----| Type = [LongType] unsigned long +#-----| Value = [Literal] 1 +#-----| ValueCategory = prvalue +#-----| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +#-----| Type = [IntPointerType] int * +#-----| ValueCategory = prvalue +# 1675| getStmt(2): [ReturnStmt] return ... +# 1677| [CopyAssignmentOperator] CapturedLambdaMyObj& CapturedLambdaMyObj::operator=(CapturedLambdaMyObj const&) +# 1677| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1677| [MoveAssignmentOperator] CapturedLambdaMyObj& CapturedLambdaMyObj::operator=(CapturedLambdaMyObj&&) +# 1677| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CapturedLambdaMyObj && +# 1677| [CopyConstructor] void CapturedLambdaMyObj::CapturedLambdaMyObj(CapturedLambdaMyObj const&) +# 1677| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1677| [MoveConstructor] void CapturedLambdaMyObj::CapturedLambdaMyObj(CapturedLambdaMyObj&&) +# 1677| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CapturedLambdaMyObj && +# 1680| [Constructor] void CapturedLambdaMyObj::CapturedLambdaMyObj() +# 1680| : +# 1680| : +# 1680| getEntryPoint(): [BlockStmt] { ... } +# 1680| getStmt(0): [ReturnStmt] return ... +# 1683| [TopLevelFunction] void captured_lambda(int, int&, int&&) +# 1683| : +# 1683| getParameter(0): [Parameter] x +# 1683| Type = [IntType] int +# 1683| getParameter(1): [Parameter] y +# 1683| Type = [LValueReferenceType] int & +# 1683| getParameter(2): [Parameter] z +# 1683| Type = [RValueReferenceType] int && +# 1684| getEntryPoint(): [BlockStmt] { ... } +# 1685| getStmt(0): [DeclStmt] declaration +# 1685| getDeclarationEntry(0): [VariableDeclarationEntry] definition of obj1 +# 1685| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1685| getVariable().getInitializer(): [Initializer] initializer for obj1 +# 1685| getExpr(): [ConstructorCall] call to CapturedLambdaMyObj +# 1685| Type = [VoidType] void +# 1685| ValueCategory = prvalue +# 1685| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1685| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1685| ValueCategory = prvalue +# 1685| getExpr(): [CStyleCast] (const CapturedLambdaMyObj)... +# 1685| Conversion = [GlvalueConversion] glvalue conversion +# 1685| Type = [SpecifiedType] const CapturedLambdaMyObj +# 1685| ValueCategory = lvalue +# 1685| getExpr(): [TemporaryObjectExpr] temporary object +# 1685| Type = [Class] CapturedLambdaMyObj +# 1685| ValueCategory = lvalue +# 1686| getStmt(1): [DeclStmt] declaration +# 1686| getDeclarationEntry(0): [VariableDeclarationEntry] definition of obj2 +# 1686| Type = [Class] CapturedLambdaMyObj +# 1686| getVariable().getInitializer(): [Initializer] initializer for obj2 +# 1686| getExpr(): [ConstructorCall] call to CapturedLambdaMyObj +# 1686| Type = [VoidType] void +# 1686| ValueCategory = prvalue +# 1688| getStmt(2): [DeclStmt] declaration +# 1688| getDeclarationEntry(0): [VariableDeclarationEntry] definition of lambda_outer +# 1688| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1688| getVariable().getInitializer(): [Initializer] initializer for lambda_outer +# 1688| getExpr(): [LambdaExpression] [...](...){...} +# 1688| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1688| ValueCategory = prvalue +# 1688| getInitializer(): [ClassAggregateLiteral] {...} +# 1688| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1688| ValueCategory = prvalue +# 1688| getFieldExpr(obj1): [VariableAccess] obj1 +# 1688| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1688| ValueCategory = prvalue(load) +# 1688| getFieldExpr(obj2): [VariableAccess] obj2 +# 1688| Type = [Class] CapturedLambdaMyObj +# 1688| ValueCategory = prvalue(load) +# 1688| getFieldExpr(x): [VariableAccess] x +# 1688| Type = [IntType] int +# 1688| ValueCategory = prvalue(load) +# 1688| getFieldExpr(y): [VariableAccess] y +# 1688| Type = [LValueReferenceType] int & +# 1688| ValueCategory = prvalue(load) +# 1688| getFieldExpr(z): [VariableAccess] z +# 1688| Type = [RValueReferenceType] int && +# 1688| ValueCategory = prvalue(load) +#-----| getFieldExpr(obj1).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const CapturedLambdaMyObj +#-----| ValueCategory = prvalue(load) +# 1690| getFieldExpr(y).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1690| Type = [IntType] int +# 1690| ValueCategory = prvalue(load) +# 1690| getFieldExpr(z).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1690| Type = [IntType] int +# 1690| ValueCategory = prvalue(load) +# 1691| getStmt(3): [ReturnStmt] return ... +# 1688| [CopyAssignmentOperator] (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)& (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator=((void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25) const&) +# 1688| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1688, col. 25 & +# 1688| [CopyConstructor] void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::(unnamed constructor)((void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25) const&) +# 1688| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1688, col. 25 & +# 1688| [MoveConstructor] void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::(unnamed constructor)((void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)&&) +# 1688| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1688, col. 25 && +# 1688| [Constructor] void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::(unnamed constructor)() +# 1688| : +# 1688| [ConstMemberFunction] void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const +# 1688| : +# 1688| getEntryPoint(): [BlockStmt] { ... } +# 1689| getStmt(0): [DeclStmt] declaration +# 1689| getDeclarationEntry(0): [VariableDeclarationEntry] definition of lambda_inner +# 1689| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1689| getVariable().getInitializer(): [Initializer] initializer for lambda_inner +# 1689| getExpr(): [LambdaExpression] [...](...){...} +# 1689| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1689| ValueCategory = prvalue +# 1689| getInitializer(): [ClassAggregateLiteral] {...} +# 1689| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1689| ValueCategory = prvalue +# 1689| getFieldExpr(obj1): [PointerFieldAccess] obj1 +# 1689| Type = [SpecifiedType] const CapturedLambdaMyObj +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] lambda [] type at line 1689, col. 29 * +# 1689| ValueCategory = prvalue(load) +# 1689| getFieldExpr(obj2): [PointerFieldAccess] obj2 +# 1689| Type = [Class] CapturedLambdaMyObj +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] lambda [] type at line 1689, col. 29 * +# 1689| ValueCategory = prvalue(load) +# 1689| getFieldExpr(x): [PointerFieldAccess] x +# 1689| Type = [IntType] int +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] const lambda [] type at line 1688, col. 25 * +# 1689| ValueCategory = prvalue(load) +# 1689| getFieldExpr(y): [PointerFieldAccess] y +# 1689| Type = [IntType] int +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] const lambda [] type at line 1688, col. 25 * +# 1689| ValueCategory = prvalue(load) +# 1689| getFieldExpr(z): [PointerFieldAccess] z +# 1689| Type = [IntType] int +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] const lambda [] type at line 1688, col. 25 * +# 1689| ValueCategory = prvalue(load) +# 1690| getStmt(1): [ReturnStmt] return ... +# 1689| [CopyAssignmentOperator] (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)& (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::operator=((void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29) const&) +# 1689| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1689, col. 29 & +# 1689| [CopyConstructor] void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::(unnamed constructor)((void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29) const&) +# 1689| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1689, col. 29 & +# 1689| [MoveConstructor] void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::(unnamed constructor)((void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)&&) +# 1689| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1689, col. 29 && +# 1689| [Constructor] void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::(unnamed constructor)() +# 1689| : +# 1689| [ConstMemberFunction] void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::operator()() const +# 1689| : +# 1689| getEntryPoint(): [BlockStmt] { ... } +# 1689| getStmt(0): [EmptyStmt] ; +# 1689| getStmt(1): [ReturnStmt] return ... +# 1693| [TopLevelFunction] int goto_on_same_line() +# 1693| : +# 1693| getEntryPoint(): [BlockStmt] { ... } +# 1694| getStmt(0): [DeclStmt] declaration +# 1694| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1694| Type = [IntType] int +# 1694| getVariable().getInitializer(): [Initializer] initializer for x +# 1694| getExpr(): [Literal] 42 +# 1694| Type = [IntType] int +# 1694| Value = [Literal] 42 +# 1694| ValueCategory = prvalue +# 1695| getStmt(1): [GotoStmt] goto ... +# 1695| getStmt(2): [LabelStmt] label ...: +# 1696| getStmt(3): [ReturnStmt] return ... +# 1696| getExpr(): [VariableAccess] x +# 1696| Type = [IntType] int +# 1696| ValueCategory = prvalue(load) +# 1699| [CopyAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass const&) +# 1699| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1699| [MoveAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass&&) +# 1699| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] TrivialLambdaClass && +# 1701| [ConstMemberFunction] void TrivialLambdaClass::m() const +# 1701| : +# 1701| getEntryPoint(): [BlockStmt] { ... } +# 1702| getStmt(0): [DeclStmt] declaration +# 1702| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_m_outer +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| getVariable().getInitializer(): [Initializer] initializer for l_m_outer +# 1702| getExpr(): [LambdaExpression] [...](...){...} +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| ValueCategory = prvalue +# 1702| getInitializer(): [ClassAggregateLiteral] {...} +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| ValueCategory = prvalue +# 1702| getFieldExpr((captured this)): [PointerDereferenceExpr] * ... +# 1702| Type = [SpecifiedType] const TrivialLambdaClass +# 1702| ValueCategory = prvalue(load) +# 1702| getOperand(): [ThisExpr] this +# 1702| Type = [SpecifiedType] const TrivialLambdaClass *const +# 1702| ValueCategory = prvalue(load) +# 1709| getStmt(1): [ReturnStmt] return ... +# 1702| [CopyAssignmentOperator] (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)& (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator=((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26) const&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1702, col. 26 & +# 1702| [CopyConstructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26) const&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1702, col. 26 & +# 1702| [MoveConstructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)&&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1702, col. 26 && +# 1702| [Constructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)() +# 1702| : +# 1702| [ConstMemberFunction] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const +# 1702| : +# 1702| getEntryPoint(): [BlockStmt] { ... } +# 1703| getStmt(0): [ExprStmt] ExprStmt +# 1703| getExpr(): [FunctionCall] call to m +# 1703| Type = [VoidType] void +# 1703| ValueCategory = prvalue +# 1703| getQualifier(): [AddressOfExpr] & ... +# 1703| Type = [PointerType] const TrivialLambdaClass * +# 1703| ValueCategory = prvalue +# 1703| getOperand(): [PointerFieldAccess] (captured this) +# 1703| Type = [SpecifiedType] const TrivialLambdaClass +# 1703| ValueCategory = lvalue +# 1703| getQualifier(): [ThisExpr] this +# 1703| Type = [PointerType] const lambda [] type at line 1702, col. 26 * +# 1703| ValueCategory = prvalue(load) +# 1705| getStmt(1): [DeclStmt] declaration +# 1705| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_m_inner +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| getVariable().getInitializer(): [Initializer] initializer for l_m_inner +# 1705| getExpr(): [LambdaExpression] [...](...){...} +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| ValueCategory = prvalue +# 1705| getInitializer(): [ClassAggregateLiteral] {...} +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| ValueCategory = prvalue +# 1705| getFieldExpr((captured this)): [PointerFieldAccess] (captured this) +# 1705| Type = [SpecifiedType] const TrivialLambdaClass +# 1705| ValueCategory = prvalue(load) +# 1705| getQualifier(): [ThisExpr] this +# 1705| Type = [PointerType] lambda [] type at line 1705, col. 30 * +# 1705| ValueCategory = prvalue(load) +# 1708| getStmt(2): [ReturnStmt] return ... +# 1705| [CopyAssignmentOperator] (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)& (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator=((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30) const&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1705, col. 30 & +# 1705| [CopyConstructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30) const&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1705, col. 30 & +# 1705| [MoveConstructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)&&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1705, col. 30 && +# 1705| [Constructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)() +# 1705| : +# 1705| [ConstMemberFunction] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const +# 1705| : +# 1705| getEntryPoint(): [BlockStmt] { ... } +# 1706| getStmt(0): [ExprStmt] ExprStmt +# 1706| getExpr(): [FunctionCall] call to m +# 1706| Type = [VoidType] void +# 1706| ValueCategory = prvalue +# 1706| getQualifier(): [AddressOfExpr] & ... +# 1706| Type = [PointerType] const TrivialLambdaClass * +# 1706| ValueCategory = prvalue +# 1706| getOperand(): [PointerFieldAccess] (captured this) +# 1706| Type = [SpecifiedType] const TrivialLambdaClass +# 1706| ValueCategory = lvalue +# 1706| getQualifier(): [ThisExpr] this +# 1706| Type = [PointerType] const lambda [] type at line 1705, col. 30 * +# 1706| ValueCategory = prvalue(load) +# 1707| getStmt(1): [ReturnStmt] return ... +# 1712| [TopLevelFunction] void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) +# 1712| : +# 1712| getParameter(0): [Parameter] p1 +# 1712| Type = [Class] TrivialLambdaClass +# 1712| getParameter(1): [Parameter] p2 +# 1712| Type = [LValueReferenceType] TrivialLambdaClass & +# 1712| getParameter(2): [Parameter] p3 +# 1712| Type = [RValueReferenceType] TrivialLambdaClass && +# 1712| getEntryPoint(): [BlockStmt] { ... } +# 1713| getStmt(0): [DeclStmt] declaration +# 1713| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l1 +# 1713| Type = [SpecifiedType] const TrivialLambdaClass +# 1714| getStmt(1): [DeclStmt] declaration +# 1714| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l2 +# 1714| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1714| getVariable().getInitializer(): [Initializer] initializer for l2 +# 1714| getExpr(): [Literal] 0 +# 1714| Type = [Class] TrivialLambdaClass +# 1714| Value = [Literal] 0 +# 1714| ValueCategory = prvalue +# 1714| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1714| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1714| ValueCategory = prvalue +# 1714| getExpr(): [CStyleCast] (const TrivialLambdaClass)... +# 1714| Conversion = [GlvalueConversion] glvalue conversion +# 1714| Type = [SpecifiedType] const TrivialLambdaClass +# 1714| ValueCategory = lvalue +# 1714| getExpr(): [TemporaryObjectExpr] temporary object +# 1714| Type = [Class] TrivialLambdaClass +# 1714| ValueCategory = lvalue +# 1714| getExpr(): [TemporaryObjectExpr] temporary object +# 1714| Type = [Class] TrivialLambdaClass +# 1714| ValueCategory = prvalue(load) +# 1716| getStmt(2): [DeclStmt] declaration +# 1716| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_outer1 +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| getVariable().getInitializer(): [Initializer] initializer for l_outer1 +# 1716| getExpr(): [LambdaExpression] [...](...){...} +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| ValueCategory = prvalue +# 1716| getInitializer(): [ClassAggregateLiteral] {...} +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(p1): [VariableAccess] p1 +# 1716| Type = [Class] TrivialLambdaClass +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(p2): [VariableAccess] p2 +# 1716| Type = [LValueReferenceType] TrivialLambdaClass & +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(p3): [VariableAccess] p3 +# 1716| Type = [RValueReferenceType] TrivialLambdaClass && +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(l1): [VariableAccess] l1 +# 1716| Type = [SpecifiedType] const TrivialLambdaClass +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(l2): [VariableAccess] l2 +# 1716| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1716| ValueCategory = prvalue(load) +#-----| getFieldExpr(p2).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [Class] TrivialLambdaClass +#-----| ValueCategory = prvalue(load) +#-----| getFieldExpr(p3).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [Class] TrivialLambdaClass +#-----| ValueCategory = prvalue(load) +#-----| getFieldExpr(l2).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const TrivialLambdaClass +#-----| ValueCategory = prvalue(load) +# 1719| getStmt(3): [ReturnStmt] return ... +# 1716| [CopyAssignmentOperator] (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)& (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator=((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21) const&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1716, col. 21 & +# 1716| [CopyConstructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21) const&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1716, col. 21 & +# 1716| [MoveConstructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)&&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1716, col. 21 && +# 1716| [Constructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)() +# 1716| : +# 1716| [ConstMemberFunction] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const +# 1716| : +# 1716| getEntryPoint(): [BlockStmt] { ... } +# 1717| getStmt(0): [DeclStmt] declaration +# 1717| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_inner1 +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| getVariable().getInitializer(): [Initializer] initializer for l_inner1 +# 1717| getExpr(): [LambdaExpression] [...](...){...} +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| ValueCategory = prvalue +# 1717| getInitializer(): [ClassAggregateLiteral] {...} +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| ValueCategory = prvalue +# 1717| getFieldExpr(p1): [PointerFieldAccess] p1 +# 1717| Type = [Class] TrivialLambdaClass +# 1717| ValueCategory = prvalue(load) +# 1717| getQualifier(): [ThisExpr] this +# 1717| Type = [PointerType] lambda [] type at line 1717, col. 25 * +# 1717| ValueCategory = prvalue(load) +# 1718| getStmt(1): [ReturnStmt] return ... +# 1717| [CopyAssignmentOperator] (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)& (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator=((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25) const&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1717, col. 25 & +# 1717| [CopyConstructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25) const&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1717, col. 25 & +# 1717| [MoveConstructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)&&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1717, col. 25 && +# 1717| [Constructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)() +# 1717| : +# 1717| [ConstMemberFunction] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const +# 1717| : +# 1717| getEntryPoint(): [BlockStmt] { ... } +# 1717| getStmt(0): [ReturnStmt] return ... +# 1721| [CopyAssignmentOperator] CopyConstructorWithImplicitArgumentClass& CopyConstructorWithImplicitArgumentClass::operator=(CopyConstructorWithImplicitArgumentClass const&) +# 1721| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass & +# 1724| [Constructor] void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass() +# 1724| : +# 1724| : +# 1724| getEntryPoint(): [BlockStmt] { ... } +# 1724| getStmt(0): [ReturnStmt] return ... +# 1725| [CopyConstructor] void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass(CopyConstructorWithImplicitArgumentClass const&) +# 1725| : +# 1725| getParameter(0): [Parameter] c +# 1725| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass & +# 1725| : +# 1725| getEntryPoint(): [BlockStmt] { ... } +# 1726| getStmt(0): [ExprStmt] ExprStmt +# 1726| getExpr(): [AssignExpr] ... = ... +# 1726| Type = [IntType] int +# 1726| ValueCategory = lvalue +# 1726| getLValue(): [PointerFieldAccess] x +# 1726| Type = [IntType] int +# 1726| ValueCategory = lvalue +# 1726| getQualifier(): [ThisExpr] this +# 1726| Type = [PointerType] CopyConstructorWithImplicitArgumentClass * +# 1726| ValueCategory = prvalue(load) +# 1726| getRValue(): [ReferenceFieldAccess] x +# 1726| Type = [IntType] int +# 1726| ValueCategory = prvalue(load) +# 1726| getQualifier(): [VariableAccess] c +# 1726| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass & +# 1726| ValueCategory = prvalue(load) +# 1726| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1726| Type = [SpecifiedType] const CopyConstructorWithImplicitArgumentClass +# 1726| ValueCategory = lvalue +# 1727| getStmt(1): [ReturnStmt] return ... +# 1730| [CopyAssignmentOperator] CopyConstructorWithBitwiseCopyClass& CopyConstructorWithBitwiseCopyClass::operator=(CopyConstructorWithBitwiseCopyClass const&) +# 1730| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorWithBitwiseCopyClass & +# 1730| [MoveAssignmentOperator] CopyConstructorWithBitwiseCopyClass& CopyConstructorWithBitwiseCopyClass::operator=(CopyConstructorWithBitwiseCopyClass&&) +# 1730| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorWithBitwiseCopyClass && +# 1730| [CopyConstructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass(CopyConstructorWithBitwiseCopyClass const&) +# 1730| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorWithBitwiseCopyClass & +# 1730| [MoveConstructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass(CopyConstructorWithBitwiseCopyClass&&) +# 1730| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorWithBitwiseCopyClass && +# 1733| [Constructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass() +# 1733| : +# 1733| : +# 1733| getEntryPoint(): [BlockStmt] { ... } +# 1733| getStmt(0): [ReturnStmt] return ... +# 1736| [CopyAssignmentOperator] CopyConstructorTestNonVirtualClass& CopyConstructorTestNonVirtualClass::operator=(CopyConstructorTestNonVirtualClass const&) +# 1736| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1736| [MoveAssignmentOperator] CopyConstructorTestNonVirtualClass& CopyConstructorTestNonVirtualClass::operator=(CopyConstructorTestNonVirtualClass&&) +# 1736| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorTestNonVirtualClass && +# 1736| [CopyConstructor] void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass(CopyConstructorTestNonVirtualClass const&) +# 1736| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1736| : +# 1736| getInitializer(0): [ConstructorDirectInit] call to CopyConstructorWithImplicitArgumentClass +# 1736| Type = [VoidType] void +# 1736| ValueCategory = prvalue +# 1736| getArgument(0): [VariableAccess] (unnamed parameter 0) +# 1736| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1736| ValueCategory = prvalue(load) +# 1736| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1736| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass & +# 1736| ValueCategory = prvalue +# 1736| getExpr(): [CStyleCast] (const CopyConstructorWithImplicitArgumentClass)... +# 1736| Conversion = [BaseClassConversion] base class conversion +# 1736| Type = [SpecifiedType] const CopyConstructorWithImplicitArgumentClass +# 1736| ValueCategory = lvalue +# 1736| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1736| Type = [SpecifiedType] const CopyConstructorTestNonVirtualClass +# 1736| ValueCategory = lvalue +# 1736| getInitializer(1): (no string representation) +# 1736| Type = [VirtualBaseClass] CopyConstructorWithBitwiseCopyClass +# 1736| ValueCategory = prvalue +# 1736| getEntryPoint(): [BlockStmt] { ... } +# 1736| getStmt(0): [ReturnStmt] return ... +# 1736| [MoveConstructor] void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass(CopyConstructorTestNonVirtualClass&&) +# 1736| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorTestNonVirtualClass && +# 1740| [Constructor] void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass() +# 1740| : +# 1740| : +# 1740| getInitializer(0): [ConstructorDirectInit] call to CopyConstructorWithImplicitArgumentClass +# 1740| Type = [VoidType] void +# 1740| ValueCategory = prvalue +# 1740| getInitializer(1): [ConstructorDirectInit] call to CopyConstructorWithBitwiseCopyClass +# 1740| Type = [VoidType] void +# 1740| ValueCategory = prvalue +# 1740| getEntryPoint(): [BlockStmt] { ... } +# 1740| getStmt(0): [ReturnStmt] return ... +# 1743| [CopyAssignmentOperator] CopyConstructorTestVirtualClass& CopyConstructorTestVirtualClass::operator=(CopyConstructorTestVirtualClass const&) +# 1743| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1743| [MoveAssignmentOperator] CopyConstructorTestVirtualClass& CopyConstructorTestVirtualClass::operator=(CopyConstructorTestVirtualClass&&) +# 1743| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorTestVirtualClass && +# 1743| [CopyConstructor] void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass(CopyConstructorTestVirtualClass const&) +# 1743| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1743| : +# 1743| getInitializer(0): [ConstructorVirtualInit] call to CopyConstructorWithImplicitArgumentClass +# 1743| Type = [VoidType] void +# 1743| ValueCategory = prvalue +# 1743| getArgument(0): [VariableAccess] (unnamed parameter 0) +# 1743| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1743| ValueCategory = prvalue(load) +# 1743| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1743| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass & +# 1743| ValueCategory = prvalue +# 1743| getExpr(): [CStyleCast] (const CopyConstructorWithImplicitArgumentClass)... +# 1743| Conversion = [BaseClassConversion] base class conversion +# 1743| Type = [SpecifiedType] const CopyConstructorWithImplicitArgumentClass +# 1743| ValueCategory = lvalue +# 1743| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1743| Type = [SpecifiedType] const CopyConstructorTestVirtualClass +# 1743| ValueCategory = lvalue +# 1743| getInitializer(1): (no string representation) +# 1743| Type = [VirtualBaseClass] CopyConstructorWithBitwiseCopyClass +# 1743| ValueCategory = prvalue +# 1743| getEntryPoint(): [BlockStmt] { ... } +# 1743| getStmt(0): [ReturnStmt] return ... +# 1743| [MoveConstructor] void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass(CopyConstructorTestVirtualClass&&) +# 1743| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] CopyConstructorTestVirtualClass && +# 1747| [Constructor] void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass() +# 1747| : +# 1747| : +# 1747| getInitializer(0): [ConstructorVirtualInit] call to CopyConstructorWithImplicitArgumentClass +# 1747| Type = [VoidType] void +# 1747| ValueCategory = prvalue +# 1747| getInitializer(1): [ConstructorVirtualInit] call to CopyConstructorWithBitwiseCopyClass +# 1747| Type = [VoidType] void +# 1747| ValueCategory = prvalue +# 1747| getEntryPoint(): [BlockStmt] { ... } +# 1747| getStmt(0): [ReturnStmt] return ... +# 1750| [TopLevelFunction] int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) +# 1750| : +# 1751| getParameter(0): [Parameter] x +# 1751| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1752| getParameter(1): [Parameter] y +# 1752| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1752| getEntryPoint(): [BlockStmt] { ... } +# 1753| getStmt(0): [DeclStmt] declaration +# 1753| getDeclarationEntry(0): [VariableDeclarationEntry] definition of cx +# 1753| Type = [Class] CopyConstructorTestNonVirtualClass +# 1753| getVariable().getInitializer(): [Initializer] initializer for cx +# 1753| getExpr(): [ConstructorCall] call to CopyConstructorTestNonVirtualClass +# 1753| Type = [VoidType] void +# 1753| ValueCategory = prvalue +# 1753| getArgument(0): [VariableAccess] x +# 1753| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1753| ValueCategory = prvalue(load) +# 1753| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1753| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass & +# 1753| ValueCategory = prvalue +# 1753| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1753| Type = [SpecifiedType] const CopyConstructorTestNonVirtualClass +# 1753| ValueCategory = lvalue +# 1754| getStmt(1): [DeclStmt] declaration +# 1754| getDeclarationEntry(0): [VariableDeclarationEntry] definition of cy +# 1754| Type = [Class] CopyConstructorTestVirtualClass +# 1754| getVariable().getInitializer(): [Initializer] initializer for cy +# 1754| getExpr(): [ConstructorCall] call to CopyConstructorTestVirtualClass +# 1754| Type = [VoidType] void +# 1754| ValueCategory = prvalue +# 1754| getArgument(0): [VariableAccess] y +# 1754| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1754| ValueCategory = prvalue(load) +# 1754| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1754| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass & +# 1754| ValueCategory = prvalue +# 1754| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1754| Type = [SpecifiedType] const CopyConstructorTestVirtualClass +# 1754| ValueCategory = lvalue +# 1755| getStmt(2): [ReturnStmt] return ... +# 1757| [TopLevelFunction] void if_initialization(int) +# 1757| : +# 1757| getParameter(0): [Parameter] x +# 1757| Type = [IntType] int +# 1757| getEntryPoint(): [BlockStmt] { ... } +# 1758| getStmt(0): [IfStmt] if (...) ... +# 1758| getInitialization(): [DeclStmt] declaration +# 1758| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1758| Type = [IntType] int +# 1758| getVariable().getInitializer(): [Initializer] initializer for y +# 1758| getExpr(): [VariableAccess] x +# 1758| Type = [IntType] int +# 1758| ValueCategory = prvalue(load) +# 1758| getCondition(): [AddExpr] ... + ... +# 1758| Type = [IntType] int +# 1758| ValueCategory = prvalue +# 1758| getLeftOperand(): [VariableAccess] x +# 1758| Type = [IntType] int +# 1758| ValueCategory = prvalue(load) +# 1758| getRightOperand(): [Literal] 1 +# 1758| Type = [IntType] int +# 1758| Value = [Literal] 1 +# 1758| ValueCategory = prvalue +# 1758| getThen(): [BlockStmt] { ... } +# 1759| getStmt(0): [ExprStmt] ExprStmt +# 1759| getExpr(): [AssignExpr] ... = ... +# 1759| Type = [IntType] int +# 1759| ValueCategory = lvalue +# 1759| getLValue(): [VariableAccess] x +# 1759| Type = [IntType] int +# 1759| ValueCategory = lvalue +# 1759| getRValue(): [AddExpr] ... + ... +# 1759| Type = [IntType] int +# 1759| ValueCategory = prvalue +# 1759| getLeftOperand(): [VariableAccess] x +# 1759| Type = [IntType] int +# 1759| ValueCategory = prvalue(load) +# 1759| getRightOperand(): [VariableAccess] y +# 1759| Type = [IntType] int +# 1759| ValueCategory = prvalue(load) +# 1758| getCondition().getFullyConverted(): [CStyleCast] (bool)... +# 1758| Conversion = [BoolConversion] conversion to bool +# 1758| Type = [BoolType] bool +# 1758| ValueCategory = prvalue +# 1762| getStmt(1): [DeclStmt] declaration +# 1762| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1762| Type = [IntType] int +# 1763| getStmt(2): [IfStmt] if (...) ... +# 1763| getInitialization(): [ExprStmt] ExprStmt +# 1763| getExpr(): [AssignExpr] ... = ... +# 1763| Type = [IntType] int +# 1763| ValueCategory = lvalue +# 1763| getLValue(): [VariableAccess] w +# 1763| Type = [IntType] int +# 1763| ValueCategory = lvalue +# 1763| getRValue(): [VariableAccess] x +# 1763| Type = [IntType] int +# 1763| ValueCategory = prvalue(load) +# 1763| getCondition(): [AddExpr] ... + ... +# 1763| Type = [IntType] int +# 1763| ValueCategory = prvalue +# 1763| getLeftOperand(): [VariableAccess] x +# 1763| Type = [IntType] int +# 1763| ValueCategory = prvalue(load) +# 1763| getRightOperand(): [Literal] 1 +# 1763| Type = [IntType] int +# 1763| Value = [Literal] 1 +# 1763| ValueCategory = prvalue +# 1763| getThen(): [BlockStmt] { ... } +# 1764| getStmt(0): [ExprStmt] ExprStmt +# 1764| getExpr(): [AssignExpr] ... = ... +# 1764| Type = [IntType] int +# 1764| ValueCategory = lvalue +# 1764| getLValue(): [VariableAccess] x +# 1764| Type = [IntType] int +# 1764| ValueCategory = lvalue +# 1764| getRValue(): [AddExpr] ... + ... +# 1764| Type = [IntType] int +# 1764| ValueCategory = prvalue +# 1764| getLeftOperand(): [VariableAccess] x +# 1764| Type = [IntType] int +# 1764| ValueCategory = prvalue(load) +# 1764| getRightOperand(): [VariableAccess] w +# 1764| Type = [IntType] int +# 1764| ValueCategory = prvalue(load) +# 1763| getCondition().getFullyConverted(): [CStyleCast] (bool)... +# 1763| Conversion = [BoolConversion] conversion to bool +# 1763| Type = [BoolType] bool +# 1763| ValueCategory = prvalue +# 1767| getStmt(3): [IfStmt] if (...) ... +# 1767| getInitialization(): [ExprStmt] ExprStmt +# 1767| getExpr(): [AssignExpr] ... = ... +# 1767| Type = [IntType] int +# 1767| ValueCategory = lvalue +# 1767| getLValue(): [VariableAccess] w +# 1767| Type = [IntType] int +# 1767| ValueCategory = lvalue +# 1767| getRValue(): [VariableAccess] x +# 1767| Type = [IntType] int +# 1767| ValueCategory = prvalue(load) +# 1767| getCondition(): [ConditionDeclExpr] (condition decl) +# 1767| Type = [BoolType] bool +# 1767| ValueCategory = prvalue +# 1767| getVariableAccess(): [VariableAccess] w2 +# 1767| Type = [IntType] int +# 1767| ValueCategory = prvalue(load) +# 1767| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)... +# 1767| Conversion = [BoolConversion] conversion to bool +# 1767| Type = [BoolType] bool +# 1767| ValueCategory = prvalue +# 1767| getThen(): [BlockStmt] { ... } +# 1768| getStmt(0): [ExprStmt] ExprStmt +# 1768| getExpr(): [AssignExpr] ... = ... +# 1768| Type = [IntType] int +# 1768| ValueCategory = lvalue +# 1768| getLValue(): [VariableAccess] x +# 1768| Type = [IntType] int +# 1768| ValueCategory = lvalue +# 1768| getRValue(): [AddExpr] ... + ... +# 1768| Type = [IntType] int +# 1768| ValueCategory = prvalue +# 1768| getLeftOperand(): [VariableAccess] x +# 1768| Type = [IntType] int +# 1768| ValueCategory = prvalue(load) +# 1768| getRightOperand(): [VariableAccess] w +# 1768| Type = [IntType] int +# 1768| ValueCategory = prvalue(load) +# 1771| getStmt(4): [IfStmt] if (...) ... +# 1771| getInitialization(): [DeclStmt] declaration +# 1771| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1771| Type = [IntType] int +# 1771| getVariable().getInitializer(): [Initializer] initializer for v +# 1771| getExpr(): [VariableAccess] x +# 1771| Type = [IntType] int +# 1771| ValueCategory = prvalue(load) +# 1771| getCondition(): [ConditionDeclExpr] (condition decl) +# 1771| Type = [BoolType] bool +# 1771| ValueCategory = prvalue +# 1771| getVariableAccess(): [VariableAccess] v2 +# 1771| Type = [IntType] int +# 1771| ValueCategory = prvalue(load) +# 1771| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)... +# 1771| Conversion = [BoolConversion] conversion to bool +# 1771| Type = [BoolType] bool +# 1771| ValueCategory = prvalue +# 1771| getThen(): [BlockStmt] { ... } +# 1772| getStmt(0): [ExprStmt] ExprStmt +# 1772| getExpr(): [AssignExpr] ... = ... +# 1772| Type = [IntType] int +# 1772| ValueCategory = lvalue +# 1772| getLValue(): [VariableAccess] x +# 1772| Type = [IntType] int +# 1772| ValueCategory = lvalue +# 1772| getRValue(): [AddExpr] ... + ... +# 1772| Type = [IntType] int +# 1772| ValueCategory = prvalue +# 1772| getLeftOperand(): [VariableAccess] x +# 1772| Type = [IntType] int +# 1772| ValueCategory = prvalue(load) +# 1772| getRightOperand(): [VariableAccess] v +# 1772| Type = [IntType] int +# 1772| ValueCategory = prvalue(load) +# 1775| getStmt(5): [DeclStmt] declaration +# 1775| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 1775| Type = [IntType] int +# 1775| getVariable().getInitializer(): [Initializer] initializer for z +# 1775| getExpr(): [VariableAccess] x +# 1775| Type = [IntType] int +# 1775| ValueCategory = prvalue(load) +# 1776| getStmt(6): [IfStmt] if (...) ... +# 1776| getCondition(): [VariableAccess] z +# 1776| Type = [IntType] int +# 1776| ValueCategory = prvalue(load) +# 1776| getThen(): [BlockStmt] { ... } +# 1777| getStmt(0): [ExprStmt] ExprStmt +# 1777| getExpr(): [AssignExpr] ... = ... +# 1777| Type = [IntType] int +# 1777| ValueCategory = lvalue +# 1777| getLValue(): [VariableAccess] x +# 1777| Type = [IntType] int +# 1777| ValueCategory = lvalue +# 1777| getRValue(): [AddExpr] ... + ... +# 1777| Type = [IntType] int +# 1777| ValueCategory = prvalue +# 1777| getLeftOperand(): [VariableAccess] x +# 1777| Type = [IntType] int +# 1777| ValueCategory = prvalue(load) +# 1777| getRightOperand(): [VariableAccess] z +# 1777| Type = [IntType] int +# 1777| ValueCategory = prvalue(load) +# 1776| getCondition().getFullyConverted(): [CStyleCast] (bool)... +# 1776| Conversion = [BoolConversion] conversion to bool +# 1776| Type = [BoolType] bool +# 1776| ValueCategory = prvalue +# 1780| getStmt(7): [IfStmt] if (...) ... +# 1780| getCondition(): [ConditionDeclExpr] (condition decl) +# 1780| Type = [BoolType] bool +# 1780| ValueCategory = prvalue +# 1780| getVariableAccess(): [VariableAccess] z2 +# 1780| Type = [IntType] int +# 1780| ValueCategory = prvalue(load) +# 1780| getVariableAccess().getFullyConverted(): [CStyleCast] (bool)... +# 1780| Conversion = [BoolConversion] conversion to bool +# 1780| Type = [BoolType] bool +# 1780| ValueCategory = prvalue +# 1780| getThen(): [BlockStmt] { ... } +# 1781| getStmt(0): [ExprStmt] ExprStmt +# 1781| getExpr(): [AssignAddExpr] ... += ... +# 1781| Type = [IntType] int +# 1781| ValueCategory = lvalue +# 1781| getLValue(): [VariableAccess] x +# 1781| Type = [IntType] int +# 1781| ValueCategory = lvalue +# 1781| getRValue(): [VariableAccess] z2 +# 1781| Type = [IntType] int +# 1781| ValueCategory = prvalue(load) +# 1783| getStmt(8): [ReturnStmt] return ... +# 1785| [TopLevelFunction] void switch_initialization(int) +# 1785| : +# 1785| getParameter(0): [Parameter] x +# 1785| Type = [IntType] int +# 1785| getEntryPoint(): [BlockStmt] { ... } +# 1786| getStmt(0): [SwitchStmt] switch (...) ... +# 1786| getInitialization(): [DeclStmt] declaration +# 1786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1786| Type = [IntType] int +# 1786| getVariable().getInitializer(): [Initializer] initializer for y +# 1786| getExpr(): [VariableAccess] x +# 1786| Type = [IntType] int +# 1786| ValueCategory = prvalue(load) +# 1786| getExpr(): [AddExpr] ... + ... +# 1786| Type = [IntType] int +# 1786| ValueCategory = prvalue +# 1786| getLeftOperand(): [VariableAccess] x +# 1786| Type = [IntType] int +# 1786| ValueCategory = prvalue(load) +# 1786| getRightOperand(): [Literal] 1 +# 1786| Type = [IntType] int +# 1786| Value = [Literal] 1 +# 1786| ValueCategory = prvalue +# 1786| getStmt(): [BlockStmt] { ... } +# 1787| getStmt(0): [SwitchCase] default: +# 1788| getStmt(1): [ExprStmt] ExprStmt +# 1788| getExpr(): [AssignExpr] ... = ... +# 1788| Type = [IntType] int +# 1788| ValueCategory = lvalue +# 1788| getLValue(): [VariableAccess] x +# 1788| Type = [IntType] int +# 1788| ValueCategory = lvalue +# 1788| getRValue(): [AddExpr] ... + ... +# 1788| Type = [IntType] int +# 1788| ValueCategory = prvalue +# 1788| getLeftOperand(): [VariableAccess] x +# 1788| Type = [IntType] int +# 1788| ValueCategory = prvalue(load) +# 1788| getRightOperand(): [VariableAccess] y +# 1788| Type = [IntType] int +# 1788| ValueCategory = prvalue(load) +# 1791| getStmt(1): [DeclStmt] declaration +# 1791| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1791| Type = [IntType] int +# 1792| getStmt(2): [SwitchStmt] switch (...) ... +# 1792| getInitialization(): [ExprStmt] ExprStmt +# 1792| getExpr(): [AssignExpr] ... = ... +# 1792| Type = [IntType] int +# 1792| ValueCategory = lvalue +# 1792| getLValue(): [VariableAccess] w +# 1792| Type = [IntType] int +# 1792| ValueCategory = lvalue +# 1792| getRValue(): [VariableAccess] x +# 1792| Type = [IntType] int +# 1792| ValueCategory = prvalue(load) +# 1792| getExpr(): [AddExpr] ... + ... +# 1792| Type = [IntType] int +# 1792| ValueCategory = prvalue +# 1792| getLeftOperand(): [VariableAccess] x +# 1792| Type = [IntType] int +# 1792| ValueCategory = prvalue(load) +# 1792| getRightOperand(): [Literal] 1 +# 1792| Type = [IntType] int +# 1792| Value = [Literal] 1 +# 1792| ValueCategory = prvalue +# 1792| getStmt(): [BlockStmt] { ... } +# 1793| getStmt(0): [SwitchCase] default: +# 1794| getStmt(1): [ExprStmt] ExprStmt +# 1794| getExpr(): [AssignExpr] ... = ... +# 1794| Type = [IntType] int +# 1794| ValueCategory = lvalue +# 1794| getLValue(): [VariableAccess] x +# 1794| Type = [IntType] int +# 1794| ValueCategory = lvalue +# 1794| getRValue(): [AddExpr] ... + ... +# 1794| Type = [IntType] int +# 1794| ValueCategory = prvalue +# 1794| getLeftOperand(): [VariableAccess] x +# 1794| Type = [IntType] int +# 1794| ValueCategory = prvalue(load) +# 1794| getRightOperand(): [VariableAccess] w +# 1794| Type = [IntType] int +# 1794| ValueCategory = prvalue(load) +# 1797| getStmt(3): [SwitchStmt] switch (...) ... +# 1797| getInitialization(): [ExprStmt] ExprStmt +# 1797| getExpr(): [AssignExpr] ... = ... +# 1797| Type = [IntType] int +# 1797| ValueCategory = lvalue +# 1797| getLValue(): [VariableAccess] w +# 1797| Type = [IntType] int +# 1797| ValueCategory = lvalue +# 1797| getRValue(): [VariableAccess] x +# 1797| Type = [IntType] int +# 1797| ValueCategory = prvalue(load) +# 1797| getExpr(): [ConditionDeclExpr] (condition decl) +# 1797| Type = [IntType] int +# 1797| ValueCategory = prvalue +# 1797| getVariableAccess(): [VariableAccess] w2 +# 1797| Type = [IntType] int +# 1797| ValueCategory = prvalue(load) +# 1797| getStmt(): [BlockStmt] { ... } +# 1798| getStmt(0): [SwitchCase] default: +# 1799| getStmt(1): [ExprStmt] ExprStmt +# 1799| getExpr(): [AssignExpr] ... = ... +# 1799| Type = [IntType] int +# 1799| ValueCategory = lvalue +# 1799| getLValue(): [VariableAccess] x +# 1799| Type = [IntType] int +# 1799| ValueCategory = lvalue +# 1799| getRValue(): [AddExpr] ... + ... +# 1799| Type = [IntType] int +# 1799| ValueCategory = prvalue +# 1799| getLeftOperand(): [VariableAccess] x +# 1799| Type = [IntType] int +# 1799| ValueCategory = prvalue(load) +# 1799| getRightOperand(): [VariableAccess] w +# 1799| Type = [IntType] int +# 1799| ValueCategory = prvalue(load) +# 1802| getStmt(4): [SwitchStmt] switch (...) ... +# 1802| getInitialization(): [DeclStmt] declaration +# 1802| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1802| Type = [IntType] int +# 1802| getVariable().getInitializer(): [Initializer] initializer for v +# 1802| getExpr(): [VariableAccess] x +# 1802| Type = [IntType] int +# 1802| ValueCategory = prvalue(load) +# 1802| getExpr(): [ConditionDeclExpr] (condition decl) +# 1802| Type = [IntType] int +# 1802| ValueCategory = prvalue +# 1802| getVariableAccess(): [VariableAccess] v2 +# 1802| Type = [IntType] int +# 1802| ValueCategory = prvalue(load) +# 1802| getStmt(): [BlockStmt] { ... } +# 1803| getStmt(0): [SwitchCase] default: +# 1804| getStmt(1): [ExprStmt] ExprStmt +# 1804| getExpr(): [AssignExpr] ... = ... +# 1804| Type = [IntType] int +# 1804| ValueCategory = lvalue +# 1804| getLValue(): [VariableAccess] x +# 1804| Type = [IntType] int +# 1804| ValueCategory = lvalue +# 1804| getRValue(): [AddExpr] ... + ... +# 1804| Type = [IntType] int +# 1804| ValueCategory = prvalue +# 1804| getLeftOperand(): [VariableAccess] x +# 1804| Type = [IntType] int +# 1804| ValueCategory = prvalue(load) +# 1804| getRightOperand(): [VariableAccess] v +# 1804| Type = [IntType] int +# 1804| ValueCategory = prvalue(load) +# 1807| getStmt(5): [DeclStmt] declaration +# 1807| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 1807| Type = [IntType] int +# 1807| getVariable().getInitializer(): [Initializer] initializer for z +# 1807| getExpr(): [VariableAccess] x +# 1807| Type = [IntType] int +# 1807| ValueCategory = prvalue(load) +# 1808| getStmt(6): [SwitchStmt] switch (...) ... +# 1808| getExpr(): [VariableAccess] z +# 1808| Type = [IntType] int +# 1808| ValueCategory = prvalue(load) +# 1808| getStmt(): [BlockStmt] { ... } +# 1809| getStmt(0): [SwitchCase] default: +# 1810| getStmt(1): [ExprStmt] ExprStmt +# 1810| getExpr(): [AssignExpr] ... = ... +# 1810| Type = [IntType] int +# 1810| ValueCategory = lvalue +# 1810| getLValue(): [VariableAccess] x +# 1810| Type = [IntType] int +# 1810| ValueCategory = lvalue +# 1810| getRValue(): [AddExpr] ... + ... +# 1810| Type = [IntType] int +# 1810| ValueCategory = prvalue +# 1810| getLeftOperand(): [VariableAccess] x +# 1810| Type = [IntType] int +# 1810| ValueCategory = prvalue(load) +# 1810| getRightOperand(): [VariableAccess] z +# 1810| Type = [IntType] int +# 1810| ValueCategory = prvalue(load) +# 1813| getStmt(7): [SwitchStmt] switch (...) ... +# 1813| getExpr(): [ConditionDeclExpr] (condition decl) +# 1813| Type = [IntType] int +# 1813| ValueCategory = prvalue +# 1813| getVariableAccess(): [VariableAccess] z2 +# 1813| Type = [IntType] int +# 1813| ValueCategory = prvalue(load) +# 1813| getStmt(): [BlockStmt] { ... } +# 1814| getStmt(0): [SwitchCase] default: +# 1815| getStmt(1): [ExprStmt] ExprStmt +# 1815| getExpr(): [AssignAddExpr] ... += ... +# 1815| Type = [IntType] int +# 1815| ValueCategory = lvalue +# 1815| getLValue(): [VariableAccess] x +# 1815| Type = [IntType] int +# 1815| ValueCategory = lvalue +# 1815| getRValue(): [VariableAccess] z2 +# 1815| Type = [IntType] int +# 1815| ValueCategory = prvalue(load) +# 1817| getStmt(8): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.ql b/cpp/ql/test/library-tests/ir/ir/PrintAST.ql index e107c80de02..471b12ed3e5 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.ql +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.ql @@ -6,6 +6,6 @@ private import cpp private import semmle.code.cpp.PrintAST private import PrintConfig -private class PrintConfig extends PrintASTConfiguration { +private class PrintConfig extends PrintAstConfiguration { override predicate shouldPrintFunction(Function func) { shouldDumpFunction(func) } } diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 8820b8e45a3..e85c5f1b505 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1471,31 +1471,43 @@ void array_structured_binding() { // explicit reference version { auto& unnamed_local_variable = xs; - auto& x0 = xs[0]; - auto& x1 = xs[1]; + auto& x0 = unnamed_local_variable[0]; + auto& x1 = unnamed_local_variable[1]; x1 = 3; int &rx1 = x1; int x = x1; } } +struct StructuredBindingDataMemberMemberStruct { + int x = 5; +}; + struct StructuredBindingDataMemberStruct { + typedef int ArrayType[2]; + typedef int &RefType; int i = 1; double d = 2.0; unsigned int b : 3; int& r = i; + int* p = &i; + ArrayType xs = {1, 2}; + RefType r_alt = i; + StructuredBindingDataMemberMemberStruct m; }; void data_member_structured_binding() { StructuredBindingDataMemberStruct s; // structured binding use { - auto [i, d, b, r] = s; + auto [i, d, b, r, p, xs, r_alt, m] = s; d = 4.0; double& rd = d; int v = i; r = 5; + *p = 6; int& rr = r; + int* pr = &r; int w = r; } // explicit reference version @@ -1505,58 +1517,67 @@ void data_member_structured_binding() { auto& d = unnamed_local_variable.d; // no equivalent for b auto& r = unnamed_local_variable.r; + auto& p = unnamed_local_variable.p; d = 4.0; double& rd = d; int v = i; r = 5; + *p = 6; int& rr = r; + int* pr = &r; int w = r; } } -struct StructuredBindingTuple; namespace std { template struct tuple_size; - template<> - struct tuple_size { - static const unsigned int value = 3; - }; - template struct tuple_element; - template<> - struct tuple_element<0, StructuredBindingTuple> { - using type = int; - }; - template<> - struct tuple_element<1, StructuredBindingTuple> { - using type = double; - }; - template<> - struct tuple_element<2, StructuredBindingTuple> { - using type = int&; - }; } -struct StructuredBindingTuple { +struct StructuredBindingTupleRefGet { int i = 1; double d = 2.2; int& r = i; template - typename std::tuple_element::type& get(); + typename std::tuple_element::type& get(); }; template<> -std::tuple_element<0, StructuredBindingTuple>::type& StructuredBindingTuple::get<0>() { return i; } -template<> -std::tuple_element<1, StructuredBindingTuple>::type& StructuredBindingTuple::get<1>() { return d; } -template<> -std::tuple_element<2, StructuredBindingTuple>::type& StructuredBindingTuple::get<2>() { return r; } +struct std::tuple_size { + static const unsigned int value = 3; +}; -void tuple_structured_binding() { - StructuredBindingTuple t; +template<> +struct std::tuple_element<0, StructuredBindingTupleRefGet> { + using type = int; +}; +template<> +struct std::tuple_element<1, StructuredBindingTupleRefGet> { + using type = double; +}; +template<> +struct std::tuple_element<2, StructuredBindingTupleRefGet> { + using type = int&; +}; + +template<> +std::tuple_element<0, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<0>() { + return i; +} +template<> +std::tuple_element<1, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<1>() { + return d; +} +template<> +std::tuple_element<2, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<2>() { + return r; +} + +void tuple_structured_binding_ref_get() { + StructuredBindingTupleRefGet t; // structured binding use { auto [i, d, r] = t; @@ -1582,4 +1603,217 @@ void tuple_structured_binding() { } } +struct StructuredBindingTupleNoRefGet { + int i = 1; + int& r = i; + + template + typename std::tuple_element::type get(); +}; + +template<> +struct std::tuple_size { + static const unsigned int value = 3; +}; + +template<> +struct std::tuple_element<0, StructuredBindingTupleNoRefGet> { + using type = int; +}; +template<> +struct std::tuple_element<1, StructuredBindingTupleNoRefGet> { + using type = int&; +}; +template<> +struct std::tuple_element<2, StructuredBindingTupleNoRefGet> { + using type = int&&; +}; + +template<> +std::tuple_element<0, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<0>() { + return i; +} +template<> +std::tuple_element<1, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<1>() { + return r; +} +template<> +std::tuple_element<2, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<2>() { + return 5; +} + +void tuple_structured_binding_no_ref_get() { + StructuredBindingTupleNoRefGet t; + //structured binding use + { + auto&& [i, r, rv] = t; + i = 4; + int& ri = i; + int v = i; + r = 5; + int& rr = r; + int w = r; + } + // explicit reference version + { + auto&& unnamed_local_variable = t; + auto&& i = unnamed_local_variable.get<0>(); + auto& r = unnamed_local_variable.get<1>(); + auto&& rv = unnamed_local_variable.get<2>(); + i = 4; + int& ri = i; + int v = i; + r = 5; + int& rr = r; + int w = r; + } +} + +void array_structured_binding_non_ref_init() { + int xs[2] = {1, 2}; + auto [x0, x1] = xs; +} + +class CapturedLambdaMyObj +{ +public: + CapturedLambdaMyObj() {} +}; + +void captured_lambda(int x, int &y, int &&z) +{ + const auto &obj1 = CapturedLambdaMyObj(); + auto obj2 = CapturedLambdaMyObj(); + + auto lambda_outer = [obj1, obj2, x, y, z](){ + auto lambda_inner = [obj1, obj2, x, y, z](){;}; + }; +} + +int goto_on_same_line() { + int x = 42; + goto next; next: + return x; +} + +class TrivialLambdaClass { +public: + void m() const { + auto l_m_outer = [*this] { + m(); + + auto l_m_inner = [*this] { + m(); + }; + }; + }; +}; + +void captured_lambda2(TrivialLambdaClass p1, TrivialLambdaClass &p2, TrivialLambdaClass &&p3) { + const TrivialLambdaClass l1; + const TrivialLambdaClass &l2 = TrivialLambdaClass(); + + auto l_outer1 = [p1, p2, p3, l1, l2] { + auto l_inner1 = [p1] {}; + }; +} + +class CopyConstructorWithImplicitArgumentClass { + int x; +public: + CopyConstructorWithImplicitArgumentClass() {} + CopyConstructorWithImplicitArgumentClass(const CopyConstructorWithImplicitArgumentClass &c) { + x = c.x; + } +}; + +class CopyConstructorWithBitwiseCopyClass { + int y; +public: + CopyConstructorWithBitwiseCopyClass() {} +}; + +class CopyConstructorTestNonVirtualClass : + public CopyConstructorWithImplicitArgumentClass, + public CopyConstructorWithBitwiseCopyClass { +public: + CopyConstructorTestNonVirtualClass() {} +}; + +class CopyConstructorTestVirtualClass : + public virtual CopyConstructorWithImplicitArgumentClass, + public virtual CopyConstructorWithBitwiseCopyClass { +public: + CopyConstructorTestVirtualClass() {} +}; + +int implicit_copy_constructor_test( + const CopyConstructorTestNonVirtualClass &x, + const CopyConstructorTestVirtualClass &y) { + CopyConstructorTestNonVirtualClass cx = x; + CopyConstructorTestVirtualClass cy = y; +} + +void if_initialization(int x) { + if (int y = x; x + 1) { + x = x + y; + } + + int w; + if (w = x; x + 1) { + x = x + w; + } + + if (w = x; int w2 = w) { + x = x + w; + } + + if (int v = x; int v2 = v) { + x = x + v; + } + + int z = x; + if (z) { + x = x + z; + } + + if (int z2 = z) { + x += z2; + } +} + +void switch_initialization(int x) { + switch (int y = x; x + 1) { + default: + x = x + y; + } + + int w; + switch (w = x; x + 1) { + default: + x = x + w; + } + + switch (w = x; int w2 = w) { + default: + x = x + w; + } + + switch (int v = x; int v2 = v) { + default: + x = x + v; + } + + int z = x; + switch (z) { + default: + x = x + z; + } + + switch (int z2 = z) { + default: + x += z2; + } +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 1a4060ba618..1581085efc6 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -41,6 +41,37 @@ | bad_asts.cpp:16:7:16:23 | ChiTotal | total:m14_4 | | bad_asts.cpp:16:7:16:23 | SideEffect | ~m14_4 | | bad_asts.cpp:16:25:16:25 | Arg(0) | 0:r16_3 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_5 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_5 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_7 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_7 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_9 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_10 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_13 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_17 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_18 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_21 | +| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_3 | +| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_15 | +| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_23 | +| bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_2 | +| bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_8 | +| bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_16 | +| bad_asts.cpp:19:10:19:10 | Load | m0_2 | +| bad_asts.cpp:19:10:19:10 | Load | m0_2 | +| bad_asts.cpp:19:10:19:10 | Load | m19_6 | +| bad_asts.cpp:19:10:19:10 | Load | ~m0_4 | +| bad_asts.cpp:19:10:19:10 | Load | ~m0_4 | +| bad_asts.cpp:19:10:19:10 | SideEffect | m19_3 | +| bad_asts.cpp:19:10:19:10 | SideEffect | m19_24 | +| bad_asts.cpp:19:10:19:10 | StoreValue | r19_14 | +| bad_asts.cpp:19:10:19:10 | StoreValue | r19_22 | +| bad_asts.cpp:19:10:19:10 | Unary | m19_6 | +| bad_asts.cpp:19:10:19:10 | Unary | m19_6 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_11 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_12 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_19 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_20 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_5 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_5 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_7 | @@ -633,6 +664,16 @@ | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | @@ -643,6 +684,16 @@ | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | +| file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | @@ -675,33 +726,59 @@ | file://:0:0:0:0 | Arg(0) | 0:r0_15 | | file://:0:0:0:0 | CallTarget | func:r0_1 | | file://:0:0:0:0 | ChiPartial | partial:m0_2 | +| file://:0:0:0:0 | ChiPartial | partial:m0_2 | +| file://:0:0:0:0 | ChiPartial | partial:m0_2 | | file://:0:0:0:0 | ChiPartial | partial:m0_3 | | file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_8 | | file://:0:0:0:0 | ChiPartial | partial:m0_11 | | file://:0:0:0:0 | ChiPartial | partial:m0_11 | +| file://:0:0:0:0 | ChiTotal | total:m0_3 | | file://:0:0:0:0 | ChiTotal | total:m0_4 | | file://:0:0:0:0 | ChiTotal | total:m754_8 | | file://:0:0:0:0 | ChiTotal | total:m763_8 | | file://:0:0:0:0 | ChiTotal | total:m1043_10 | | file://:0:0:0:0 | ChiTotal | total:m1240_4 | +| file://:0:0:0:0 | ChiTotal | total:m1688_3 | +| file://:0:0:0:0 | ChiTotal | total:m1716_8 | +| file://:0:0:0:0 | ChiTotal | total:m1716_19 | +| file://:0:0:0:0 | Left | r0_2 | | file://:0:0:0:0 | Left | r0_4 | +| file://:0:0:0:0 | Left | r0_7 | | file://:0:0:0:0 | Left | r0_11 | | file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m0_2 | +| file://:0:0:0:0 | Load | m0_2 | +| file://:0:0:0:0 | Load | m0_2 | +| file://:0:0:0:0 | Load | m0_2 | +| file://:0:0:0:0 | Load | m0_2 | +| file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m745_6 | | file://:0:0:0:0 | Load | m754_6 | | file://:0:0:0:0 | Load | m763_6 | | file://:0:0:0:0 | Load | m1466_4 | | file://:0:0:0:0 | Load | m1466_4 | +| file://:0:0:0:0 | Load | m1685_9 | +| file://:0:0:0:0 | Load | m1714_7 | | file://:0:0:0:0 | Load | ~m1444_6 | +| file://:0:0:0:0 | Load | ~m1712_10 | +| file://:0:0:0:0 | Load | ~m1712_14 | +| file://:0:0:0:0 | Right | r0_3 | | file://:0:0:0:0 | Right | r0_5 | +| file://:0:0:0:0 | Right | r0_8 | | file://:0:0:0:0 | Right | r0_12 | | file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m0_4 | +| file://:0:0:0:0 | SideEffect | m0_4 | +| file://:0:0:0:0 | SideEffect | m0_4 | +| file://:0:0:0:0 | SideEffect | m0_4 | +| file://:0:0:0:0 | SideEffect | m0_4 | +| file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m1078_23 | | file://:0:0:0:0 | SideEffect | m1078_23 | | file://:0:0:0:0 | SideEffect | m1084_23 | @@ -725,13 +802,20 @@ | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_3 | +| file://:0:0:0:0 | StoreValue | r0_4 | +| file://:0:0:0:0 | StoreValue | r0_4 | | file://:0:0:0:0 | StoreValue | r0_6 | +| file://:0:0:0:0 | StoreValue | r0_7 | +| file://:0:0:0:0 | StoreValue | r0_9 | | file://:0:0:0:0 | StoreValue | r0_13 | | file://:0:0:0:0 | StoreValue | r0_13 | | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | Unary | r0_1 | +| file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_2 | | file://:0:0:0:0 | Unary | r0_3 | | file://:0:0:0:0 | Unary | r0_5 | @@ -739,6 +823,7 @@ | file://:0:0:0:0 | Unary | r0_6 | | file://:0:0:0:0 | Unary | r0_6 | | file://:0:0:0:0 | Unary | r0_6 | +| file://:0:0:0:0 | Unary | r0_6 | | file://:0:0:0:0 | Unary | r0_7 | | file://:0:0:0:0 | Unary | r0_7 | | file://:0:0:0:0 | Unary | r0_7 | @@ -4748,9 +4833,6 @@ | ir.cpp:1043:24:1043:24 | SideEffect | ~m1043_20 | | ir.cpp:1043:31:1043:31 | Address | &:r1043_9 | | ir.cpp:1043:36:1043:55 | Address | &:r1043_11 | -| ir.cpp:1043:43:1043:43 | Address | &:r1043_16 | -| ir.cpp:1043:43:1043:43 | Arg(this) | this:r1043_16 | -| ir.cpp:1043:43:1043:43 | SideEffect | ~m1043_20 | | ir.cpp:1043:43:1043:54 | Address | &:r1043_22 | | ir.cpp:1043:43:1043:54 | Address | &:r1043_24 | | ir.cpp:1043:43:1043:54 | Address | &:r1043_25 | @@ -4771,8 +4853,11 @@ | ir.cpp:1043:45:1043:49 | SideEffect | ~m1043_4 | | ir.cpp:1043:45:1043:49 | Unary | r1043_13 | | ir.cpp:1043:45:1043:49 | Unary | r1043_15 | -| ir.cpp:1043:53:1043:53 | Load | ~m1043_20 | -| ir.cpp:1043:53:1043:53 | Right | r1043_26 | +| ir.cpp:1043:52:1043:52 | Address | &:r1043_16 | +| ir.cpp:1043:52:1043:52 | Arg(this) | this:r1043_16 | +| ir.cpp:1043:52:1043:52 | SideEffect | ~m1043_20 | +| ir.cpp:1043:54:1043:54 | Load | ~m1043_20 | +| ir.cpp:1043:54:1043:54 | Right | r1043_26 | | ir.cpp:1043:58:1043:58 | ChiPartial | partial:m1043_9 | | ir.cpp:1043:58:1043:58 | ChiTotal | total:m1043_3 | | ir.cpp:1043:58:1043:58 | StoreValue | r1043_8 | @@ -4887,9 +4972,6 @@ | ir.cpp:1047:34:1047:34 | SideEffect | ~m1047_20 | | ir.cpp:1047:41:1047:41 | Address | &:r1047_9 | | ir.cpp:1047:46:1047:65 | Address | &:r1047_11 | -| ir.cpp:1047:53:1047:53 | Address | &:r1047_16 | -| ir.cpp:1047:53:1047:53 | Arg(this) | this:r1047_16 | -| ir.cpp:1047:53:1047:53 | SideEffect | ~m1047_20 | | ir.cpp:1047:53:1047:64 | Address | &:r1047_23 | | ir.cpp:1047:53:1047:64 | Load | ~m1047_20 | | ir.cpp:1047:53:1047:64 | StoreValue | r1047_24 | @@ -4904,6 +4986,9 @@ | ir.cpp:1047:55:1047:59 | SideEffect | ~m1047_4 | | ir.cpp:1047:55:1047:59 | Unary | r1047_13 | | ir.cpp:1047:55:1047:59 | Unary | r1047_15 | +| ir.cpp:1047:62:1047:62 | Address | &:r1047_16 | +| ir.cpp:1047:62:1047:62 | Arg(this) | this:r1047_16 | +| ir.cpp:1047:62:1047:62 | SideEffect | ~m1047_20 | | ir.cpp:1047:63:1047:63 | Right | r1047_22 | | ir.cpp:1047:68:1047:68 | StoreValue | r1047_8 | | ir.cpp:1047:68:1047:68 | Unary | r1047_7 | @@ -5012,9 +5097,6 @@ | ir.cpp:1051:39:1051:39 | SideEffect | ~m1051_20 | | ir.cpp:1051:46:1051:46 | Address | &:r1051_9 | | ir.cpp:1051:51:1051:70 | Address | &:r1051_11 | -| ir.cpp:1051:58:1051:58 | Address | &:r1051_16 | -| ir.cpp:1051:58:1051:58 | Arg(this) | this:r1051_16 | -| ir.cpp:1051:58:1051:58 | SideEffect | ~m1051_20 | | ir.cpp:1051:58:1051:69 | Address | &:r1051_22 | | ir.cpp:1051:58:1051:69 | Address | &:r1051_24 | | ir.cpp:1051:58:1051:69 | Address | &:r1051_26 | @@ -5035,6 +5117,9 @@ | ir.cpp:1051:60:1051:64 | SideEffect | ~m1051_4 | | ir.cpp:1051:60:1051:64 | Unary | r1051_13 | | ir.cpp:1051:60:1051:64 | Unary | r1051_15 | +| ir.cpp:1051:67:1051:67 | Address | &:r1051_16 | +| ir.cpp:1051:67:1051:67 | Arg(this) | this:r1051_16 | +| ir.cpp:1051:67:1051:67 | SideEffect | ~m1051_20 | | ir.cpp:1051:73:1051:73 | ChiPartial | partial:m1051_9 | | ir.cpp:1051:73:1051:73 | ChiTotal | total:m1051_3 | | ir.cpp:1051:73:1051:73 | StoreValue | r1051_8 | @@ -5099,9 +5184,6 @@ | ir.cpp:1054:49:1054:49 | SideEffect | ~m1054_20 | | ir.cpp:1054:56:1054:56 | Address | &:r1054_9 | | ir.cpp:1054:61:1054:88 | Address | &:r1054_11 | -| ir.cpp:1054:68:1054:68 | Address | &:r1054_16 | -| ir.cpp:1054:68:1054:68 | Arg(this) | this:r1054_16 | -| ir.cpp:1054:68:1054:68 | SideEffect | ~m1054_20 | | ir.cpp:1054:68:1054:87 | Address | &:r1054_37 | | ir.cpp:1054:68:1054:87 | Load | ~m1054_20 | | ir.cpp:1054:68:1054:87 | StoreValue | r1054_38 | @@ -5116,6 +5198,9 @@ | ir.cpp:1054:70:1054:74 | SideEffect | ~m1054_4 | | ir.cpp:1054:70:1054:74 | Unary | r1054_13 | | ir.cpp:1054:70:1054:74 | Unary | r1054_15 | +| ir.cpp:1054:77:1054:77 | Address | &:r1054_16 | +| ir.cpp:1054:77:1054:77 | Arg(this) | this:r1054_16 | +| ir.cpp:1054:77:1054:77 | SideEffect | ~m1054_20 | | ir.cpp:1054:78:1054:82 | Address | &:r1054_22 | | ir.cpp:1054:78:1054:82 | Address | &:r1054_24 | | ir.cpp:1054:78:1054:82 | Left | r1054_25 | @@ -6694,46 +6779,60 @@ | ir.cpp:1466:26:1466:27 | StoreValue | r1466_3 | | ir.cpp:1466:26:1466:27 | Unary | r1466_2 | | ir.cpp:1467:9:1467:10 | Address | &:r1467_2 | +| ir.cpp:1467:9:1467:10 | Address | &:r1467_3 | +| ir.cpp:1467:9:1467:10 | Load | m0_14 | +| ir.cpp:1467:9:1467:14 | ChiPartial | partial:m1467_4 | +| ir.cpp:1467:9:1467:14 | ChiTotal | total:m1463_12 | | ir.cpp:1467:14:1467:14 | StoreValue | r1467_1 | | ir.cpp:1468:14:1468:16 | Address | &:r1468_1 | -| ir.cpp:1468:20:1468:21 | StoreValue | r1468_3 | -| ir.cpp:1468:20:1468:21 | Unary | r1468_2 | +| ir.cpp:1468:20:1468:21 | Address | &:r1468_2 | +| ir.cpp:1468:20:1468:21 | Load | m0_14 | +| ir.cpp:1468:20:1468:21 | StoreValue | r1468_4 | +| ir.cpp:1468:20:1468:21 | Unary | r1468_3 | | ir.cpp:1469:13:1469:13 | Address | &:r1469_1 | | ir.cpp:1469:17:1469:18 | Address | &:r1469_2 | -| ir.cpp:1469:17:1469:18 | Load | m1467_3 | -| ir.cpp:1469:17:1469:18 | StoreValue | r1469_3 | +| ir.cpp:1469:17:1469:18 | Address | &:r1469_3 | +| ir.cpp:1469:17:1469:18 | Load | m0_14 | +| ir.cpp:1469:17:1469:18 | Load | m1467_4 | +| ir.cpp:1469:17:1469:18 | StoreValue | r1469_4 | | ir.cpp:1473:15:1473:36 | Address | &:r1473_1 | | ir.cpp:1473:40:1473:41 | StoreValue | r1473_3 | | ir.cpp:1473:40:1473:41 | Unary | r1473_2 | | ir.cpp:1474:15:1474:16 | Address | &:r1474_1 | -| ir.cpp:1474:20:1474:21 | Left | r1474_3 | -| ir.cpp:1474:20:1474:21 | Unary | r1474_2 | -| ir.cpp:1474:20:1474:24 | StoreValue | r1474_6 | -| ir.cpp:1474:20:1474:24 | Unary | r1474_5 | -| ir.cpp:1474:23:1474:23 | Right | r1474_4 | +| ir.cpp:1474:20:1474:41 | Address | &:r1474_2 | +| ir.cpp:1474:20:1474:41 | Left | r1474_5 | +| ir.cpp:1474:20:1474:41 | Load | m1473_4 | +| ir.cpp:1474:20:1474:41 | Unary | r1474_3 | +| ir.cpp:1474:20:1474:41 | Unary | r1474_4 | +| ir.cpp:1474:20:1474:44 | StoreValue | r1474_8 | +| ir.cpp:1474:20:1474:44 | Unary | r1474_7 | +| ir.cpp:1474:43:1474:43 | Right | r1474_6 | | ir.cpp:1475:15:1475:16 | Address | &:r1475_1 | -| ir.cpp:1475:20:1475:21 | Left | r1475_3 | -| ir.cpp:1475:20:1475:21 | Unary | r1475_2 | -| ir.cpp:1475:20:1475:24 | StoreValue | r1475_6 | -| ir.cpp:1475:20:1475:24 | Unary | r1475_5 | -| ir.cpp:1475:23:1475:23 | Right | r1475_4 | +| ir.cpp:1475:20:1475:41 | Address | &:r1475_2 | +| ir.cpp:1475:20:1475:41 | Left | r1475_5 | +| ir.cpp:1475:20:1475:41 | Load | m1473_4 | +| ir.cpp:1475:20:1475:41 | Unary | r1475_3 | +| ir.cpp:1475:20:1475:41 | Unary | r1475_4 | +| ir.cpp:1475:20:1475:44 | StoreValue | r1475_8 | +| ir.cpp:1475:20:1475:44 | Unary | r1475_7 | +| ir.cpp:1475:43:1475:43 | Right | r1475_6 | | ir.cpp:1476:9:1476:10 | Address | &:r1476_2 | | ir.cpp:1476:9:1476:10 | Address | &:r1476_4 | -| ir.cpp:1476:9:1476:10 | Load | m1475_7 | +| ir.cpp:1476:9:1476:10 | Load | m1475_9 | | ir.cpp:1476:9:1476:10 | Unary | r1476_3 | | ir.cpp:1476:9:1476:14 | ChiPartial | partial:m1476_5 | -| ir.cpp:1476:9:1476:14 | ChiTotal | total:m1463_12 | +| ir.cpp:1476:9:1476:14 | ChiTotal | total:m1467_5 | | ir.cpp:1476:14:1476:14 | StoreValue | r1476_1 | | ir.cpp:1477:14:1477:16 | Address | &:r1477_1 | | ir.cpp:1477:20:1477:21 | Address | &:r1477_2 | -| ir.cpp:1477:20:1477:21 | Load | m1475_7 | +| ir.cpp:1477:20:1477:21 | Load | m1475_9 | | ir.cpp:1477:20:1477:21 | StoreValue | r1477_5 | | ir.cpp:1477:20:1477:21 | Unary | r1477_3 | | ir.cpp:1477:20:1477:21 | Unary | r1477_4 | | ir.cpp:1478:13:1478:13 | Address | &:r1478_1 | | ir.cpp:1478:17:1478:18 | Address | &:r1478_2 | | ir.cpp:1478:17:1478:18 | Address | &:r1478_3 | -| ir.cpp:1478:17:1478:18 | Load | m1475_7 | +| ir.cpp:1478:17:1478:18 | Load | m1475_9 | | ir.cpp:1478:17:1478:18 | Load | m1476_5 | | ir.cpp:1478:17:1478:18 | StoreValue | r1478_4 | | ir.cpp:1482:8:1482:8 | Address | &:r1482_5 | @@ -6745,353 +6844,1619 @@ | ir.cpp:1482:8:1482:8 | Load | m1482_6 | | ir.cpp:1482:8:1482:8 | SideEffect | m1482_3 | | ir.cpp:1482:8:1482:8 | SideEffect | m1482_8 | -| ir.cpp:1489:6:1489:35 | ChiPartial | partial:m1489_3 | -| ir.cpp:1489:6:1489:35 | ChiTotal | total:m1489_2 | -| ir.cpp:1489:6:1489:35 | SideEffect | ~m1511_6 | -| ir.cpp:1490:39:1490:39 | Address | &:r1490_1 | -| ir.cpp:1490:39:1490:39 | Address | &:r1490_1 | -| ir.cpp:1490:39:1490:39 | Arg(this) | this:r1490_1 | -| ir.cpp:1490:39:1490:39 | CallTarget | func:r1490_3 | -| ir.cpp:1490:39:1490:39 | ChiPartial | partial:m1490_5 | -| ir.cpp:1490:39:1490:39 | ChiPartial | partial:m1490_7 | -| ir.cpp:1490:39:1490:39 | ChiTotal | total:m1489_4 | -| ir.cpp:1490:39:1490:39 | ChiTotal | total:m1490_2 | -| ir.cpp:1490:39:1490:39 | SideEffect | ~m1489_4 | -| ir.cpp:1493:14:1493:14 | Address | &:r1493_1 | -| ir.cpp:1493:15:1493:15 | Address | &:r1493_5 | -| ir.cpp:1493:18:1493:18 | Address | &:r1493_9 | -| ir.cpp:1493:21:1493:21 | Address | &:r1493_13 | -| ir.cpp:1493:24:1493:24 | Address | &:r1493_17 | -| ir.cpp:1493:29:1493:29 | Address | &:r1493_2 | -| ir.cpp:1493:29:1493:29 | Load | m1490_8 | -| ir.cpp:1493:29:1493:29 | StoreValue | r1493_3 | -| ir.cpp:1493:30:1493:30 | Address | &:r1493_19 | -| ir.cpp:1493:30:1493:30 | Load | ~m1493_4 | -| ir.cpp:1493:30:1493:30 | StoreValue | r1493_7 | -| ir.cpp:1493:30:1493:30 | StoreValue | r1493_11 | -| ir.cpp:1493:30:1493:30 | StoreValue | r1493_15 | -| ir.cpp:1493:30:1493:30 | StoreValue | r1493_21 | -| ir.cpp:1493:30:1493:30 | Unary | r1493_6 | -| ir.cpp:1493:30:1493:30 | Unary | r1493_10 | -| ir.cpp:1493:30:1493:30 | Unary | r1493_14 | -| ir.cpp:1493:30:1493:30 | Unary | r1493_18 | -| ir.cpp:1493:30:1493:30 | Unary | r1493_20 | -| ir.cpp:1494:9:1494:9 | Address | &:r1494_2 | -| ir.cpp:1494:13:1494:15 | StoreValue | r1494_1 | -| ir.cpp:1495:17:1495:18 | Address | &:r1495_1 | -| ir.cpp:1495:22:1495:22 | StoreValue | r1495_3 | -| ir.cpp:1495:22:1495:22 | Unary | r1495_2 | -| ir.cpp:1496:13:1496:13 | Address | &:r1496_1 | -| ir.cpp:1496:17:1496:17 | Address | &:r1496_2 | -| ir.cpp:1496:17:1496:17 | Load | m1493_8 | -| ir.cpp:1496:17:1496:17 | StoreValue | r1496_3 | -| ir.cpp:1497:9:1497:9 | Address | &:r1497_2 | -| ir.cpp:1497:13:1497:13 | StoreValue | r1497_1 | -| ir.cpp:1498:14:1498:15 | Address | &:r1498_1 | -| ir.cpp:1498:19:1498:19 | StoreValue | r1498_3 | -| ir.cpp:1498:19:1498:19 | Unary | r1498_2 | -| ir.cpp:1499:13:1499:13 | Address | &:r1499_1 | -| ir.cpp:1499:17:1499:17 | Address | &:r1499_2 | -| ir.cpp:1499:17:1499:17 | Load | m1497_3 | -| ir.cpp:1499:17:1499:17 | StoreValue | r1499_3 | -| ir.cpp:1503:14:1503:35 | Address | &:r1503_1 | -| ir.cpp:1503:39:1503:39 | Address | &:r1503_2 | -| ir.cpp:1503:39:1503:39 | Load | m1490_8 | -| ir.cpp:1503:39:1503:39 | StoreValue | r1503_3 | -| ir.cpp:1504:15:1504:15 | Address | &:r1504_1 | -| ir.cpp:1504:19:1504:40 | Unary | r1504_2 | -| ir.cpp:1504:19:1504:42 | StoreValue | r1504_4 | -| ir.cpp:1504:42:1504:42 | Unary | r1504_3 | -| ir.cpp:1505:15:1505:15 | Address | &:r1505_1 | -| ir.cpp:1505:19:1505:40 | Unary | r1505_2 | -| ir.cpp:1505:19:1505:42 | StoreValue | r1505_4 | -| ir.cpp:1505:42:1505:42 | Unary | r1505_3 | -| ir.cpp:1507:15:1507:15 | Address | &:r1507_1 | -| ir.cpp:1507:19:1507:40 | Unary | r1507_2 | -| ir.cpp:1507:19:1507:42 | StoreValue | r1507_6 | -| ir.cpp:1507:19:1507:42 | Unary | r1507_5 | -| ir.cpp:1507:42:1507:42 | Address | &:r1507_3 | -| ir.cpp:1507:42:1507:42 | Load | ~m1503_4 | -| ir.cpp:1507:42:1507:42 | Unary | r1507_4 | -| ir.cpp:1508:9:1508:9 | Address | &:r1508_2 | -| ir.cpp:1508:9:1508:9 | Address | &:r1508_4 | -| ir.cpp:1508:9:1508:9 | Load | m1505_5 | -| ir.cpp:1508:9:1508:9 | Unary | r1508_3 | -| ir.cpp:1508:9:1508:15 | ChiPartial | partial:m1508_5 | -| ir.cpp:1508:9:1508:15 | ChiTotal | total:m1503_4 | -| ir.cpp:1508:13:1508:15 | StoreValue | r1508_1 | -| ir.cpp:1509:17:1509:18 | Address | &:r1509_1 | -| ir.cpp:1509:22:1509:22 | Address | &:r1509_2 | -| ir.cpp:1509:22:1509:22 | Load | m1505_5 | -| ir.cpp:1509:22:1509:22 | StoreValue | r1509_5 | -| ir.cpp:1509:22:1509:22 | Unary | r1509_3 | -| ir.cpp:1509:22:1509:22 | Unary | r1509_4 | -| ir.cpp:1510:13:1510:13 | Address | &:r1510_1 | -| ir.cpp:1510:17:1510:17 | Address | &:r1510_2 | -| ir.cpp:1510:17:1510:17 | Address | &:r1510_3 | -| ir.cpp:1510:17:1510:17 | Load | m1504_5 | -| ir.cpp:1510:17:1510:17 | Load | ~m1503_4 | -| ir.cpp:1510:17:1510:17 | StoreValue | r1510_4 | -| ir.cpp:1511:9:1511:9 | Address | &:r1511_2 | -| ir.cpp:1511:9:1511:9 | Address | &:r1511_4 | -| ir.cpp:1511:9:1511:9 | Load | m1507_7 | -| ir.cpp:1511:9:1511:9 | Unary | r1511_3 | -| ir.cpp:1511:9:1511:13 | ChiPartial | partial:m1511_5 | -| ir.cpp:1511:9:1511:13 | ChiTotal | total:m1490_6 | -| ir.cpp:1511:13:1511:13 | StoreValue | r1511_1 | -| ir.cpp:1512:14:1512:15 | Address | &:r1512_1 | -| ir.cpp:1512:19:1512:19 | Address | &:r1512_2 | -| ir.cpp:1512:19:1512:19 | Load | m1507_7 | -| ir.cpp:1512:19:1512:19 | StoreValue | r1512_5 | -| ir.cpp:1512:19:1512:19 | Unary | r1512_3 | -| ir.cpp:1512:19:1512:19 | Unary | r1512_4 | -| ir.cpp:1513:13:1513:13 | Address | &:r1513_1 | -| ir.cpp:1513:17:1513:17 | Address | &:r1513_2 | -| ir.cpp:1513:17:1513:17 | Address | &:r1513_3 | -| ir.cpp:1513:17:1513:17 | Load | m1507_7 | -| ir.cpp:1513:17:1513:17 | Load | ~m1511_6 | -| ir.cpp:1513:17:1513:17 | StoreValue | r1513_4 | -| ir.cpp:1542:8:1542:8 | Address | &:r1542_5 | -| ir.cpp:1542:8:1542:8 | Address | &:r1542_5 | -| ir.cpp:1542:8:1542:8 | Address | &:r1542_7 | -| ir.cpp:1542:8:1542:8 | Address | &:r1542_7 | -| ir.cpp:1542:8:1542:8 | ChiPartial | partial:m1542_3 | -| ir.cpp:1542:8:1542:8 | ChiTotal | total:m1542_2 | -| ir.cpp:1542:8:1542:8 | Load | m1542_6 | -| ir.cpp:1542:8:1542:8 | SideEffect | m1542_3 | -| ir.cpp:1542:8:1542:8 | SideEffect | m1542_8 | -| ir.cpp:1552:54:1552:83 | Address | &:r1552_5 | -| ir.cpp:1552:54:1552:83 | Address | &:r1552_5 | -| ir.cpp:1552:54:1552:83 | Address | &:r1552_7 | -| ir.cpp:1552:54:1552:83 | Address | &:r1552_7 | -| ir.cpp:1552:54:1552:83 | Address | &:r1552_14 | -| ir.cpp:1552:54:1552:83 | ChiPartial | partial:m1552_3 | -| ir.cpp:1552:54:1552:83 | ChiTotal | total:m1552_2 | -| ir.cpp:1552:54:1552:83 | Load | m0_2 | -| ir.cpp:1552:54:1552:83 | Load | m1552_6 | -| ir.cpp:1552:54:1552:83 | SideEffect | m1552_3 | -| ir.cpp:1552:54:1552:83 | SideEffect | m1552_8 | -| ir.cpp:1552:89:1552:97 | Address | &:r1552_9 | -| ir.cpp:1552:96:1552:96 | Address | &:r1552_10 | -| ir.cpp:1552:96:1552:96 | Load | m1552_6 | -| ir.cpp:1552:96:1552:96 | Unary | r1552_11 | -| ir.cpp:1552:96:1552:96 | Unary | r1552_12 | -| ir.cpp:1554:54:1554:83 | Address | &:r1554_5 | -| ir.cpp:1554:54:1554:83 | Address | &:r1554_5 | -| ir.cpp:1554:54:1554:83 | Address | &:r1554_7 | -| ir.cpp:1554:54:1554:83 | Address | &:r1554_7 | -| ir.cpp:1554:54:1554:83 | Address | &:r1554_14 | -| ir.cpp:1554:54:1554:83 | ChiPartial | partial:m1554_3 | -| ir.cpp:1554:54:1554:83 | ChiTotal | total:m1554_2 | -| ir.cpp:1554:54:1554:83 | Load | m0_2 | -| ir.cpp:1554:54:1554:83 | Load | m1554_6 | -| ir.cpp:1554:54:1554:83 | SideEffect | m1554_3 | -| ir.cpp:1554:54:1554:83 | SideEffect | m1554_8 | -| ir.cpp:1554:89:1554:97 | Address | &:r1554_9 | -| ir.cpp:1554:96:1554:96 | Address | &:r1554_10 | -| ir.cpp:1554:96:1554:96 | Load | m1554_6 | -| ir.cpp:1554:96:1554:96 | Unary | r1554_11 | -| ir.cpp:1554:96:1554:96 | Unary | r1554_12 | -| ir.cpp:1556:54:1556:83 | Address | &:r1556_5 | -| ir.cpp:1556:54:1556:83 | Address | &:r1556_5 | -| ir.cpp:1556:54:1556:83 | Address | &:r1556_7 | -| ir.cpp:1556:54:1556:83 | Address | &:r1556_7 | -| ir.cpp:1556:54:1556:83 | Address | &:r1556_18 | -| ir.cpp:1556:54:1556:83 | ChiPartial | partial:m1556_3 | -| ir.cpp:1556:54:1556:83 | ChiTotal | total:m1556_2 | -| ir.cpp:1556:54:1556:83 | Load | m1556_6 | -| ir.cpp:1556:54:1556:83 | Load | m1556_16 | -| ir.cpp:1556:54:1556:83 | SideEffect | m1556_3 | -| ir.cpp:1556:54:1556:83 | SideEffect | m1556_8 | -| ir.cpp:1556:89:1556:97 | Address | &:r1556_9 | -| ir.cpp:1556:96:1556:96 | Address | &:r1556_10 | -| ir.cpp:1556:96:1556:96 | Address | &:r1556_12 | -| ir.cpp:1556:96:1556:96 | Load | m1556_6 | -| ir.cpp:1556:96:1556:96 | Load | ~m1556_8 | -| ir.cpp:1556:96:1556:96 | StoreValue | r1556_15 | -| ir.cpp:1556:96:1556:96 | Unary | r1556_11 | -| ir.cpp:1556:96:1556:96 | Unary | r1556_13 | -| ir.cpp:1556:96:1556:96 | Unary | r1556_14 | -| ir.cpp:1558:6:1558:29 | ChiPartial | partial:m1558_3 | -| ir.cpp:1558:6:1558:29 | ChiTotal | total:m1558_2 | -| ir.cpp:1558:6:1558:29 | SideEffect | ~m1579_6 | -| ir.cpp:1559:28:1559:28 | Address | &:r1559_1 | -| ir.cpp:1559:28:1559:28 | Address | &:r1559_1 | -| ir.cpp:1559:28:1559:28 | Arg(this) | this:r1559_1 | -| ir.cpp:1559:28:1559:28 | CallTarget | func:r1559_3 | -| ir.cpp:1559:28:1559:28 | ChiPartial | partial:m1559_5 | -| ir.cpp:1559:28:1559:28 | ChiPartial | partial:m1559_7 | -| ir.cpp:1559:28:1559:28 | ChiTotal | total:m1558_4 | -| ir.cpp:1559:28:1559:28 | ChiTotal | total:m1559_2 | -| ir.cpp:1559:28:1559:28 | SideEffect | ~m1558_4 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_1 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_6 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_6 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_18 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_18 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_30 | -| ir.cpp:1562:14:1562:14 | Address | &:r1562_30 | -| ir.cpp:1562:14:1562:14 | Arg(this) | this:r1562_6 | -| ir.cpp:1562:14:1562:14 | Arg(this) | this:r1562_18 | -| ir.cpp:1562:14:1562:14 | Arg(this) | this:r1562_30 | -| ir.cpp:1562:14:1562:14 | CallTarget | func:r1562_7 | -| ir.cpp:1562:14:1562:14 | CallTarget | func:r1562_19 | -| ir.cpp:1562:14:1562:14 | CallTarget | func:r1562_31 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_9 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_12 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_21 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_24 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_33 | -| ir.cpp:1562:14:1562:14 | ChiPartial | partial:m1562_36 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1559_6 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1562_4 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1562_10 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1562_13 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1562_22 | -| ir.cpp:1562:14:1562:14 | ChiTotal | total:m1562_25 | -| ir.cpp:1562:14:1562:14 | SideEffect | m1562_4 | -| ir.cpp:1562:14:1562:14 | SideEffect | m1562_13 | -| ir.cpp:1562:14:1562:14 | SideEffect | m1562_25 | -| ir.cpp:1562:14:1562:14 | SideEffect | ~m1559_6 | -| ir.cpp:1562:14:1562:14 | SideEffect | ~m1562_10 | -| ir.cpp:1562:14:1562:14 | SideEffect | ~m1562_22 | -| ir.cpp:1562:14:1562:14 | Unary | r1562_8 | -| ir.cpp:1562:14:1562:14 | Unary | r1562_20 | -| ir.cpp:1562:14:1562:14 | Unary | r1562_32 | -| ir.cpp:1562:14:1562:27 | StoreValue | r1562_15 | -| ir.cpp:1562:14:1562:27 | StoreValue | r1562_27 | -| ir.cpp:1562:14:1562:27 | StoreValue | r1562_39 | -| ir.cpp:1562:14:1562:27 | Unary | r1562_14 | -| ir.cpp:1562:14:1562:27 | Unary | r1562_26 | -| ir.cpp:1562:14:1562:27 | Unary | r1562_38 | -| ir.cpp:1562:15:1562:15 | Address | &:r1562_5 | -| ir.cpp:1562:18:1562:18 | Address | &:r1562_17 | -| ir.cpp:1562:21:1562:21 | Address | &:r1562_29 | -| ir.cpp:1562:26:1562:26 | Address | &:r1562_2 | -| ir.cpp:1562:26:1562:26 | Load | m1559_8 | -| ir.cpp:1562:26:1562:26 | StoreValue | r1562_3 | -| ir.cpp:1563:9:1563:9 | Address | &:r1563_2 | -| ir.cpp:1563:9:1563:9 | Address | &:r1563_4 | -| ir.cpp:1563:9:1563:9 | Load | m1562_28 | -| ir.cpp:1563:9:1563:9 | Unary | r1563_3 | -| ir.cpp:1563:9:1563:15 | ChiPartial | partial:m1563_5 | -| ir.cpp:1563:9:1563:15 | ChiTotal | total:m1562_37 | -| ir.cpp:1563:13:1563:15 | StoreValue | r1563_1 | -| ir.cpp:1564:17:1564:18 | Address | &:r1564_1 | -| ir.cpp:1564:22:1564:22 | Address | &:r1564_2 | -| ir.cpp:1564:22:1564:22 | Load | m1562_28 | -| ir.cpp:1564:22:1564:22 | StoreValue | r1564_5 | -| ir.cpp:1564:22:1564:22 | Unary | r1564_3 | -| ir.cpp:1564:22:1564:22 | Unary | r1564_4 | -| ir.cpp:1565:13:1565:13 | Address | &:r1565_1 | -| ir.cpp:1565:17:1565:17 | Address | &:r1565_2 | -| ir.cpp:1565:17:1565:17 | Address | &:r1565_3 | -| ir.cpp:1565:17:1565:17 | Load | m1562_16 | -| ir.cpp:1565:17:1565:17 | Load | ~m1562_37 | -| ir.cpp:1565:17:1565:17 | StoreValue | r1565_4 | -| ir.cpp:1566:9:1566:9 | Address | &:r1566_2 | -| ir.cpp:1566:9:1566:9 | Address | &:r1566_4 | -| ir.cpp:1566:9:1566:9 | Load | m1562_40 | -| ir.cpp:1566:9:1566:9 | Unary | r1566_3 | -| ir.cpp:1566:9:1566:13 | ChiPartial | partial:m1566_5 | -| ir.cpp:1566:9:1566:13 | ChiTotal | total:m1562_34 | -| ir.cpp:1566:13:1566:13 | StoreValue | r1566_1 | -| ir.cpp:1567:14:1567:15 | Address | &:r1567_1 | -| ir.cpp:1567:19:1567:19 | Address | &:r1567_2 | -| ir.cpp:1567:19:1567:19 | Load | m1562_40 | -| ir.cpp:1567:19:1567:19 | StoreValue | r1567_5 | -| ir.cpp:1567:19:1567:19 | Unary | r1567_3 | -| ir.cpp:1567:19:1567:19 | Unary | r1567_4 | -| ir.cpp:1568:13:1568:13 | Address | &:r1568_1 | -| ir.cpp:1568:17:1568:17 | Address | &:r1568_2 | -| ir.cpp:1568:17:1568:17 | Address | &:r1568_3 | -| ir.cpp:1568:17:1568:17 | Load | m1562_40 | -| ir.cpp:1568:17:1568:17 | Load | ~m1566_6 | -| ir.cpp:1568:17:1568:17 | StoreValue | r1568_4 | -| ir.cpp:1572:14:1572:35 | Address | &:r1572_1 | -| ir.cpp:1572:39:1572:39 | Address | &:r1572_2 | -| ir.cpp:1572:39:1572:39 | Load | m1559_8 | -| ir.cpp:1572:39:1572:39 | StoreValue | r1572_3 | -| ir.cpp:1573:15:1573:15 | Address | &:r1573_1 | -| ir.cpp:1573:19:1573:40 | Address | &:r1573_2 | -| ir.cpp:1573:19:1573:40 | Address | &:r1573_2 | -| ir.cpp:1573:19:1573:40 | Arg(this) | this:r1573_2 | -| ir.cpp:1573:19:1573:40 | ChiPartial | partial:m1573_8 | -| ir.cpp:1573:19:1573:40 | ChiTotal | total:m1572_4 | -| ir.cpp:1573:19:1573:40 | SideEffect | m1572_4 | -| ir.cpp:1573:42:1573:47 | CallTarget | func:r1573_3 | -| ir.cpp:1573:42:1573:47 | ChiPartial | partial:m1573_5 | -| ir.cpp:1573:42:1573:47 | ChiTotal | total:m1566_6 | -| ir.cpp:1573:42:1573:47 | SideEffect | ~m1566_6 | -| ir.cpp:1573:42:1573:47 | Unary | r1573_4 | -| ir.cpp:1573:42:1573:50 | StoreValue | r1573_11 | -| ir.cpp:1573:42:1573:50 | Unary | r1573_10 | -| ir.cpp:1574:15:1574:15 | Address | &:r1574_1 | -| ir.cpp:1574:19:1574:40 | Address | &:r1574_2 | -| ir.cpp:1574:19:1574:40 | Address | &:r1574_2 | -| ir.cpp:1574:19:1574:40 | Arg(this) | this:r1574_2 | -| ir.cpp:1574:19:1574:40 | ChiPartial | partial:m1574_8 | -| ir.cpp:1574:19:1574:40 | ChiTotal | total:m1573_9 | -| ir.cpp:1574:19:1574:40 | SideEffect | m1573_9 | -| ir.cpp:1574:42:1574:47 | CallTarget | func:r1574_3 | -| ir.cpp:1574:42:1574:47 | ChiPartial | partial:m1574_5 | -| ir.cpp:1574:42:1574:47 | ChiTotal | total:m1573_6 | -| ir.cpp:1574:42:1574:47 | SideEffect | ~m1573_6 | -| ir.cpp:1574:42:1574:47 | Unary | r1574_4 | -| ir.cpp:1574:42:1574:50 | StoreValue | r1574_11 | -| ir.cpp:1574:42:1574:50 | Unary | r1574_10 | -| ir.cpp:1575:15:1575:15 | Address | &:r1575_1 | -| ir.cpp:1575:19:1575:40 | Address | &:r1575_2 | -| ir.cpp:1575:19:1575:40 | Address | &:r1575_2 | -| ir.cpp:1575:19:1575:40 | Arg(this) | this:r1575_2 | -| ir.cpp:1575:19:1575:40 | ChiPartial | partial:m1575_8 | -| ir.cpp:1575:19:1575:40 | ChiTotal | total:m1574_9 | -| ir.cpp:1575:19:1575:40 | SideEffect | m1574_9 | -| ir.cpp:1575:42:1575:47 | CallTarget | func:r1575_3 | -| ir.cpp:1575:42:1575:47 | ChiPartial | partial:m1575_5 | -| ir.cpp:1575:42:1575:47 | ChiTotal | total:m1574_6 | -| ir.cpp:1575:42:1575:47 | SideEffect | ~m1574_6 | -| ir.cpp:1575:42:1575:47 | Unary | r1575_4 | -| ir.cpp:1575:42:1575:50 | StoreValue | r1575_11 | -| ir.cpp:1575:42:1575:50 | Unary | r1575_10 | -| ir.cpp:1576:9:1576:9 | Address | &:r1576_2 | -| ir.cpp:1576:9:1576:9 | Address | &:r1576_4 | -| ir.cpp:1576:9:1576:9 | Load | m1574_12 | -| ir.cpp:1576:9:1576:9 | Unary | r1576_3 | -| ir.cpp:1576:9:1576:15 | ChiPartial | partial:m1576_5 | -| ir.cpp:1576:9:1576:15 | ChiTotal | total:m1575_9 | -| ir.cpp:1576:13:1576:15 | StoreValue | r1576_1 | -| ir.cpp:1577:17:1577:18 | Address | &:r1577_1 | -| ir.cpp:1577:22:1577:22 | Address | &:r1577_2 | -| ir.cpp:1577:22:1577:22 | Load | m1574_12 | -| ir.cpp:1577:22:1577:22 | StoreValue | r1577_5 | -| ir.cpp:1577:22:1577:22 | Unary | r1577_3 | -| ir.cpp:1577:22:1577:22 | Unary | r1577_4 | -| ir.cpp:1578:13:1578:13 | Address | &:r1578_1 | -| ir.cpp:1578:17:1578:17 | Address | &:r1578_2 | -| ir.cpp:1578:17:1578:17 | Address | &:r1578_3 | -| ir.cpp:1578:17:1578:17 | Load | m1573_12 | -| ir.cpp:1578:17:1578:17 | Load | ~m1575_9 | -| ir.cpp:1578:17:1578:17 | StoreValue | r1578_4 | -| ir.cpp:1579:9:1579:9 | Address | &:r1579_2 | -| ir.cpp:1579:9:1579:9 | Address | &:r1579_4 | -| ir.cpp:1579:9:1579:9 | Load | m1575_12 | -| ir.cpp:1579:9:1579:9 | Unary | r1579_3 | -| ir.cpp:1579:9:1579:13 | ChiPartial | partial:m1579_5 | -| ir.cpp:1579:9:1579:13 | ChiTotal | total:m1575_6 | -| ir.cpp:1579:13:1579:13 | StoreValue | r1579_1 | -| ir.cpp:1580:14:1580:15 | Address | &:r1580_1 | -| ir.cpp:1580:19:1580:19 | Address | &:r1580_2 | -| ir.cpp:1580:19:1580:19 | Load | m1575_12 | -| ir.cpp:1580:19:1580:19 | StoreValue | r1580_5 | -| ir.cpp:1580:19:1580:19 | Unary | r1580_3 | -| ir.cpp:1580:19:1580:19 | Unary | r1580_4 | -| ir.cpp:1581:13:1581:13 | Address | &:r1581_1 | -| ir.cpp:1581:17:1581:17 | Address | &:r1581_2 | -| ir.cpp:1581:17:1581:17 | Address | &:r1581_3 | -| ir.cpp:1581:17:1581:17 | Load | m1575_12 | -| ir.cpp:1581:17:1581:17 | Load | ~m1579_6 | -| ir.cpp:1581:17:1581:17 | StoreValue | r1581_4 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_9 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_10 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_13 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_17 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_18 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_21 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_25 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_26 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_29 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_33 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_34 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_37 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_41 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_42 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_45 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_49 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_50 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_53 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_57 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_58 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_61 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_65 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_66 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_69 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_3 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_3 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_15 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_23 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_31 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_39 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_47 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_55 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_63 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_71 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_2 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_2 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_8 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_16 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_24 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_32 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_40 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_48 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_56 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_64 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m0_2 | +| ir.cpp:1486:8:1486:8 | Load | m1486_6 | +| ir.cpp:1486:8:1486:8 | Load | m1486_6 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | Load | ~m0_4 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_3 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_3 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_8 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_72 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_14 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_22 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_30 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_38 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_46 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_54 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_62 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_70 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | m1486_6 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_11 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_12 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_19 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_20 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_27 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_28 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_35 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_36 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_43 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_44 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_51 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_52 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_59 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_60 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_67 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_68 | +| ir.cpp:1499:6:1499:35 | ChiPartial | partial:m1499_3 | +| ir.cpp:1499:6:1499:35 | ChiTotal | total:m1499_2 | +| ir.cpp:1499:6:1499:35 | SideEffect | ~m1525_7 | +| ir.cpp:1500:39:1500:39 | Address | &:r1500_1 | +| ir.cpp:1500:39:1500:39 | Address | &:r1500_1 | +| ir.cpp:1500:39:1500:39 | Arg(this) | this:r1500_1 | +| ir.cpp:1500:39:1500:39 | CallTarget | func:r1500_3 | +| ir.cpp:1500:39:1500:39 | ChiPartial | partial:m1500_5 | +| ir.cpp:1500:39:1500:39 | ChiPartial | partial:m1500_7 | +| ir.cpp:1500:39:1500:39 | ChiTotal | total:m1499_4 | +| ir.cpp:1500:39:1500:39 | ChiTotal | total:m1500_2 | +| ir.cpp:1500:39:1500:39 | SideEffect | ~m1499_4 | +| ir.cpp:1503:14:1503:14 | Address | &:r1503_1 | +| ir.cpp:1503:15:1503:15 | Address | &:r1503_5 | +| ir.cpp:1503:18:1503:18 | Address | &:r1503_9 | +| ir.cpp:1503:21:1503:21 | Address | &:r1503_13 | +| ir.cpp:1503:24:1503:24 | Address | &:r1503_17 | +| ir.cpp:1503:27:1503:27 | Address | &:r1503_23 | +| ir.cpp:1503:30:1503:30 | Address | &:r1503_27 | +| ir.cpp:1503:34:1503:34 | Address | &:r1503_31 | +| ir.cpp:1503:41:1503:41 | Address | &:r1503_37 | +| ir.cpp:1503:46:1503:46 | Address | &:r1503_2 | +| ir.cpp:1503:46:1503:46 | Load | m1500_8 | +| ir.cpp:1503:46:1503:46 | StoreValue | r1503_3 | +| ir.cpp:1503:47:1503:47 | Address | &:r1503_19 | +| ir.cpp:1503:47:1503:47 | Address | &:r1503_33 | +| ir.cpp:1503:47:1503:47 | Load | ~m1503_4 | +| ir.cpp:1503:47:1503:47 | Load | ~m1503_4 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_7 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_11 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_15 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_21 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_25 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_29 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_35 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_39 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_6 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_10 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_14 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_18 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_20 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_24 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_28 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_32 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_34 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_38 | +| ir.cpp:1504:9:1504:9 | Address | &:r1504_2 | +| ir.cpp:1504:9:1504:9 | Address | &:r1504_3 | +| ir.cpp:1504:9:1504:9 | Load | m1503_12 | +| ir.cpp:1504:9:1504:15 | ChiPartial | partial:m1504_4 | +| ir.cpp:1504:9:1504:15 | ChiTotal | total:m1503_4 | +| ir.cpp:1504:13:1504:15 | StoreValue | r1504_1 | +| ir.cpp:1505:17:1505:18 | Address | &:r1505_1 | +| ir.cpp:1505:22:1505:22 | Address | &:r1505_2 | +| ir.cpp:1505:22:1505:22 | Load | m1503_12 | +| ir.cpp:1505:22:1505:22 | StoreValue | r1505_4 | +| ir.cpp:1505:22:1505:22 | Unary | r1505_3 | +| ir.cpp:1506:13:1506:13 | Address | &:r1506_1 | +| ir.cpp:1506:17:1506:17 | Address | &:r1506_2 | +| ir.cpp:1506:17:1506:17 | Address | &:r1506_3 | +| ir.cpp:1506:17:1506:17 | Load | m1503_8 | +| ir.cpp:1506:17:1506:17 | Load | ~m1503_4 | +| ir.cpp:1506:17:1506:17 | StoreValue | r1506_4 | +| ir.cpp:1507:9:1507:9 | Address | &:r1507_2 | +| ir.cpp:1507:9:1507:9 | Address | &:r1507_3 | +| ir.cpp:1507:9:1507:9 | Load | m1503_22 | +| ir.cpp:1507:9:1507:13 | ChiPartial | partial:m1507_4 | +| ir.cpp:1507:9:1507:13 | ChiTotal | total:m1500_6 | +| ir.cpp:1507:13:1507:13 | StoreValue | r1507_1 | +| ir.cpp:1508:9:1508:10 | Address | &:r1508_5 | +| ir.cpp:1508:9:1508:14 | ChiPartial | partial:m1508_6 | +| ir.cpp:1508:9:1508:14 | ChiTotal | total:m1507_5 | +| ir.cpp:1508:10:1508:10 | Address | &:r1508_2 | +| ir.cpp:1508:10:1508:10 | Address | &:r1508_3 | +| ir.cpp:1508:10:1508:10 | Load | m1503_26 | +| ir.cpp:1508:10:1508:10 | Load | ~m1503_4 | +| ir.cpp:1508:10:1508:10 | Unary | r1508_4 | +| ir.cpp:1508:14:1508:14 | StoreValue | r1508_1 | +| ir.cpp:1509:14:1509:15 | Address | &:r1509_1 | +| ir.cpp:1509:19:1509:19 | Address | &:r1509_2 | +| ir.cpp:1509:19:1509:19 | Load | m1503_22 | +| ir.cpp:1509:19:1509:19 | StoreValue | r1509_4 | +| ir.cpp:1509:19:1509:19 | Unary | r1509_3 | +| ir.cpp:1510:14:1510:15 | Address | &:r1510_1 | +| ir.cpp:1510:19:1510:20 | StoreValue | r1510_4 | +| ir.cpp:1510:20:1510:20 | Address | &:r1510_2 | +| ir.cpp:1510:20:1510:20 | Load | m1503_22 | +| ir.cpp:1510:20:1510:20 | Unary | r1510_3 | +| ir.cpp:1511:13:1511:13 | Address | &:r1511_1 | +| ir.cpp:1511:17:1511:17 | Address | &:r1511_2 | +| ir.cpp:1511:17:1511:17 | Address | &:r1511_3 | +| ir.cpp:1511:17:1511:17 | Load | m1503_22 | +| ir.cpp:1511:17:1511:17 | Load | ~m1508_7 | +| ir.cpp:1511:17:1511:17 | StoreValue | r1511_4 | +| ir.cpp:1515:14:1515:35 | Address | &:r1515_1 | +| ir.cpp:1515:39:1515:39 | Address | &:r1515_2 | +| ir.cpp:1515:39:1515:39 | Load | m1500_8 | +| ir.cpp:1515:39:1515:39 | StoreValue | r1515_3 | +| ir.cpp:1516:15:1516:15 | Address | &:r1516_1 | +| ir.cpp:1516:19:1516:40 | Unary | r1516_2 | +| ir.cpp:1516:19:1516:42 | StoreValue | r1516_4 | +| ir.cpp:1516:42:1516:42 | Unary | r1516_3 | +| ir.cpp:1517:15:1517:15 | Address | &:r1517_1 | +| ir.cpp:1517:19:1517:40 | Unary | r1517_2 | +| ir.cpp:1517:19:1517:42 | StoreValue | r1517_4 | +| ir.cpp:1517:42:1517:42 | Unary | r1517_3 | +| ir.cpp:1519:15:1519:15 | Address | &:r1519_1 | +| ir.cpp:1519:19:1519:40 | Unary | r1519_2 | +| ir.cpp:1519:19:1519:42 | StoreValue | r1519_6 | +| ir.cpp:1519:19:1519:42 | Unary | r1519_5 | +| ir.cpp:1519:42:1519:42 | Address | &:r1519_3 | +| ir.cpp:1519:42:1519:42 | Load | ~m1515_4 | +| ir.cpp:1519:42:1519:42 | Unary | r1519_4 | +| ir.cpp:1520:15:1520:15 | Address | &:r1520_1 | +| ir.cpp:1520:19:1520:40 | Unary | r1520_2 | +| ir.cpp:1520:19:1520:42 | StoreValue | r1520_4 | +| ir.cpp:1520:42:1520:42 | Unary | r1520_3 | +| ir.cpp:1521:9:1521:9 | Address | &:r1521_2 | +| ir.cpp:1521:9:1521:9 | Address | &:r1521_4 | +| ir.cpp:1521:9:1521:9 | Load | m1517_5 | +| ir.cpp:1521:9:1521:9 | Unary | r1521_3 | +| ir.cpp:1521:9:1521:15 | ChiPartial | partial:m1521_5 | +| ir.cpp:1521:9:1521:15 | ChiTotal | total:m1515_4 | +| ir.cpp:1521:13:1521:15 | StoreValue | r1521_1 | +| ir.cpp:1522:17:1522:18 | Address | &:r1522_1 | +| ir.cpp:1522:22:1522:22 | Address | &:r1522_2 | +| ir.cpp:1522:22:1522:22 | Load | m1517_5 | +| ir.cpp:1522:22:1522:22 | StoreValue | r1522_5 | +| ir.cpp:1522:22:1522:22 | Unary | r1522_3 | +| ir.cpp:1522:22:1522:22 | Unary | r1522_4 | +| ir.cpp:1523:13:1523:13 | Address | &:r1523_1 | +| ir.cpp:1523:17:1523:17 | Address | &:r1523_2 | +| ir.cpp:1523:17:1523:17 | Address | &:r1523_3 | +| ir.cpp:1523:17:1523:17 | Load | m1516_5 | +| ir.cpp:1523:17:1523:17 | Load | ~m1515_4 | +| ir.cpp:1523:17:1523:17 | StoreValue | r1523_4 | +| ir.cpp:1524:9:1524:9 | Address | &:r1524_2 | +| ir.cpp:1524:9:1524:9 | Address | &:r1524_4 | +| ir.cpp:1524:9:1524:9 | Load | m1519_7 | +| ir.cpp:1524:9:1524:9 | Unary | r1524_3 | +| ir.cpp:1524:9:1524:13 | ChiPartial | partial:m1524_5 | +| ir.cpp:1524:9:1524:13 | ChiTotal | total:m1508_7 | +| ir.cpp:1524:13:1524:13 | StoreValue | r1524_1 | +| ir.cpp:1525:9:1525:10 | Address | &:r1525_5 | +| ir.cpp:1525:9:1525:14 | ChiPartial | partial:m1525_6 | +| ir.cpp:1525:9:1525:14 | ChiTotal | total:m1524_6 | +| ir.cpp:1525:10:1525:10 | Address | &:r1525_2 | +| ir.cpp:1525:10:1525:10 | Address | &:r1525_3 | +| ir.cpp:1525:10:1525:10 | Load | m1520_5 | +| ir.cpp:1525:10:1525:10 | Load | ~m1515_4 | +| ir.cpp:1525:10:1525:10 | Unary | r1525_4 | +| ir.cpp:1525:14:1525:14 | StoreValue | r1525_1 | +| ir.cpp:1526:14:1526:15 | Address | &:r1526_1 | +| ir.cpp:1526:19:1526:19 | Address | &:r1526_2 | +| ir.cpp:1526:19:1526:19 | Load | m1519_7 | +| ir.cpp:1526:19:1526:19 | StoreValue | r1526_5 | +| ir.cpp:1526:19:1526:19 | Unary | r1526_3 | +| ir.cpp:1526:19:1526:19 | Unary | r1526_4 | +| ir.cpp:1527:14:1527:15 | Address | &:r1527_1 | +| ir.cpp:1527:19:1527:20 | StoreValue | r1527_5 | +| ir.cpp:1527:20:1527:20 | Address | &:r1527_2 | +| ir.cpp:1527:20:1527:20 | Load | m1519_7 | +| ir.cpp:1527:20:1527:20 | Unary | r1527_3 | +| ir.cpp:1527:20:1527:20 | Unary | r1527_4 | +| ir.cpp:1528:13:1528:13 | Address | &:r1528_1 | +| ir.cpp:1528:17:1528:17 | Address | &:r1528_2 | +| ir.cpp:1528:17:1528:17 | Address | &:r1528_3 | +| ir.cpp:1528:17:1528:17 | Load | m1519_7 | +| ir.cpp:1528:17:1528:17 | Load | ~m1525_7 | +| ir.cpp:1528:17:1528:17 | StoreValue | r1528_4 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_9 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_10 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_13 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_17 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_18 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_21 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_25 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_26 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_29 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_3 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_3 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_15 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_23 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_31 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_2 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_2 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_8 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_16 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_24 | +| ir.cpp:1539:8:1539:8 | Load | m0_2 | +| ir.cpp:1539:8:1539:8 | Load | m0_2 | +| ir.cpp:1539:8:1539:8 | Load | m0_2 | +| ir.cpp:1539:8:1539:8 | Load | m1539_6 | +| ir.cpp:1539:8:1539:8 | Load | m1539_6 | +| ir.cpp:1539:8:1539:8 | Load | ~m0_4 | +| ir.cpp:1539:8:1539:8 | Load | ~m0_4 | +| ir.cpp:1539:8:1539:8 | Load | ~m0_4 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_3 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_3 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_8 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_32 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_14 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_22 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_30 | +| ir.cpp:1539:8:1539:8 | Unary | m1539_6 | +| ir.cpp:1539:8:1539:8 | Unary | m1539_6 | +| ir.cpp:1539:8:1539:8 | Unary | m1539_6 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_11 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_12 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_19 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_20 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_27 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_28 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_7 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_7 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_10 | +| ir.cpp:1567:60:1567:95 | ChiPartial | partial:m1567_3 | +| ir.cpp:1567:60:1567:95 | ChiTotal | total:m1567_2 | +| ir.cpp:1567:60:1567:95 | Load | m0_2 | +| ir.cpp:1567:60:1567:95 | Load | m1567_6 | +| ir.cpp:1567:60:1567:95 | SideEffect | m1567_3 | +| ir.cpp:1567:60:1567:95 | SideEffect | m1567_8 | +| ir.cpp:1568:5:1568:13 | Address | &:r1568_1 | +| ir.cpp:1568:12:1568:12 | Address | &:r1568_2 | +| ir.cpp:1568:12:1568:12 | Load | m1567_6 | +| ir.cpp:1568:12:1568:12 | Unary | r1568_3 | +| ir.cpp:1568:12:1568:12 | Unary | r1568_4 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_5 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_5 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_7 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_7 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_10 | +| ir.cpp:1571:60:1571:95 | ChiPartial | partial:m1571_3 | +| ir.cpp:1571:60:1571:95 | ChiTotal | total:m1571_2 | +| ir.cpp:1571:60:1571:95 | Load | m0_2 | +| ir.cpp:1571:60:1571:95 | Load | m1571_6 | +| ir.cpp:1571:60:1571:95 | SideEffect | m1571_3 | +| ir.cpp:1571:60:1571:95 | SideEffect | m1571_8 | +| ir.cpp:1572:5:1572:13 | Address | &:r1572_1 | +| ir.cpp:1572:12:1572:12 | Address | &:r1572_2 | +| ir.cpp:1572:12:1572:12 | Load | m1571_6 | +| ir.cpp:1572:12:1572:12 | Unary | r1572_3 | +| ir.cpp:1572:12:1572:12 | Unary | r1572_4 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_5 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_5 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_7 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_7 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_10 | +| ir.cpp:1575:60:1575:95 | ChiPartial | partial:m1575_3 | +| ir.cpp:1575:60:1575:95 | ChiTotal | total:m1575_2 | +| ir.cpp:1575:60:1575:95 | Load | m1575_6 | +| ir.cpp:1575:60:1575:95 | Load | m1576_8 | +| ir.cpp:1575:60:1575:95 | SideEffect | m1575_3 | +| ir.cpp:1575:60:1575:95 | SideEffect | m1575_8 | +| ir.cpp:1576:5:1576:13 | Address | &:r1576_1 | +| ir.cpp:1576:12:1576:12 | Address | &:r1576_2 | +| ir.cpp:1576:12:1576:12 | Address | &:r1576_4 | +| ir.cpp:1576:12:1576:12 | Load | m1575_6 | +| ir.cpp:1576:12:1576:12 | Load | ~m1575_8 | +| ir.cpp:1576:12:1576:12 | StoreValue | r1576_7 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_3 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_5 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_6 | +| ir.cpp:1579:6:1579:37 | ChiPartial | partial:m1579_3 | +| ir.cpp:1579:6:1579:37 | ChiTotal | total:m1579_2 | +| ir.cpp:1579:6:1579:37 | SideEffect | ~m1600_6 | +| ir.cpp:1580:34:1580:34 | Address | &:r1580_1 | +| ir.cpp:1580:34:1580:34 | Address | &:r1580_1 | +| ir.cpp:1580:34:1580:34 | Arg(this) | this:r1580_1 | +| ir.cpp:1580:34:1580:34 | CallTarget | func:r1580_3 | +| ir.cpp:1580:34:1580:34 | ChiPartial | partial:m1580_5 | +| ir.cpp:1580:34:1580:34 | ChiPartial | partial:m1580_7 | +| ir.cpp:1580:34:1580:34 | ChiTotal | total:m1579_4 | +| ir.cpp:1580:34:1580:34 | ChiTotal | total:m1580_2 | +| ir.cpp:1580:34:1580:34 | SideEffect | ~m1579_4 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_1 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_6 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_6 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_18 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_18 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_30 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_30 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_6 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_18 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_30 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_7 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_19 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_31 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_9 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_12 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_21 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_24 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_33 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_36 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1580_6 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_4 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_10 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_13 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_22 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_25 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_4 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_13 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_25 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1580_6 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1583_10 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1583_22 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_8 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_20 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_32 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_15 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_27 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_39 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_14 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_26 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_38 | +| ir.cpp:1583:15:1583:15 | Address | &:r1583_5 | +| ir.cpp:1583:18:1583:18 | Address | &:r1583_17 | +| ir.cpp:1583:21:1583:21 | Address | &:r1583_29 | +| ir.cpp:1583:26:1583:26 | Address | &:r1583_2 | +| ir.cpp:1583:26:1583:26 | Load | m1580_8 | +| ir.cpp:1583:26:1583:26 | StoreValue | r1583_3 | +| ir.cpp:1584:9:1584:9 | Address | &:r1584_2 | +| ir.cpp:1584:9:1584:9 | Address | &:r1584_4 | +| ir.cpp:1584:9:1584:9 | Load | m1583_28 | +| ir.cpp:1584:9:1584:9 | Unary | r1584_3 | +| ir.cpp:1584:9:1584:15 | ChiPartial | partial:m1584_5 | +| ir.cpp:1584:9:1584:15 | ChiTotal | total:m1583_37 | +| ir.cpp:1584:13:1584:15 | StoreValue | r1584_1 | +| ir.cpp:1585:17:1585:18 | Address | &:r1585_1 | +| ir.cpp:1585:22:1585:22 | Address | &:r1585_2 | +| ir.cpp:1585:22:1585:22 | Load | m1583_28 | +| ir.cpp:1585:22:1585:22 | StoreValue | r1585_5 | +| ir.cpp:1585:22:1585:22 | Unary | r1585_3 | +| ir.cpp:1585:22:1585:22 | Unary | r1585_4 | +| ir.cpp:1586:13:1586:13 | Address | &:r1586_1 | +| ir.cpp:1586:17:1586:17 | Address | &:r1586_2 | +| ir.cpp:1586:17:1586:17 | Address | &:r1586_3 | +| ir.cpp:1586:17:1586:17 | Load | m1583_16 | +| ir.cpp:1586:17:1586:17 | Load | ~m1583_37 | +| ir.cpp:1586:17:1586:17 | StoreValue | r1586_4 | +| ir.cpp:1587:9:1587:9 | Address | &:r1587_2 | +| ir.cpp:1587:9:1587:9 | Address | &:r1587_4 | +| ir.cpp:1587:9:1587:9 | Load | m1583_40 | +| ir.cpp:1587:9:1587:9 | Unary | r1587_3 | +| ir.cpp:1587:9:1587:13 | ChiPartial | partial:m1587_5 | +| ir.cpp:1587:9:1587:13 | ChiTotal | total:m1583_34 | +| ir.cpp:1587:13:1587:13 | StoreValue | r1587_1 | +| ir.cpp:1588:14:1588:15 | Address | &:r1588_1 | +| ir.cpp:1588:19:1588:19 | Address | &:r1588_2 | +| ir.cpp:1588:19:1588:19 | Load | m1583_40 | +| ir.cpp:1588:19:1588:19 | StoreValue | r1588_5 | +| ir.cpp:1588:19:1588:19 | Unary | r1588_3 | +| ir.cpp:1588:19:1588:19 | Unary | r1588_4 | +| ir.cpp:1589:13:1589:13 | Address | &:r1589_1 | +| ir.cpp:1589:17:1589:17 | Address | &:r1589_2 | +| ir.cpp:1589:17:1589:17 | Address | &:r1589_3 | +| ir.cpp:1589:17:1589:17 | Load | m1583_40 | +| ir.cpp:1589:17:1589:17 | Load | ~m1587_6 | +| ir.cpp:1589:17:1589:17 | StoreValue | r1589_4 | +| ir.cpp:1593:14:1593:35 | Address | &:r1593_1 | +| ir.cpp:1593:39:1593:39 | Address | &:r1593_2 | +| ir.cpp:1593:39:1593:39 | Load | m1580_8 | +| ir.cpp:1593:39:1593:39 | StoreValue | r1593_3 | +| ir.cpp:1594:15:1594:15 | Address | &:r1594_1 | +| ir.cpp:1594:19:1594:40 | Address | &:r1594_2 | +| ir.cpp:1594:19:1594:40 | Address | &:r1594_2 | +| ir.cpp:1594:19:1594:40 | Arg(this) | this:r1594_2 | +| ir.cpp:1594:19:1594:40 | ChiPartial | partial:m1594_8 | +| ir.cpp:1594:19:1594:40 | ChiTotal | total:m1593_4 | +| ir.cpp:1594:19:1594:40 | SideEffect | m1593_4 | +| ir.cpp:1594:42:1594:47 | CallTarget | func:r1594_3 | +| ir.cpp:1594:42:1594:47 | ChiPartial | partial:m1594_5 | +| ir.cpp:1594:42:1594:47 | ChiTotal | total:m1587_6 | +| ir.cpp:1594:42:1594:47 | SideEffect | ~m1587_6 | +| ir.cpp:1594:42:1594:47 | Unary | r1594_4 | +| ir.cpp:1594:42:1594:50 | StoreValue | r1594_11 | +| ir.cpp:1594:42:1594:50 | Unary | r1594_10 | +| ir.cpp:1595:15:1595:15 | Address | &:r1595_1 | +| ir.cpp:1595:19:1595:40 | Address | &:r1595_2 | +| ir.cpp:1595:19:1595:40 | Address | &:r1595_2 | +| ir.cpp:1595:19:1595:40 | Arg(this) | this:r1595_2 | +| ir.cpp:1595:19:1595:40 | ChiPartial | partial:m1595_8 | +| ir.cpp:1595:19:1595:40 | ChiTotal | total:m1594_9 | +| ir.cpp:1595:19:1595:40 | SideEffect | m1594_9 | +| ir.cpp:1595:42:1595:47 | CallTarget | func:r1595_3 | +| ir.cpp:1595:42:1595:47 | ChiPartial | partial:m1595_5 | +| ir.cpp:1595:42:1595:47 | ChiTotal | total:m1594_6 | +| ir.cpp:1595:42:1595:47 | SideEffect | ~m1594_6 | +| ir.cpp:1595:42:1595:47 | Unary | r1595_4 | +| ir.cpp:1595:42:1595:50 | StoreValue | r1595_11 | +| ir.cpp:1595:42:1595:50 | Unary | r1595_10 | +| ir.cpp:1596:15:1596:15 | Address | &:r1596_1 | +| ir.cpp:1596:19:1596:40 | Address | &:r1596_2 | +| ir.cpp:1596:19:1596:40 | Address | &:r1596_2 | +| ir.cpp:1596:19:1596:40 | Arg(this) | this:r1596_2 | +| ir.cpp:1596:19:1596:40 | ChiPartial | partial:m1596_8 | +| ir.cpp:1596:19:1596:40 | ChiTotal | total:m1595_9 | +| ir.cpp:1596:19:1596:40 | SideEffect | m1595_9 | +| ir.cpp:1596:42:1596:47 | CallTarget | func:r1596_3 | +| ir.cpp:1596:42:1596:47 | ChiPartial | partial:m1596_5 | +| ir.cpp:1596:42:1596:47 | ChiTotal | total:m1595_6 | +| ir.cpp:1596:42:1596:47 | SideEffect | ~m1595_6 | +| ir.cpp:1596:42:1596:47 | Unary | r1596_4 | +| ir.cpp:1596:42:1596:50 | StoreValue | r1596_11 | +| ir.cpp:1596:42:1596:50 | Unary | r1596_10 | +| ir.cpp:1597:9:1597:9 | Address | &:r1597_2 | +| ir.cpp:1597:9:1597:9 | Address | &:r1597_4 | +| ir.cpp:1597:9:1597:9 | Load | m1595_12 | +| ir.cpp:1597:9:1597:9 | Unary | r1597_3 | +| ir.cpp:1597:9:1597:15 | ChiPartial | partial:m1597_5 | +| ir.cpp:1597:9:1597:15 | ChiTotal | total:m1596_9 | +| ir.cpp:1597:13:1597:15 | StoreValue | r1597_1 | +| ir.cpp:1598:17:1598:18 | Address | &:r1598_1 | +| ir.cpp:1598:22:1598:22 | Address | &:r1598_2 | +| ir.cpp:1598:22:1598:22 | Load | m1595_12 | +| ir.cpp:1598:22:1598:22 | StoreValue | r1598_5 | +| ir.cpp:1598:22:1598:22 | Unary | r1598_3 | +| ir.cpp:1598:22:1598:22 | Unary | r1598_4 | +| ir.cpp:1599:13:1599:13 | Address | &:r1599_1 | +| ir.cpp:1599:17:1599:17 | Address | &:r1599_2 | +| ir.cpp:1599:17:1599:17 | Address | &:r1599_3 | +| ir.cpp:1599:17:1599:17 | Load | m1594_12 | +| ir.cpp:1599:17:1599:17 | Load | ~m1596_9 | +| ir.cpp:1599:17:1599:17 | StoreValue | r1599_4 | +| ir.cpp:1600:9:1600:9 | Address | &:r1600_2 | +| ir.cpp:1600:9:1600:9 | Address | &:r1600_4 | +| ir.cpp:1600:9:1600:9 | Load | m1596_12 | +| ir.cpp:1600:9:1600:9 | Unary | r1600_3 | +| ir.cpp:1600:9:1600:13 | ChiPartial | partial:m1600_5 | +| ir.cpp:1600:9:1600:13 | ChiTotal | total:m1596_6 | +| ir.cpp:1600:13:1600:13 | StoreValue | r1600_1 | +| ir.cpp:1601:14:1601:15 | Address | &:r1601_1 | +| ir.cpp:1601:19:1601:19 | Address | &:r1601_2 | +| ir.cpp:1601:19:1601:19 | Load | m1596_12 | +| ir.cpp:1601:19:1601:19 | StoreValue | r1601_5 | +| ir.cpp:1601:19:1601:19 | Unary | r1601_3 | +| ir.cpp:1601:19:1601:19 | Unary | r1601_4 | +| ir.cpp:1602:13:1602:13 | Address | &:r1602_1 | +| ir.cpp:1602:17:1602:17 | Address | &:r1602_2 | +| ir.cpp:1602:17:1602:17 | Address | &:r1602_3 | +| ir.cpp:1602:17:1602:17 | Load | m1596_12 | +| ir.cpp:1602:17:1602:17 | Load | ~m1600_6 | +| ir.cpp:1602:17:1602:17 | StoreValue | r1602_4 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_5 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_5 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_7 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_7 | +| ir.cpp:1606:8:1606:8 | ChiPartial | partial:m1606_3 | +| ir.cpp:1606:8:1606:8 | ChiTotal | total:m1606_2 | +| ir.cpp:1606:8:1606:8 | Load | m1606_6 | +| ir.cpp:1606:8:1606:8 | SideEffect | m1606_3 | +| ir.cpp:1606:8:1606:8 | SideEffect | m1606_8 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_5 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_5 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_7 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_7 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_10 | +| ir.cpp:1633:61:1633:98 | ChiPartial | partial:m1633_3 | +| ir.cpp:1633:61:1633:98 | ChiTotal | total:m1633_2 | +| ir.cpp:1633:61:1633:98 | Load | m1633_6 | +| ir.cpp:1633:61:1633:98 | Load | m1634_6 | +| ir.cpp:1633:61:1633:98 | SideEffect | m1633_3 | +| ir.cpp:1633:61:1633:98 | SideEffect | m1633_8 | +| ir.cpp:1634:5:1634:13 | Address | &:r1634_1 | +| ir.cpp:1634:12:1634:12 | Address | &:r1634_2 | +| ir.cpp:1634:12:1634:12 | Address | &:r1634_4 | +| ir.cpp:1634:12:1634:12 | Load | m1633_6 | +| ir.cpp:1634:12:1634:12 | Load | ~m1633_8 | +| ir.cpp:1634:12:1634:12 | StoreValue | r1634_5 | +| ir.cpp:1634:12:1634:12 | Unary | r1634_3 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_5 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_5 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_7 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_7 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_10 | +| ir.cpp:1637:61:1637:98 | ChiPartial | partial:m1637_3 | +| ir.cpp:1637:61:1637:98 | ChiTotal | total:m1637_2 | +| ir.cpp:1637:61:1637:98 | Load | m1637_6 | +| ir.cpp:1637:61:1637:98 | Load | m1638_8 | +| ir.cpp:1637:61:1637:98 | SideEffect | m1637_3 | +| ir.cpp:1637:61:1637:98 | SideEffect | m1637_8 | +| ir.cpp:1638:5:1638:13 | Address | &:r1638_1 | +| ir.cpp:1638:12:1638:12 | Address | &:r1638_2 | +| ir.cpp:1638:12:1638:12 | Address | &:r1638_4 | +| ir.cpp:1638:12:1638:12 | Load | m1637_6 | +| ir.cpp:1638:12:1638:12 | Load | ~m1637_8 | +| ir.cpp:1638:12:1638:12 | StoreValue | r1638_7 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_3 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_5 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_6 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_5 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_5 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_7 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_7 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_10 | +| ir.cpp:1641:61:1641:98 | ChiPartial | partial:m1641_3 | +| ir.cpp:1641:61:1641:98 | ChiTotal | total:m1641_2 | +| ir.cpp:1641:61:1641:98 | Load | m1641_6 | +| ir.cpp:1641:61:1641:98 | Load | m1642_6 | +| ir.cpp:1641:61:1641:98 | SideEffect | m1641_3 | +| ir.cpp:1641:61:1641:98 | SideEffect | m1641_8 | +| ir.cpp:1642:5:1642:13 | Address | &:r1642_1 | +| ir.cpp:1642:12:1642:12 | Address | &:r1642_2 | +| ir.cpp:1642:12:1642:12 | StoreValue | r1642_3 | +| ir.cpp:1642:12:1642:12 | StoreValue | r1642_5 | +| ir.cpp:1642:12:1642:12 | Unary | r1642_2 | +| ir.cpp:1645:6:1645:40 | ChiPartial | partial:m1645_3 | +| ir.cpp:1645:6:1645:40 | ChiTotal | total:m1645_2 | +| ir.cpp:1645:6:1645:40 | SideEffect | ~m1666_6 | +| ir.cpp:1646:36:1646:36 | Address | &:r1646_1 | +| ir.cpp:1646:36:1646:36 | Address | &:r1646_1 | +| ir.cpp:1646:36:1646:36 | Arg(this) | this:r1646_1 | +| ir.cpp:1646:36:1646:36 | CallTarget | func:r1646_3 | +| ir.cpp:1646:36:1646:36 | ChiPartial | partial:m1646_5 | +| ir.cpp:1646:36:1646:36 | ChiPartial | partial:m1646_7 | +| ir.cpp:1646:36:1646:36 | ChiTotal | total:m1645_4 | +| ir.cpp:1646:36:1646:36 | ChiTotal | total:m1646_2 | +| ir.cpp:1646:36:1646:36 | SideEffect | ~m1645_4 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_1 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_7 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_21 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_35 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_10 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_24 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_38 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_12 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_26 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_40 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1646_6 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1649_13 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1649_27 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1646_6 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1649_13 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1649_27 | +| ir.cpp:1649:16:1649:16 | StoreValue | r1649_11 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_8 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_22 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_25 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_36 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_39 | +| ir.cpp:1649:16:1649:30 | Address | &:r1649_6 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_18 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_32 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_46 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_6 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_31 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_45 | +| ir.cpp:1649:17:1649:17 | Address | &:r1649_5 | +| ir.cpp:1649:20:1649:20 | Address | &:r1649_20 | +| ir.cpp:1649:23:1649:23 | Address | &:r1649_34 | +| ir.cpp:1649:29:1649:29 | StoreValue | r1649_3 | +| ir.cpp:1649:29:1649:29 | Unary | r1649_2 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_9 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_9 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_23 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_23 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_37 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_37 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_9 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_23 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_37 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_15 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_29 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_43 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1646_8 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1649_16 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1649_30 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1646_8 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1649_16 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1649_30 | +| ir.cpp:1650:9:1650:9 | Address | &:r1650_2 | +| ir.cpp:1650:9:1650:9 | Address | &:r1650_4 | +| ir.cpp:1650:9:1650:9 | Load | m1649_19 | +| ir.cpp:1650:9:1650:9 | Unary | r1650_3 | +| ir.cpp:1650:13:1650:13 | StoreValue | r1650_1 | +| ir.cpp:1651:14:1651:15 | Address | &:r1651_1 | +| ir.cpp:1651:19:1651:19 | Address | &:r1651_2 | +| ir.cpp:1651:19:1651:19 | Load | m1649_19 | +| ir.cpp:1651:19:1651:19 | StoreValue | r1651_5 | +| ir.cpp:1651:19:1651:19 | Unary | r1651_3 | +| ir.cpp:1651:19:1651:19 | Unary | r1651_4 | +| ir.cpp:1652:13:1652:13 | Address | &:r1652_1 | +| ir.cpp:1652:17:1652:17 | Address | &:r1652_2 | +| ir.cpp:1652:17:1652:17 | Address | &:r1652_3 | +| ir.cpp:1652:17:1652:17 | Load | m1649_19 | +| ir.cpp:1652:17:1652:17 | Load | m1650_5 | +| ir.cpp:1652:17:1652:17 | StoreValue | r1652_4 | +| ir.cpp:1653:9:1653:9 | Address | &:r1653_2 | +| ir.cpp:1653:9:1653:9 | Address | &:r1653_4 | +| ir.cpp:1653:9:1653:9 | Load | m1649_33 | +| ir.cpp:1653:9:1653:9 | Unary | r1653_3 | +| ir.cpp:1653:9:1653:13 | ChiPartial | partial:m1653_5 | +| ir.cpp:1653:9:1653:13 | ChiTotal | total:m1649_41 | +| ir.cpp:1653:13:1653:13 | StoreValue | r1653_1 | +| ir.cpp:1654:14:1654:15 | Address | &:r1654_1 | +| ir.cpp:1654:19:1654:19 | Address | &:r1654_2 | +| ir.cpp:1654:19:1654:19 | Load | m1649_33 | +| ir.cpp:1654:19:1654:19 | StoreValue | r1654_5 | +| ir.cpp:1654:19:1654:19 | Unary | r1654_3 | +| ir.cpp:1654:19:1654:19 | Unary | r1654_4 | +| ir.cpp:1655:13:1655:13 | Address | &:r1655_1 | +| ir.cpp:1655:17:1655:17 | Address | &:r1655_2 | +| ir.cpp:1655:17:1655:17 | Address | &:r1655_3 | +| ir.cpp:1655:17:1655:17 | Load | m1649_33 | +| ir.cpp:1655:17:1655:17 | Load | ~m1653_6 | +| ir.cpp:1655:17:1655:17 | StoreValue | r1655_4 | +| ir.cpp:1659:16:1659:37 | Address | &:r1659_1 | +| ir.cpp:1659:41:1659:41 | StoreValue | r1659_3 | +| ir.cpp:1659:41:1659:41 | Unary | r1659_2 | +| ir.cpp:1660:16:1660:16 | Address | &:r1660_1 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_3 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_5 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_5 | +| ir.cpp:1660:20:1660:41 | Arg(this) | this:r1660_5 | +| ir.cpp:1660:20:1660:41 | ChiPartial | partial:m1660_11 | +| ir.cpp:1660:20:1660:41 | ChiTotal | total:m1649_44 | +| ir.cpp:1660:20:1660:41 | Load | m1659_4 | +| ir.cpp:1660:20:1660:41 | SideEffect | m1649_44 | +| ir.cpp:1660:20:1660:41 | Unary | r1660_4 | +| ir.cpp:1660:20:1660:50 | Address | &:r1660_2 | +| ir.cpp:1660:20:1660:50 | StoreValue | r1660_14 | +| ir.cpp:1660:20:1660:50 | Unary | r1660_2 | +| ir.cpp:1660:43:1660:48 | CallTarget | func:r1660_6 | +| ir.cpp:1660:43:1660:48 | ChiPartial | partial:m1660_8 | +| ir.cpp:1660:43:1660:48 | ChiTotal | total:m1653_6 | +| ir.cpp:1660:43:1660:48 | SideEffect | ~m1653_6 | +| ir.cpp:1660:43:1660:48 | StoreValue | r1660_7 | +| ir.cpp:1661:15:1661:15 | Address | &:r1661_1 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_2 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_4 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_4 | +| ir.cpp:1661:19:1661:40 | Arg(this) | this:r1661_4 | +| ir.cpp:1661:19:1661:40 | ChiPartial | partial:m1661_10 | +| ir.cpp:1661:19:1661:40 | ChiTotal | total:m1660_12 | +| ir.cpp:1661:19:1661:40 | Load | m1659_4 | +| ir.cpp:1661:19:1661:40 | SideEffect | m1660_12 | +| ir.cpp:1661:19:1661:40 | Unary | r1661_3 | +| ir.cpp:1661:42:1661:47 | CallTarget | func:r1661_5 | +| ir.cpp:1661:42:1661:47 | ChiPartial | partial:m1661_7 | +| ir.cpp:1661:42:1661:47 | ChiTotal | total:m1660_9 | +| ir.cpp:1661:42:1661:47 | SideEffect | ~m1660_9 | +| ir.cpp:1661:42:1661:47 | Unary | r1661_6 | +| ir.cpp:1661:42:1661:50 | StoreValue | r1661_13 | +| ir.cpp:1661:42:1661:50 | Unary | r1661_12 | +| ir.cpp:1662:16:1662:17 | Address | &:r1662_1 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_2 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_4 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_4 | +| ir.cpp:1662:21:1662:42 | Arg(this) | this:r1662_4 | +| ir.cpp:1662:21:1662:42 | ChiPartial | partial:m1662_10 | +| ir.cpp:1662:21:1662:42 | ChiTotal | total:m1661_11 | +| ir.cpp:1662:21:1662:42 | Load | m1659_4 | +| ir.cpp:1662:21:1662:42 | SideEffect | m1661_11 | +| ir.cpp:1662:21:1662:42 | Unary | r1662_3 | +| ir.cpp:1662:44:1662:49 | CallTarget | func:r1662_5 | +| ir.cpp:1662:44:1662:49 | ChiPartial | partial:m1662_7 | +| ir.cpp:1662:44:1662:49 | ChiTotal | total:m1661_8 | +| ir.cpp:1662:44:1662:49 | SideEffect | ~m1661_8 | +| ir.cpp:1662:44:1662:49 | Unary | r1662_6 | +| ir.cpp:1662:44:1662:52 | StoreValue | r1662_13 | +| ir.cpp:1662:44:1662:52 | Unary | r1662_12 | +| ir.cpp:1663:9:1663:9 | Address | &:r1663_2 | +| ir.cpp:1663:9:1663:9 | Address | &:r1663_4 | +| ir.cpp:1663:9:1663:9 | Load | m1660_15 | +| ir.cpp:1663:9:1663:9 | Unary | r1663_3 | +| ir.cpp:1663:13:1663:13 | StoreValue | r1663_1 | +| ir.cpp:1664:14:1664:15 | Address | &:r1664_1 | +| ir.cpp:1664:19:1664:19 | Address | &:r1664_2 | +| ir.cpp:1664:19:1664:19 | Load | m1660_15 | +| ir.cpp:1664:19:1664:19 | StoreValue | r1664_5 | +| ir.cpp:1664:19:1664:19 | Unary | r1664_3 | +| ir.cpp:1664:19:1664:19 | Unary | r1664_4 | +| ir.cpp:1665:13:1665:13 | Address | &:r1665_1 | +| ir.cpp:1665:17:1665:17 | Address | &:r1665_2 | +| ir.cpp:1665:17:1665:17 | Address | &:r1665_3 | +| ir.cpp:1665:17:1665:17 | Load | m1660_15 | +| ir.cpp:1665:17:1665:17 | Load | m1663_5 | +| ir.cpp:1665:17:1665:17 | StoreValue | r1665_4 | +| ir.cpp:1666:9:1666:9 | Address | &:r1666_2 | +| ir.cpp:1666:9:1666:9 | Address | &:r1666_4 | +| ir.cpp:1666:9:1666:9 | Load | m1661_14 | +| ir.cpp:1666:9:1666:9 | Unary | r1666_3 | +| ir.cpp:1666:9:1666:13 | ChiPartial | partial:m1666_5 | +| ir.cpp:1666:9:1666:13 | ChiTotal | total:m1662_8 | +| ir.cpp:1666:13:1666:13 | StoreValue | r1666_1 | +| ir.cpp:1667:14:1667:15 | Address | &:r1667_1 | +| ir.cpp:1667:19:1667:19 | Address | &:r1667_2 | +| ir.cpp:1667:19:1667:19 | Load | m1661_14 | +| ir.cpp:1667:19:1667:19 | StoreValue | r1667_5 | +| ir.cpp:1667:19:1667:19 | Unary | r1667_3 | +| ir.cpp:1667:19:1667:19 | Unary | r1667_4 | +| ir.cpp:1668:13:1668:13 | Address | &:r1668_1 | +| ir.cpp:1668:17:1668:17 | Address | &:r1668_2 | +| ir.cpp:1668:17:1668:17 | Address | &:r1668_3 | +| ir.cpp:1668:17:1668:17 | Load | m1661_14 | +| ir.cpp:1668:17:1668:17 | Load | ~m1666_6 | +| ir.cpp:1668:17:1668:17 | StoreValue | r1668_4 | +| ir.cpp:1672:6:1672:42 | ChiPartial | partial:m1672_3 | +| ir.cpp:1672:6:1672:42 | ChiTotal | total:m1672_2 | +| ir.cpp:1672:6:1672:42 | SideEffect | m1672_3 | +| ir.cpp:1673:9:1673:10 | Address | &:r1673_1 | +| ir.cpp:1673:9:1673:10 | Left | r1673_1 | +| ir.cpp:1673:9:1673:10 | Left | r1673_1 | +| ir.cpp:1673:16:1673:22 | Address | &:r1673_4 | +| ir.cpp:1673:16:1673:22 | Address | &:r1673_9 | +| ir.cpp:1673:16:1673:22 | Right | r1673_3 | +| ir.cpp:1673:16:1673:22 | Right | r1673_8 | +| ir.cpp:1673:18:1673:18 | ChiPartial | partial:m1673_6 | +| ir.cpp:1673:18:1673:18 | ChiTotal | total:m1673_2 | +| ir.cpp:1673:18:1673:18 | StoreValue | r1673_5 | +| ir.cpp:1673:21:1673:21 | ChiPartial | partial:m1673_11 | +| ir.cpp:1673:21:1673:21 | ChiTotal | total:m1673_7 | +| ir.cpp:1673:21:1673:21 | StoreValue | r1673_10 | +| ir.cpp:1674:10:1674:10 | Address | &:r1674_1 | +| ir.cpp:1674:11:1674:11 | Address | &:r1674_5 | +| ir.cpp:1674:15:1674:15 | Address | &:r1674_6 | +| ir.cpp:1674:21:1674:22 | Address | &:r1674_2 | +| ir.cpp:1674:21:1674:22 | Load | m1673_12 | +| ir.cpp:1674:21:1674:22 | StoreValue | r1674_3 | +| ir.cpp:1680:5:1680:23 | Address | &:r1680_5 | +| ir.cpp:1680:5:1680:23 | Address | &:r1680_5 | +| ir.cpp:1680:5:1680:23 | Address | &:r1680_7 | +| ir.cpp:1680:5:1680:23 | Address | &:r1680_7 | +| ir.cpp:1680:5:1680:23 | ChiPartial | partial:m1680_3 | +| ir.cpp:1680:5:1680:23 | ChiTotal | total:m1680_2 | +| ir.cpp:1680:5:1680:23 | Load | m1680_6 | +| ir.cpp:1680:5:1680:23 | SideEffect | m1680_3 | +| ir.cpp:1680:5:1680:23 | SideEffect | m1680_8 | +| ir.cpp:1683:6:1683:20 | ChiPartial | partial:m1683_3 | +| ir.cpp:1683:6:1683:20 | ChiTotal | total:m1683_2 | +| ir.cpp:1683:6:1683:20 | SideEffect | ~m1686_6 | +| ir.cpp:1683:26:1683:26 | Address | &:r1683_5 | +| ir.cpp:1683:34:1683:34 | Address | &:r1683_7 | +| ir.cpp:1683:34:1683:34 | Address | &:r1683_7 | +| ir.cpp:1683:34:1683:34 | Address | &:r1683_9 | +| ir.cpp:1683:34:1683:34 | Address | &:r1683_9 | +| ir.cpp:1683:34:1683:34 | Load | m1683_8 | +| ir.cpp:1683:34:1683:34 | SideEffect | m1683_10 | +| ir.cpp:1683:43:1683:43 | Address | &:r1683_11 | +| ir.cpp:1683:43:1683:43 | Address | &:r1683_11 | +| ir.cpp:1683:43:1683:43 | Address | &:r1683_13 | +| ir.cpp:1683:43:1683:43 | Address | &:r1683_13 | +| ir.cpp:1683:43:1683:43 | Load | m1683_12 | +| ir.cpp:1683:43:1683:43 | SideEffect | m1683_14 | +| ir.cpp:1685:17:1685:20 | Address | &:r1685_1 | +| ir.cpp:1685:24:1685:44 | Address | &:r1685_2 | +| ir.cpp:1685:24:1685:44 | Address | &:r1685_2 | +| ir.cpp:1685:24:1685:44 | Arg(this) | this:r1685_2 | +| ir.cpp:1685:24:1685:44 | CallTarget | func:r1685_4 | +| ir.cpp:1685:24:1685:44 | ChiPartial | partial:m1685_6 | +| ir.cpp:1685:24:1685:44 | ChiPartial | partial:m1685_8 | +| ir.cpp:1685:24:1685:44 | ChiTotal | total:m1683_4 | +| ir.cpp:1685:24:1685:44 | ChiTotal | total:m1685_3 | +| ir.cpp:1685:24:1685:44 | SideEffect | ~m1683_4 | +| ir.cpp:1685:24:1685:44 | StoreValue | r1685_11 | +| ir.cpp:1685:24:1685:44 | Unary | r1685_2 | +| ir.cpp:1685:24:1685:44 | Unary | r1685_10 | +| ir.cpp:1686:10:1686:13 | Address | &:r1686_1 | +| ir.cpp:1686:10:1686:13 | Address | &:r1686_1 | +| ir.cpp:1686:10:1686:13 | Arg(this) | this:r1686_1 | +| ir.cpp:1686:16:1686:37 | CallTarget | func:r1686_3 | +| ir.cpp:1686:16:1686:37 | ChiPartial | partial:m1686_5 | +| ir.cpp:1686:16:1686:37 | ChiPartial | partial:m1686_7 | +| ir.cpp:1686:16:1686:37 | ChiTotal | total:m1685_7 | +| ir.cpp:1686:16:1686:37 | ChiTotal | total:m1686_2 | +| ir.cpp:1686:16:1686:37 | SideEffect | ~m1685_7 | +| ir.cpp:1688:10:1688:21 | Address | &:r1688_1 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_2 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_2 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_4 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_5 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_6 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_7 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_8 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_12 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_17 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_20 | +| ir.cpp:1688:24:1690:5 | ChiPartial | partial:m1688_10 | +| ir.cpp:1688:24:1690:5 | ChiTotal | total:m0_3 | +| ir.cpp:1688:24:1690:5 | Load | m1685_12 | +| ir.cpp:1688:24:1690:5 | Load | m1686_8 | +| ir.cpp:1688:24:1690:5 | Load | m1690_6 | +| ir.cpp:1688:24:1690:5 | StoreValue | r1688_9 | +| ir.cpp:1688:24:1690:5 | StoreValue | r1688_23 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:38:1688:38 | Address | &:r1688_13 | +| ir.cpp:1688:38:1688:38 | ChiPartial | partial:m1688_15 | +| ir.cpp:1688:38:1688:38 | ChiTotal | total:m1688_11 | +| ir.cpp:1688:38:1688:38 | Load | m1683_6 | +| ir.cpp:1688:38:1688:38 | StoreValue | r1688_14 | +| ir.cpp:1688:41:1688:41 | Address | &:r1688_18 | +| ir.cpp:1688:41:1688:41 | Address | &:r1688_19 | +| ir.cpp:1688:41:1688:41 | Load | m1683_8 | +| ir.cpp:1688:44:1688:44 | Address | &:r1688_21 | +| ir.cpp:1688:44:1688:44 | Address | &:r1688_22 | +| ir.cpp:1688:44:1688:44 | Load | m1683_12 | +| ir.cpp:1688:46:1688:46 | Address | &:r1688_5 | +| ir.cpp:1688:46:1688:46 | Address | &:r1688_5 | +| ir.cpp:1688:46:1688:46 | Address | &:r1688_7 | +| ir.cpp:1688:46:1688:46 | Address | &:r1688_7 | +| ir.cpp:1688:46:1688:46 | ChiPartial | partial:m1688_3 | +| ir.cpp:1688:46:1688:46 | ChiTotal | total:m1688_2 | +| ir.cpp:1688:46:1688:46 | Load | m1688_6 | +| ir.cpp:1688:46:1688:46 | SideEffect | m1688_3 | +| ir.cpp:1688:46:1688:46 | SideEffect | m1688_8 | +| ir.cpp:1689:14:1689:25 | Address | &:r1689_1 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_2 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_2 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_4 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_5 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_7 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_11 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_12 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_14 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_18 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_19 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_21 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_25 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_26 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_28 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_32 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_33 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_35 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_9 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_16 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_23 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_30 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_37 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_3 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_10 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_17 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_24 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_31 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1689_38 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_8 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_15 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_22 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_29 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_36 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_39 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_6 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_13 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_20 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_27 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_34 | +| ir.cpp:1689:50:1689:50 | Address | &:r1689_5 | +| ir.cpp:1689:50:1689:50 | Address | &:r1689_5 | +| ir.cpp:1689:50:1689:50 | Address | &:r1689_7 | +| ir.cpp:1689:50:1689:50 | Address | &:r1689_7 | +| ir.cpp:1689:50:1689:50 | ChiPartial | partial:m1689_3 | +| ir.cpp:1689:50:1689:50 | ChiTotal | total:m1689_2 | +| ir.cpp:1689:50:1689:50 | Load | m1689_6 | +| ir.cpp:1689:50:1689:50 | SideEffect | m1689_3 | +| ir.cpp:1689:50:1689:50 | SideEffect | m1689_8 | +| ir.cpp:1690:6:1690:6 | ChiPartial | partial:m1690_2 | +| ir.cpp:1690:6:1690:6 | ChiPartial | partial:m1690_5 | +| ir.cpp:1690:6:1690:6 | ChiTotal | total:m1688_16 | +| ir.cpp:1690:6:1690:6 | ChiTotal | total:m1690_3 | +| ir.cpp:1690:6:1690:6 | Load | ~m1683_10 | +| ir.cpp:1690:6:1690:6 | Load | ~m1683_14 | +| ir.cpp:1690:6:1690:6 | StoreValue | r1690_1 | +| ir.cpp:1690:6:1690:6 | StoreValue | r1690_4 | +| ir.cpp:1693:5:1693:21 | Address | &:r1693_5 | +| ir.cpp:1693:5:1693:21 | ChiPartial | partial:m1693_3 | +| ir.cpp:1693:5:1693:21 | ChiTotal | total:m1693_2 | +| ir.cpp:1693:5:1693:21 | Load | m1696_4 | +| ir.cpp:1693:5:1693:21 | SideEffect | m1693_3 | +| ir.cpp:1694:7:1694:7 | Address | &:r1694_1 | +| ir.cpp:1694:10:1694:12 | StoreValue | r1694_2 | +| ir.cpp:1696:3:1696:11 | Address | &:r1696_1 | +| ir.cpp:1696:10:1696:10 | Address | &:r1696_2 | +| ir.cpp:1696:10:1696:10 | Load | m1694_3 | +| ir.cpp:1696:10:1696:10 | StoreValue | r1696_3 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_7 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_7 | +| ir.cpp:1701:10:1701:10 | ChiPartial | partial:m1701_3 | +| ir.cpp:1701:10:1701:10 | ChiTotal | total:m1701_2 | +| ir.cpp:1701:10:1701:10 | Load | m1701_6 | +| ir.cpp:1701:10:1701:10 | SideEffect | m1701_3 | +| ir.cpp:1701:10:1701:10 | SideEffect | m1701_8 | +| ir.cpp:1702:14:1702:22 | Address | &:r1702_1 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_2 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_2 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_4 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_5 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_6 | +| ir.cpp:1702:25:1708:9 | Load | m1701_6 | +| ir.cpp:1702:25:1708:9 | Load | ~m1701_8 | +| ir.cpp:1702:25:1708:9 | Load | ~m1702_8 | +| ir.cpp:1702:25:1708:9 | StoreValue | r1702_7 | +| ir.cpp:1702:25:1708:9 | StoreValue | r1702_9 | +| ir.cpp:1702:25:1708:9 | Unary | r1702_2 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_7 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_7 | +| ir.cpp:1702:34:1702:34 | ChiPartial | partial:m1702_3 | +| ir.cpp:1702:34:1702:34 | ChiTotal | total:m1702_2 | +| ir.cpp:1702:34:1702:34 | Load | m1702_6 | +| ir.cpp:1702:34:1702:34 | SideEffect | m1702_8 | +| ir.cpp:1702:34:1702:34 | SideEffect | ~m1703_8 | +| ir.cpp:1703:13:1703:13 | Address | &:r1703_1 | +| ir.cpp:1703:13:1703:13 | Address | &:r1703_4 | +| ir.cpp:1703:13:1703:13 | Arg(this) | this:r1703_4 | +| ir.cpp:1703:13:1703:13 | CallTarget | func:r1703_5 | +| ir.cpp:1703:13:1703:13 | ChiPartial | partial:m1703_7 | +| ir.cpp:1703:13:1703:13 | ChiTotal | total:m1702_4 | +| ir.cpp:1703:13:1703:13 | Load | m1702_6 | +| ir.cpp:1703:13:1703:13 | SideEffect | ~m1702_4 | +| ir.cpp:1703:13:1703:13 | SideEffect | ~m1702_8 | +| ir.cpp:1703:13:1703:13 | Unary | r1703_2 | +| ir.cpp:1703:13:1703:13 | Unary | r1703_3 | +| ir.cpp:1705:18:1705:26 | Address | &:r1705_1 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_2 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_2 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_4 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_5 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_7 | +| ir.cpp:1705:29:1707:13 | Load | m1702_6 | +| ir.cpp:1705:29:1707:13 | Load | ~m1702_8 | +| ir.cpp:1705:29:1707:13 | Load | ~m1705_9 | +| ir.cpp:1705:29:1707:13 | StoreValue | r1705_8 | +| ir.cpp:1705:29:1707:13 | StoreValue | r1705_10 | +| ir.cpp:1705:29:1707:13 | Unary | r1705_2 | +| ir.cpp:1705:29:1707:13 | Unary | r1705_6 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_7 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_7 | +| ir.cpp:1705:38:1705:38 | ChiPartial | partial:m1705_3 | +| ir.cpp:1705:38:1705:38 | ChiTotal | total:m1705_2 | +| ir.cpp:1705:38:1705:38 | Load | m1705_6 | +| ir.cpp:1705:38:1705:38 | SideEffect | m1705_8 | +| ir.cpp:1705:38:1705:38 | SideEffect | ~m1706_8 | +| ir.cpp:1706:17:1706:17 | Address | &:r1706_1 | +| ir.cpp:1706:17:1706:17 | Address | &:r1706_4 | +| ir.cpp:1706:17:1706:17 | Arg(this) | this:r1706_4 | +| ir.cpp:1706:17:1706:17 | CallTarget | func:r1706_5 | +| ir.cpp:1706:17:1706:17 | ChiPartial | partial:m1706_7 | +| ir.cpp:1706:17:1706:17 | ChiTotal | total:m1705_4 | +| ir.cpp:1706:17:1706:17 | Load | m1705_6 | +| ir.cpp:1706:17:1706:17 | SideEffect | ~m1705_4 | +| ir.cpp:1706:17:1706:17 | SideEffect | ~m1705_8 | +| ir.cpp:1706:17:1706:17 | Unary | r1706_2 | +| ir.cpp:1706:17:1706:17 | Unary | r1706_3 | +| ir.cpp:1712:6:1712:21 | ChiPartial | partial:m1712_3 | +| ir.cpp:1712:6:1712:21 | ChiTotal | total:m1712_2 | +| ir.cpp:1712:6:1712:21 | SideEffect | m1712_3 | +| ir.cpp:1712:42:1712:43 | Address | &:r1712_5 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_9 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_9 | +| ir.cpp:1712:66:1712:67 | Load | m1712_8 | +| ir.cpp:1712:66:1712:67 | SideEffect | m1712_10 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_13 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_13 | +| ir.cpp:1712:91:1712:92 | Load | m1712_12 | +| ir.cpp:1712:91:1712:92 | SideEffect | m1712_14 | +| ir.cpp:1713:30:1713:31 | Address | &:r1713_1 | +| ir.cpp:1714:31:1714:32 | Address | &:r1714_1 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_2 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_3 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_3 | +| ir.cpp:1714:36:1714:55 | Load | m1714_5 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_4 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_6 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_9 | +| ir.cpp:1714:36:1714:55 | Unary | r1714_2 | +| ir.cpp:1714:36:1714:55 | Unary | r1714_8 | +| ir.cpp:1716:10:1716:17 | Address | &:r1716_1 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_2 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_2 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_4 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_5 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_9 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_10 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_11 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_12 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_13 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_14 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_15 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_16 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_20 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_21 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_22 | +| ir.cpp:1716:20:1718:5 | ChiPartial | partial:m1716_7 | +| ir.cpp:1716:20:1718:5 | ChiPartial | partial:m1716_18 | +| ir.cpp:1716:20:1718:5 | ChiTotal | total:m0_6 | +| ir.cpp:1716:20:1718:5 | ChiTotal | total:m1716_3 | +| ir.cpp:1716:20:1718:5 | Load | m0_9 | +| ir.cpp:1716:20:1718:5 | Load | m1712_6 | +| ir.cpp:1716:20:1718:5 | Load | m1712_8 | +| ir.cpp:1716:20:1718:5 | Load | m1712_12 | +| ir.cpp:1716:20:1718:5 | Load | m1713_2 | +| ir.cpp:1716:20:1718:5 | Load | m1714_10 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_6 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_17 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_23 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_7 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_7 | +| ir.cpp:1716:42:1716:42 | ChiPartial | partial:m1716_3 | +| ir.cpp:1716:42:1716:42 | ChiTotal | total:m1716_2 | +| ir.cpp:1716:42:1716:42 | Load | m1716_6 | +| ir.cpp:1716:42:1716:42 | SideEffect | m1716_3 | +| ir.cpp:1716:42:1716:42 | SideEffect | m1716_8 | +| ir.cpp:1717:14:1717:21 | Address | &:r1717_1 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_2 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_2 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_4 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_5 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_7 | +| ir.cpp:1717:24:1717:31 | Load | m1716_6 | +| ir.cpp:1717:24:1717:31 | Load | ~m1716_8 | +| ir.cpp:1717:24:1717:31 | Load | ~m1717_9 | +| ir.cpp:1717:24:1717:31 | StoreValue | r1717_8 | +| ir.cpp:1717:24:1717:31 | StoreValue | r1717_10 | +| ir.cpp:1717:24:1717:31 | Unary | r1717_2 | +| ir.cpp:1717:24:1717:31 | Unary | r1717_6 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_7 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_7 | +| ir.cpp:1717:30:1717:30 | ChiPartial | partial:m1717_3 | +| ir.cpp:1717:30:1717:30 | ChiTotal | total:m1717_2 | +| ir.cpp:1717:30:1717:30 | Load | m1717_6 | +| ir.cpp:1717:30:1717:30 | SideEffect | m1717_3 | +| ir.cpp:1717:30:1717:30 | SideEffect | m1717_8 | +| ir.cpp:1724:5:1724:44 | Address | &:r1724_5 | +| ir.cpp:1724:5:1724:44 | Address | &:r1724_5 | +| ir.cpp:1724:5:1724:44 | Address | &:r1724_7 | +| ir.cpp:1724:5:1724:44 | Address | &:r1724_7 | +| ir.cpp:1724:5:1724:44 | ChiPartial | partial:m1724_3 | +| ir.cpp:1724:5:1724:44 | ChiTotal | total:m1724_2 | +| ir.cpp:1724:5:1724:44 | Load | m1724_6 | +| ir.cpp:1724:5:1724:44 | SideEffect | m1724_3 | +| ir.cpp:1724:5:1724:44 | SideEffect | m1724_8 | +| ir.cpp:1725:5:1725:44 | Address | &:r1725_5 | +| ir.cpp:1725:5:1725:44 | Address | &:r1725_5 | +| ir.cpp:1725:5:1725:44 | Address | &:r1725_7 | +| ir.cpp:1725:5:1725:44 | Address | &:r1725_7 | +| ir.cpp:1725:5:1725:44 | ChiPartial | partial:m1725_3 | +| ir.cpp:1725:5:1725:44 | ChiTotal | total:m1725_2 | +| ir.cpp:1725:5:1725:44 | Load | m1725_6 | +| ir.cpp:1725:5:1725:44 | SideEffect | m1725_3 | +| ir.cpp:1725:5:1725:44 | SideEffect | m1726_10 | +| ir.cpp:1725:94:1725:94 | Address | &:r1725_9 | +| ir.cpp:1725:94:1725:94 | Address | &:r1725_9 | +| ir.cpp:1725:94:1725:94 | Address | &:r1725_11 | +| ir.cpp:1725:94:1725:94 | Address | &:r1725_11 | +| ir.cpp:1725:94:1725:94 | Load | m1725_10 | +| ir.cpp:1725:94:1725:94 | SideEffect | m1725_12 | +| ir.cpp:1726:9:1726:9 | Address | &:r1726_6 | +| ir.cpp:1726:9:1726:9 | Address | &:r1726_8 | +| ir.cpp:1726:9:1726:9 | Load | m1725_6 | +| ir.cpp:1726:9:1726:9 | Unary | r1726_7 | +| ir.cpp:1726:9:1726:15 | ChiPartial | partial:m1726_9 | +| ir.cpp:1726:9:1726:15 | ChiTotal | total:m1725_8 | +| ir.cpp:1726:13:1726:13 | Address | &:r1726_1 | +| ir.cpp:1726:13:1726:13 | Load | m1725_10 | +| ir.cpp:1726:13:1726:13 | Unary | r1726_2 | +| ir.cpp:1726:13:1726:13 | Unary | r1726_3 | +| ir.cpp:1726:15:1726:15 | Address | &:r1726_4 | +| ir.cpp:1726:15:1726:15 | Load | ~m1725_12 | +| ir.cpp:1726:15:1726:15 | StoreValue | r1726_5 | +| ir.cpp:1733:5:1733:39 | Address | &:r1733_5 | +| ir.cpp:1733:5:1733:39 | Address | &:r1733_5 | +| ir.cpp:1733:5:1733:39 | Address | &:r1733_7 | +| ir.cpp:1733:5:1733:39 | Address | &:r1733_7 | +| ir.cpp:1733:5:1733:39 | ChiPartial | partial:m1733_3 | +| ir.cpp:1733:5:1733:39 | ChiTotal | total:m1733_2 | +| ir.cpp:1733:5:1733:39 | Load | m1733_6 | +| ir.cpp:1733:5:1733:39 | SideEffect | m1733_3 | +| ir.cpp:1733:5:1733:39 | SideEffect | m1733_8 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_5 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_5 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_7 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_7 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_9 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_11 | +| ir.cpp:1736:7:1736:7 | Address | &:r1736_15 | +| ir.cpp:1736:7:1736:7 | Arg(0) | 0:r1736_15 | +| ir.cpp:1736:7:1736:7 | Arg(this) | this:r1736_9 | +| ir.cpp:1736:7:1736:7 | CallTarget | func:r1736_10 | +| ir.cpp:1736:7:1736:7 | ChiPartial | partial:m1736_3 | +| ir.cpp:1736:7:1736:7 | ChiPartial | partial:m1736_17 | +| ir.cpp:1736:7:1736:7 | ChiPartial | partial:m1736_20 | +| ir.cpp:1736:7:1736:7 | ChiTotal | total:m1736_2 | +| ir.cpp:1736:7:1736:7 | ChiTotal | total:m1736_4 | +| ir.cpp:1736:7:1736:7 | ChiTotal | total:m1736_8 | +| ir.cpp:1736:7:1736:7 | Load | m0_2 | +| ir.cpp:1736:7:1736:7 | Load | m1736_6 | +| ir.cpp:1736:7:1736:7 | SideEffect | m1736_21 | +| ir.cpp:1736:7:1736:7 | SideEffect | ~m0_4 | +| ir.cpp:1736:7:1736:7 | SideEffect | ~m1736_4 | +| ir.cpp:1736:7:1736:7 | SideEffect | ~m1736_18 | +| ir.cpp:1736:7:1736:7 | Unary | m1736_6 | +| ir.cpp:1736:7:1736:7 | Unary | r1736_12 | +| ir.cpp:1736:7:1736:7 | Unary | r1736_13 | +| ir.cpp:1736:7:1736:7 | Unary | r1736_14 | +| ir.cpp:1740:5:1740:38 | Address | &:r1740_5 | +| ir.cpp:1740:5:1740:38 | Address | &:r1740_5 | +| ir.cpp:1740:5:1740:38 | Address | &:r1740_7 | +| ir.cpp:1740:5:1740:38 | Address | &:r1740_7 | +| ir.cpp:1740:5:1740:38 | ChiPartial | partial:m1740_3 | +| ir.cpp:1740:5:1740:38 | ChiTotal | total:m1740_2 | +| ir.cpp:1740:5:1740:38 | Load | m1740_6 | +| ir.cpp:1740:5:1740:38 | SideEffect | m1740_22 | +| ir.cpp:1740:5:1740:38 | SideEffect | ~m1740_20 | +| ir.cpp:1740:5:1740:38 | Unary | m1740_6 | +| ir.cpp:1740:5:1740:38 | Unary | m1740_6 | +| ir.cpp:1740:42:1740:42 | Address | &:r1740_9 | +| ir.cpp:1740:42:1740:42 | Address | &:r1740_16 | +| ir.cpp:1740:42:1740:42 | Arg(this) | this:r1740_9 | +| ir.cpp:1740:42:1740:42 | Arg(this) | this:r1740_16 | +| ir.cpp:1740:42:1740:42 | CallTarget | func:r1740_10 | +| ir.cpp:1740:42:1740:42 | CallTarget | func:r1740_17 | +| ir.cpp:1740:42:1740:42 | ChiPartial | partial:m1740_12 | +| ir.cpp:1740:42:1740:42 | ChiPartial | partial:m1740_14 | +| ir.cpp:1740:42:1740:42 | ChiPartial | partial:m1740_19 | +| ir.cpp:1740:42:1740:42 | ChiPartial | partial:m1740_21 | +| ir.cpp:1740:42:1740:42 | ChiTotal | total:m1740_4 | +| ir.cpp:1740:42:1740:42 | ChiTotal | total:m1740_8 | +| ir.cpp:1740:42:1740:42 | ChiTotal | total:m1740_13 | +| ir.cpp:1740:42:1740:42 | ChiTotal | total:m1740_15 | +| ir.cpp:1740:42:1740:42 | SideEffect | ~m1740_4 | +| ir.cpp:1740:42:1740:42 | SideEffect | ~m1740_13 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_5 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_5 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_7 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_7 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_9 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_11 | +| ir.cpp:1743:7:1743:7 | Address | &:r1743_15 | +| ir.cpp:1743:7:1743:7 | Arg(0) | 0:r1743_15 | +| ir.cpp:1743:7:1743:7 | Arg(this) | this:r1743_9 | +| ir.cpp:1743:7:1743:7 | CallTarget | func:r1743_10 | +| ir.cpp:1743:7:1743:7 | ChiPartial | partial:m1743_3 | +| ir.cpp:1743:7:1743:7 | ChiPartial | partial:m1743_17 | +| ir.cpp:1743:7:1743:7 | ChiPartial | partial:m1743_20 | +| ir.cpp:1743:7:1743:7 | ChiTotal | total:m1743_2 | +| ir.cpp:1743:7:1743:7 | ChiTotal | total:m1743_4 | +| ir.cpp:1743:7:1743:7 | ChiTotal | total:m1743_18 | +| ir.cpp:1743:7:1743:7 | Load | m0_2 | +| ir.cpp:1743:7:1743:7 | Load | m1743_6 | +| ir.cpp:1743:7:1743:7 | SideEffect | m1743_8 | +| ir.cpp:1743:7:1743:7 | SideEffect | ~m0_4 | +| ir.cpp:1743:7:1743:7 | SideEffect | ~m1743_4 | +| ir.cpp:1743:7:1743:7 | SideEffect | ~m1743_21 | +| ir.cpp:1743:7:1743:7 | Unary | m1743_6 | +| ir.cpp:1743:7:1743:7 | Unary | r1743_12 | +| ir.cpp:1743:7:1743:7 | Unary | r1743_13 | +| ir.cpp:1743:7:1743:7 | Unary | r1743_14 | +| ir.cpp:1747:5:1747:35 | Address | &:r1747_5 | +| ir.cpp:1747:5:1747:35 | Address | &:r1747_5 | +| ir.cpp:1747:5:1747:35 | Address | &:r1747_7 | +| ir.cpp:1747:5:1747:35 | Address | &:r1747_7 | +| ir.cpp:1747:5:1747:35 | ChiPartial | partial:m1747_3 | +| ir.cpp:1747:5:1747:35 | ChiTotal | total:m1747_2 | +| ir.cpp:1747:5:1747:35 | Load | m1747_6 | +| ir.cpp:1747:5:1747:35 | SideEffect | m1747_8 | +| ir.cpp:1747:5:1747:35 | SideEffect | ~m1747_22 | +| ir.cpp:1747:5:1747:35 | Unary | m1747_6 | +| ir.cpp:1747:5:1747:35 | Unary | m1747_6 | +| ir.cpp:1747:39:1747:39 | Address | &:r1747_9 | +| ir.cpp:1747:39:1747:39 | Address | &:r1747_16 | +| ir.cpp:1747:39:1747:39 | Arg(this) | this:r1747_9 | +| ir.cpp:1747:39:1747:39 | Arg(this) | this:r1747_16 | +| ir.cpp:1747:39:1747:39 | CallTarget | func:r1747_10 | +| ir.cpp:1747:39:1747:39 | CallTarget | func:r1747_17 | +| ir.cpp:1747:39:1747:39 | ChiPartial | partial:m1747_12 | +| ir.cpp:1747:39:1747:39 | ChiPartial | partial:m1747_14 | +| ir.cpp:1747:39:1747:39 | ChiPartial | partial:m1747_19 | +| ir.cpp:1747:39:1747:39 | ChiPartial | partial:m1747_21 | +| ir.cpp:1747:39:1747:39 | ChiTotal | total:m1747_4 | +| ir.cpp:1747:39:1747:39 | ChiTotal | total:m1747_13 | +| ir.cpp:1747:39:1747:39 | ChiTotal | total:m1747_15 | +| ir.cpp:1747:39:1747:39 | ChiTotal | total:m1747_20 | +| ir.cpp:1747:39:1747:39 | SideEffect | ~m1747_4 | +| ir.cpp:1747:39:1747:39 | SideEffect | ~m1747_15 | +| ir.cpp:1750:5:1750:34 | ChiPartial | partial:m1750_3 | +| ir.cpp:1750:5:1750:34 | ChiTotal | total:m1750_2 | +| ir.cpp:1751:51:1751:51 | Address | &:r1751_1 | +| ir.cpp:1751:51:1751:51 | Address | &:r1751_1 | +| ir.cpp:1751:51:1751:51 | Address | &:r1751_3 | +| ir.cpp:1751:51:1751:51 | Load | m1751_2 | +| ir.cpp:1752:48:1752:48 | Address | &:r1752_1 | +| ir.cpp:1752:48:1752:48 | Address | &:r1752_1 | +| ir.cpp:1752:48:1752:48 | Address | &:r1752_3 | +| ir.cpp:1752:48:1752:48 | Load | m1752_2 | +| ir.cpp:1753:40:1753:41 | Address | &:r1753_1 | +| ir.cpp:1753:40:1753:41 | Address | &:r1753_1 | +| ir.cpp:1753:40:1753:41 | Arg(this) | this:r1753_1 | +| ir.cpp:1753:44:1753:45 | CallTarget | func:r1753_3 | +| ir.cpp:1753:44:1753:45 | ChiPartial | partial:m1753_9 | +| ir.cpp:1753:44:1753:45 | ChiPartial | partial:m1753_12 | +| ir.cpp:1753:44:1753:45 | ChiTotal | total:m1750_4 | +| ir.cpp:1753:44:1753:45 | ChiTotal | total:m1753_2 | +| ir.cpp:1753:44:1753:45 | SideEffect | ~m1750_4 | +| ir.cpp:1753:45:1753:45 | Address | &:r1753_4 | +| ir.cpp:1753:45:1753:45 | Address | &:r1753_7 | +| ir.cpp:1753:45:1753:45 | Arg(0) | 0:r1753_7 | +| ir.cpp:1753:45:1753:45 | Load | m1751_2 | +| ir.cpp:1753:45:1753:45 | SideEffect | ~m1751_4 | +| ir.cpp:1753:45:1753:45 | Unary | r1753_5 | +| ir.cpp:1753:45:1753:45 | Unary | r1753_6 | +| ir.cpp:1754:37:1754:38 | Address | &:r1754_1 | +| ir.cpp:1754:37:1754:38 | Address | &:r1754_1 | +| ir.cpp:1754:37:1754:38 | Arg(this) | this:r1754_1 | +| ir.cpp:1754:41:1754:42 | CallTarget | func:r1754_3 | +| ir.cpp:1754:41:1754:42 | ChiPartial | partial:m1754_9 | +| ir.cpp:1754:41:1754:42 | ChiPartial | partial:m1754_12 | +| ir.cpp:1754:41:1754:42 | ChiTotal | total:m1753_10 | +| ir.cpp:1754:41:1754:42 | ChiTotal | total:m1754_2 | +| ir.cpp:1754:41:1754:42 | SideEffect | ~m1753_10 | +| ir.cpp:1754:42:1754:42 | Address | &:r1754_4 | +| ir.cpp:1754:42:1754:42 | Address | &:r1754_7 | +| ir.cpp:1754:42:1754:42 | Arg(0) | 0:r1754_7 | +| ir.cpp:1754:42:1754:42 | Load | m1752_2 | +| ir.cpp:1754:42:1754:42 | SideEffect | ~m1752_4 | +| ir.cpp:1754:42:1754:42 | Unary | r1754_5 | +| ir.cpp:1754:42:1754:42 | Unary | r1754_6 | +| ir.cpp:1757:6:1757:22 | ChiPartial | partial:m1757_3 | +| ir.cpp:1757:6:1757:22 | ChiTotal | total:m1757_2 | +| ir.cpp:1757:6:1757:22 | SideEffect | m1757_3 | +| ir.cpp:1757:28:1757:28 | Address | &:r1757_5 | +| ir.cpp:1758:13:1758:13 | Address | &:r1758_1 | +| ir.cpp:1758:17:1758:17 | Address | &:r1758_2 | +| ir.cpp:1758:17:1758:17 | Load | m1757_6 | +| ir.cpp:1758:17:1758:17 | StoreValue | r1758_3 | +| ir.cpp:1758:20:1758:20 | Address | &:r1758_5 | +| ir.cpp:1758:20:1758:20 | Left | r1758_6 | +| ir.cpp:1758:20:1758:20 | Load | m1757_6 | +| ir.cpp:1758:20:1758:24 | Condition | r1758_10 | +| ir.cpp:1758:20:1758:24 | Left | r1758_8 | +| ir.cpp:1758:20:1758:24 | Right | r1758_9 | +| ir.cpp:1758:24:1758:24 | Right | r1758_7 | +| ir.cpp:1759:9:1759:9 | Address | &:r1759_6 | +| ir.cpp:1759:13:1759:13 | Address | &:r1759_1 | +| ir.cpp:1759:13:1759:13 | Left | r1759_2 | +| ir.cpp:1759:13:1759:13 | Load | m1757_6 | +| ir.cpp:1759:13:1759:17 | StoreValue | r1759_5 | +| ir.cpp:1759:17:1759:17 | Address | &:r1759_3 | +| ir.cpp:1759:17:1759:17 | Load | m1758_4 | +| ir.cpp:1759:17:1759:17 | Right | r1759_4 | +| ir.cpp:1762:9:1762:9 | Address | &:r1762_2 | +| ir.cpp:1762:9:1762:9 | Phi | from 0:m1757_6 | +| ir.cpp:1762:9:1762:9 | Phi | from 1:m1759_7 | +| ir.cpp:1763:9:1763:9 | Address | &:r1763_3 | +| ir.cpp:1763:13:1763:13 | Address | &:r1763_1 | +| ir.cpp:1763:13:1763:13 | Load | m1762_1 | +| ir.cpp:1763:13:1763:13 | StoreValue | r1763_2 | +| ir.cpp:1763:16:1763:16 | Address | &:r1763_5 | +| ir.cpp:1763:16:1763:16 | Left | r1763_6 | +| ir.cpp:1763:16:1763:16 | Load | m1762_1 | +| ir.cpp:1763:16:1763:20 | Condition | r1763_10 | +| ir.cpp:1763:16:1763:20 | Left | r1763_8 | +| ir.cpp:1763:16:1763:20 | Right | r1763_9 | +| ir.cpp:1763:20:1763:20 | Right | r1763_7 | +| ir.cpp:1764:9:1764:9 | Address | &:r1764_6 | +| ir.cpp:1764:13:1764:13 | Address | &:r1764_1 | +| ir.cpp:1764:13:1764:13 | Left | r1764_2 | +| ir.cpp:1764:13:1764:13 | Load | m1762_1 | +| ir.cpp:1764:13:1764:17 | StoreValue | r1764_5 | +| ir.cpp:1764:17:1764:17 | Address | &:r1764_3 | +| ir.cpp:1764:17:1764:17 | Load | m1763_4 | +| ir.cpp:1764:17:1764:17 | Right | r1764_4 | +| ir.cpp:1767:9:1767:9 | Address | &:r1767_4 | +| ir.cpp:1767:13:1767:13 | Address | &:r1767_2 | +| ir.cpp:1767:13:1767:13 | Load | m1767_1 | +| ir.cpp:1767:13:1767:13 | Phi | from 2:m1762_1 | +| ir.cpp:1767:13:1767:13 | Phi | from 3:m1764_7 | +| ir.cpp:1767:13:1767:13 | StoreValue | r1767_3 | +| ir.cpp:1767:14:1767:25 | Address | &:r1767_6 | +| ir.cpp:1767:14:1767:25 | Condition | r1767_14 | +| ir.cpp:1767:20:1767:21 | Address | &:r1767_10 | +| ir.cpp:1767:20:1767:21 | Left | r1767_11 | +| ir.cpp:1767:20:1767:21 | Load | m1767_9 | +| ir.cpp:1767:20:1767:21 | Right | r1767_12 | +| ir.cpp:1767:20:1767:21 | Unary | r1767_13 | +| ir.cpp:1767:25:1767:25 | Address | &:r1767_7 | +| ir.cpp:1767:25:1767:25 | Load | m1767_5 | +| ir.cpp:1767:25:1767:25 | StoreValue | r1767_8 | +| ir.cpp:1768:9:1768:9 | Address | &:r1768_6 | +| ir.cpp:1768:13:1768:13 | Address | &:r1768_1 | +| ir.cpp:1768:13:1768:13 | Left | r1768_2 | +| ir.cpp:1768:13:1768:13 | Load | m1767_1 | +| ir.cpp:1768:13:1768:17 | StoreValue | r1768_5 | +| ir.cpp:1768:17:1768:17 | Address | &:r1768_3 | +| ir.cpp:1768:17:1768:17 | Load | m1767_5 | +| ir.cpp:1768:17:1768:17 | Right | r1768_4 | +| ir.cpp:1771:9:1771:29 | Address | &:r1771_6 | +| ir.cpp:1771:9:1771:29 | Condition | r1771_14 | +| ir.cpp:1771:13:1771:13 | Address | &:r1771_2 | +| ir.cpp:1771:13:1771:13 | Phi | from 4:m1767_1 | +| ir.cpp:1771:13:1771:13 | Phi | from 5:m1768_7 | +| ir.cpp:1771:17:1771:17 | Address | &:r1771_3 | +| ir.cpp:1771:17:1771:17 | Load | m1771_1 | +| ir.cpp:1771:17:1771:17 | StoreValue | r1771_4 | +| ir.cpp:1771:24:1771:25 | Address | &:r1771_10 | +| ir.cpp:1771:24:1771:25 | Left | r1771_11 | +| ir.cpp:1771:24:1771:25 | Load | m1771_9 | +| ir.cpp:1771:24:1771:25 | Right | r1771_12 | +| ir.cpp:1771:24:1771:25 | Unary | r1771_13 | +| ir.cpp:1771:29:1771:29 | Address | &:r1771_7 | +| ir.cpp:1771:29:1771:29 | Load | m1771_5 | +| ir.cpp:1771:29:1771:29 | StoreValue | r1771_8 | +| ir.cpp:1772:9:1772:9 | Address | &:r1772_6 | +| ir.cpp:1772:13:1772:13 | Address | &:r1772_1 | +| ir.cpp:1772:13:1772:13 | Left | r1772_2 | +| ir.cpp:1772:13:1772:13 | Load | m1771_1 | +| ir.cpp:1772:13:1772:17 | StoreValue | r1772_5 | +| ir.cpp:1772:17:1772:17 | Address | &:r1772_3 | +| ir.cpp:1772:17:1772:17 | Load | m1771_5 | +| ir.cpp:1772:17:1772:17 | Right | r1772_4 | +| ir.cpp:1775:9:1775:9 | Address | &:r1775_2 | +| ir.cpp:1775:9:1775:9 | Phi | from 6:m1771_1 | +| ir.cpp:1775:9:1775:9 | Phi | from 7:m1772_7 | +| ir.cpp:1775:13:1775:13 | Address | &:r1775_3 | +| ir.cpp:1775:13:1775:13 | Load | m1775_1 | +| ir.cpp:1775:13:1775:13 | StoreValue | r1775_4 | +| ir.cpp:1776:9:1776:9 | Address | &:r1776_1 | +| ir.cpp:1776:9:1776:9 | Condition | r1776_4 | +| ir.cpp:1776:9:1776:9 | Left | r1776_2 | +| ir.cpp:1776:9:1776:9 | Load | m1775_5 | +| ir.cpp:1776:9:1776:9 | Right | r1776_3 | +| ir.cpp:1777:9:1777:9 | Address | &:r1777_6 | +| ir.cpp:1777:13:1777:13 | Address | &:r1777_1 | +| ir.cpp:1777:13:1777:13 | Left | r1777_2 | +| ir.cpp:1777:13:1777:13 | Load | m1775_1 | +| ir.cpp:1777:13:1777:17 | StoreValue | r1777_5 | +| ir.cpp:1777:17:1777:17 | Address | &:r1777_3 | +| ir.cpp:1777:17:1777:17 | Load | m1775_5 | +| ir.cpp:1777:17:1777:17 | Right | r1777_4 | +| ir.cpp:1780:9:1780:18 | Address | &:r1780_2 | +| ir.cpp:1780:9:1780:18 | Condition | r1780_10 | +| ir.cpp:1780:9:1780:18 | Phi | from 8:m1775_1 | +| ir.cpp:1780:9:1780:18 | Phi | from 9:m1777_7 | +| ir.cpp:1780:13:1780:14 | Address | &:r1780_6 | +| ir.cpp:1780:13:1780:14 | Left | r1780_7 | +| ir.cpp:1780:13:1780:14 | Load | m1780_5 | +| ir.cpp:1780:13:1780:14 | Right | r1780_8 | +| ir.cpp:1780:13:1780:14 | Unary | r1780_9 | +| ir.cpp:1780:18:1780:18 | Address | &:r1780_3 | +| ir.cpp:1780:18:1780:18 | Load | m1775_5 | +| ir.cpp:1780:18:1780:18 | StoreValue | r1780_4 | +| ir.cpp:1781:9:1781:9 | Address | &:r1781_3 | +| ir.cpp:1781:9:1781:9 | Address | &:r1781_3 | +| ir.cpp:1781:9:1781:9 | Left | r1781_4 | +| ir.cpp:1781:9:1781:9 | Load | m1780_1 | +| ir.cpp:1781:9:1781:15 | StoreValue | r1781_5 | +| ir.cpp:1781:14:1781:15 | Address | &:r1781_1 | +| ir.cpp:1781:14:1781:15 | Load | m1780_5 | +| ir.cpp:1781:14:1781:15 | Right | r1781_2 | +| ir.cpp:1785:6:1785:26 | ChiPartial | partial:m1785_3 | +| ir.cpp:1785:6:1785:26 | ChiTotal | total:m1785_2 | +| ir.cpp:1785:6:1785:26 | SideEffect | m1785_3 | +| ir.cpp:1785:32:1785:32 | Address | &:r1785_5 | +| ir.cpp:1786:17:1786:17 | Address | &:r1786_1 | +| ir.cpp:1786:21:1786:21 | Address | &:r1786_2 | +| ir.cpp:1786:21:1786:21 | Load | m1785_6 | +| ir.cpp:1786:21:1786:21 | StoreValue | r1786_3 | +| ir.cpp:1786:24:1786:24 | Address | &:r1786_5 | +| ir.cpp:1786:24:1786:24 | Left | r1786_6 | +| ir.cpp:1786:24:1786:24 | Load | m1785_6 | +| ir.cpp:1786:24:1786:28 | Condition | r1786_8 | +| ir.cpp:1786:28:1786:28 | Right | r1786_7 | +| ir.cpp:1788:9:1788:9 | Address | &:r1788_6 | +| ir.cpp:1788:13:1788:13 | Address | &:r1788_1 | +| ir.cpp:1788:13:1788:13 | Left | r1788_2 | +| ir.cpp:1788:13:1788:13 | Load | m1785_6 | +| ir.cpp:1788:13:1788:17 | StoreValue | r1788_5 | +| ir.cpp:1788:17:1788:17 | Address | &:r1788_3 | +| ir.cpp:1788:17:1788:17 | Load | m1786_4 | +| ir.cpp:1788:17:1788:17 | Right | r1788_4 | +| ir.cpp:1791:9:1791:9 | Address | &:r1791_1 | +| ir.cpp:1792:13:1792:13 | Address | &:r1792_3 | +| ir.cpp:1792:17:1792:17 | Address | &:r1792_1 | +| ir.cpp:1792:17:1792:17 | Load | m1788_7 | +| ir.cpp:1792:17:1792:17 | StoreValue | r1792_2 | +| ir.cpp:1792:20:1792:20 | Address | &:r1792_5 | +| ir.cpp:1792:20:1792:20 | Left | r1792_6 | +| ir.cpp:1792:20:1792:20 | Load | m1788_7 | +| ir.cpp:1792:20:1792:24 | Condition | r1792_8 | +| ir.cpp:1792:24:1792:24 | Right | r1792_7 | +| ir.cpp:1794:9:1794:9 | Address | &:r1794_6 | +| ir.cpp:1794:13:1794:13 | Address | &:r1794_1 | +| ir.cpp:1794:13:1794:13 | Left | r1794_2 | +| ir.cpp:1794:13:1794:13 | Load | m1788_7 | +| ir.cpp:1794:13:1794:17 | StoreValue | r1794_5 | +| ir.cpp:1794:17:1794:17 | Address | &:r1794_3 | +| ir.cpp:1794:17:1794:17 | Load | m1792_4 | +| ir.cpp:1794:17:1794:17 | Right | r1794_4 | +| ir.cpp:1797:13:1797:13 | Address | &:r1797_3 | +| ir.cpp:1797:17:1797:17 | Address | &:r1797_1 | +| ir.cpp:1797:17:1797:17 | Load | m1794_7 | +| ir.cpp:1797:17:1797:17 | StoreValue | r1797_2 | +| ir.cpp:1797:18:1797:29 | Address | &:r1797_5 | +| ir.cpp:1797:18:1797:29 | Condition | r1797_11 | +| ir.cpp:1797:24:1797:25 | Address | &:r1797_9 | +| ir.cpp:1797:24:1797:25 | Load | m1797_8 | +| ir.cpp:1797:24:1797:25 | Unary | r1797_10 | +| ir.cpp:1797:29:1797:29 | Address | &:r1797_6 | +| ir.cpp:1797:29:1797:29 | Load | m1797_4 | +| ir.cpp:1797:29:1797:29 | StoreValue | r1797_7 | +| ir.cpp:1799:9:1799:9 | Address | &:r1799_6 | +| ir.cpp:1799:13:1799:13 | Address | &:r1799_1 | +| ir.cpp:1799:13:1799:13 | Left | r1799_2 | +| ir.cpp:1799:13:1799:13 | Load | m1794_7 | +| ir.cpp:1799:13:1799:17 | StoreValue | r1799_5 | +| ir.cpp:1799:17:1799:17 | Address | &:r1799_3 | +| ir.cpp:1799:17:1799:17 | Load | m1797_4 | +| ir.cpp:1799:17:1799:17 | Right | r1799_4 | +| ir.cpp:1802:13:1802:33 | Address | &:r1802_5 | +| ir.cpp:1802:13:1802:33 | Condition | r1802_11 | +| ir.cpp:1802:17:1802:17 | Address | &:r1802_1 | +| ir.cpp:1802:21:1802:21 | Address | &:r1802_2 | +| ir.cpp:1802:21:1802:21 | Load | m1799_7 | +| ir.cpp:1802:21:1802:21 | StoreValue | r1802_3 | +| ir.cpp:1802:28:1802:29 | Address | &:r1802_9 | +| ir.cpp:1802:28:1802:29 | Load | m1802_8 | +| ir.cpp:1802:28:1802:29 | Unary | r1802_10 | +| ir.cpp:1802:33:1802:33 | Address | &:r1802_6 | +| ir.cpp:1802:33:1802:33 | Load | m1802_4 | +| ir.cpp:1802:33:1802:33 | StoreValue | r1802_7 | +| ir.cpp:1804:9:1804:9 | Address | &:r1804_6 | +| ir.cpp:1804:13:1804:13 | Address | &:r1804_1 | +| ir.cpp:1804:13:1804:13 | Left | r1804_2 | +| ir.cpp:1804:13:1804:13 | Load | m1799_7 | +| ir.cpp:1804:13:1804:17 | StoreValue | r1804_5 | +| ir.cpp:1804:17:1804:17 | Address | &:r1804_3 | +| ir.cpp:1804:17:1804:17 | Load | m1802_4 | +| ir.cpp:1804:17:1804:17 | Right | r1804_4 | +| ir.cpp:1807:9:1807:9 | Address | &:r1807_1 | +| ir.cpp:1807:13:1807:13 | Address | &:r1807_2 | +| ir.cpp:1807:13:1807:13 | Load | m1804_7 | +| ir.cpp:1807:13:1807:13 | StoreValue | r1807_3 | +| ir.cpp:1808:13:1808:13 | Address | &:r1808_1 | +| ir.cpp:1808:13:1808:13 | Condition | r1808_2 | +| ir.cpp:1808:13:1808:13 | Load | m1807_4 | +| ir.cpp:1810:9:1810:9 | Address | &:r1810_6 | +| ir.cpp:1810:13:1810:13 | Address | &:r1810_1 | +| ir.cpp:1810:13:1810:13 | Left | r1810_2 | +| ir.cpp:1810:13:1810:13 | Load | m1804_7 | +| ir.cpp:1810:13:1810:17 | StoreValue | r1810_5 | +| ir.cpp:1810:17:1810:17 | Address | &:r1810_3 | +| ir.cpp:1810:17:1810:17 | Load | m1807_4 | +| ir.cpp:1810:17:1810:17 | Right | r1810_4 | +| ir.cpp:1813:13:1813:22 | Address | &:r1813_1 | +| ir.cpp:1813:13:1813:22 | Condition | r1813_7 | +| ir.cpp:1813:17:1813:18 | Address | &:r1813_5 | +| ir.cpp:1813:17:1813:18 | Load | m1813_4 | +| ir.cpp:1813:17:1813:18 | Unary | r1813_6 | +| ir.cpp:1813:22:1813:22 | Address | &:r1813_2 | +| ir.cpp:1813:22:1813:22 | Load | m1807_4 | +| ir.cpp:1813:22:1813:22 | StoreValue | r1813_3 | +| ir.cpp:1815:9:1815:9 | Address | &:r1815_3 | +| ir.cpp:1815:9:1815:9 | Address | &:r1815_3 | +| ir.cpp:1815:9:1815:9 | Left | r1815_4 | +| ir.cpp:1815:9:1815:9 | Load | m1810_7 | +| ir.cpp:1815:9:1815:15 | StoreValue | r1815_5 | +| ir.cpp:1815:14:1815:15 | Address | &:r1815_1 | +| ir.cpp:1815:14:1815:15 | Load | m1813_4 | +| ir.cpp:1815:14:1815:15 | Right | r1815_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 57f16b48a1a..9575759051e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -17,6 +17,9 @@ containsLoopOfForwardEdges lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:1486:8:1486:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1486:8:1486:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:1751:51:1751:51 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1750:5:1750:34 | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | +| ir.cpp:1752:48:1752:48 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1750:5:1750:34 | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 bbb03461087..17c59485eb9 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -49,6 +49,40 @@ bad_asts.cpp: # 14| v14_5(void) = AliasedUse : ~m? # 14| v14_6(void) = ExitFunction : +# 19| void Bad::Point::Point(Bad::Point const&) +# 19| Block 0 +# 19| v19_1(void) = EnterFunction : +# 19| mu19_2(unknown) = AliasedDefinition : +# 19| mu19_3(unknown) = InitializeNonLocal : +# 19| r19_4(glval) = VariableAddress[#this] : +# 19| mu19_5(glval) = InitializeParameter[#this] : &:r19_4 +# 19| r19_6(glval) = Load[#this] : &:r19_4, ~m? +# 19| mu19_7(Point) = InitializeIndirection[#this] : &:r19_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(Point &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Point &) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 19| r19_8(glval) = FieldAddress[x] : mu19_5 +# 19| r19_9(glval) = VariableAddress[(unnamed parameter 0)] : +# 19| r19_10(Point &) = Load[(unnamed parameter 0)] : &:r19_9, ~m? +# 19| r19_11(glval) = CopyValue : r19_10 +# 19| r19_12(glval) = FieldAddress[x] : r19_11 +# 19| r19_13(int) = Load[?] : &:r19_12, ~m? +# 19| mu19_14(int) = Store[?] : &:r19_8, r19_13 +# 19| r19_15(glval) = FieldAddress[y] : mu19_5 +# 19| r19_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 19| r19_17(Point &) = Load[(unnamed parameter 0)] : &:r19_16, ~m? +# 19| r19_18(glval) = CopyValue : r19_17 +# 19| r19_19(glval) = FieldAddress[y] : r19_18 +# 19| r19_20(int) = Load[?] : &:r19_19, ~m? +# 19| mu19_21(int) = Store[?] : &:r19_15, r19_20 +# 19| v19_22(void) = NoOp : +# 19| v19_23(void) = ReturnIndirection[#this] : &:r19_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 19| v19_24(void) = ReturnVoid : +# 19| v19_25(void) = AliasedUse : ~m? +# 19| v19_26(void) = ExitFunction : + # 22| void Bad::Point::Point() # 22| Block 0 # 22| v22_1(void) = EnterFunction : @@ -7915,51 +7949,58 @@ ir.cpp: # 1466| r1466_2(glval) = VariableAddress[xs] : # 1466| r1466_3(int(&)[2]) = CopyValue : r1466_2 # 1466| mu1466_4(int(&)[2]) = Store[(unnamed local variable)] : &:r1466_1, r1466_3 -# 1466| r1466_5(glval) = VariableAddress[x0] : +# 1466| r1466_5(glval) = VariableAddress[x0] : #-----| r0_1(glval) = VariableAddress[(unnamed local variable)] : #-----| r0_2(int(&)[2]) = Load[(unnamed local variable)] : &:r0_1, ~m? #-----| r0_3(glval) = CopyValue : r0_2 #-----| r0_4(int *) = Convert : r0_3 #-----| r0_5(unsigned long) = Constant[0] : #-----| r0_6(glval) = PointerAdd[4] : r0_4, r0_5 -#-----| mu0_7(int) = Store[x0] : &:r1466_5, r0_6 -# 1466| r1466_6(glval) = VariableAddress[x1] : +#-----| mu0_7(int &) = Store[x0] : &:r1466_5, r0_6 +# 1466| r1466_6(glval) = VariableAddress[x1] : #-----| r0_8(glval) = VariableAddress[(unnamed local variable)] : #-----| r0_9(int(&)[2]) = Load[(unnamed local variable)] : &:r0_8, ~m? #-----| r0_10(glval) = CopyValue : r0_9 #-----| r0_11(int *) = Convert : r0_10 #-----| r0_12(unsigned long) = Constant[1] : #-----| r0_13(glval) = PointerAdd[4] : r0_11, r0_12 -#-----| mu0_14(int) = Store[x1] : &:r1466_6, r0_13 +#-----| mu0_14(int &) = Store[x1] : &:r1466_6, r0_13 # 1467| r1467_1(int) = Constant[3] : -# 1467| r1467_2(glval) = VariableAddress[x1] : -# 1467| mu1467_3(int) = Store[x1] : &:r1467_2, r1467_1 +# 1467| r1467_2(glval) = VariableAddress[x1] : +# 1467| r1467_3(int &) = Load[x1] : &:r1467_2, ~m? +# 1467| mu1467_4(int) = Store[?] : &:r1467_3, r1467_1 # 1468| r1468_1(glval) = VariableAddress[rx1] : -# 1468| r1468_2(glval) = VariableAddress[x1] : -# 1468| r1468_3(int &) = CopyValue : r1468_2 -# 1468| mu1468_4(int &) = Store[rx1] : &:r1468_1, r1468_3 +# 1468| r1468_2(glval) = VariableAddress[x1] : +# 1468| r1468_3(int &) = Load[x1] : &:r1468_2, ~m? +# 1468| r1468_4(int &) = CopyValue : r1468_3 +# 1468| mu1468_5(int &) = Store[rx1] : &:r1468_1, r1468_4 # 1469| r1469_1(glval) = VariableAddress[x] : -# 1469| r1469_2(glval) = VariableAddress[x1] : -# 1469| r1469_3(int) = Load[x1] : &:r1469_2, ~m? -# 1469| mu1469_4(int) = Store[x] : &:r1469_1, r1469_3 +# 1469| r1469_2(glval) = VariableAddress[x1] : +# 1469| r1469_3(int &) = Load[x1] : &:r1469_2, ~m? +# 1469| r1469_4(int) = Load[?] : &:r1469_3, ~m? +# 1469| mu1469_5(int) = Store[x] : &:r1469_1, r1469_4 # 1473| r1473_1(glval) = VariableAddress[unnamed_local_variable] : # 1473| r1473_2(glval) = VariableAddress[xs] : # 1473| r1473_3(int(&)[2]) = CopyValue : r1473_2 # 1473| mu1473_4(int(&)[2]) = Store[unnamed_local_variable] : &:r1473_1, r1473_3 # 1474| r1474_1(glval) = VariableAddress[x0] : -# 1474| r1474_2(glval) = VariableAddress[xs] : -# 1474| r1474_3(int *) = Convert : r1474_2 -# 1474| r1474_4(int) = Constant[0] : -# 1474| r1474_5(glval) = PointerAdd[4] : r1474_3, r1474_4 -# 1474| r1474_6(int &) = CopyValue : r1474_5 -# 1474| mu1474_7(int &) = Store[x0] : &:r1474_1, r1474_6 +# 1474| r1474_2(glval) = VariableAddress[unnamed_local_variable] : +# 1474| r1474_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1474_2, ~m? +# 1474| r1474_4(glval) = CopyValue : r1474_3 +# 1474| r1474_5(int *) = Convert : r1474_4 +# 1474| r1474_6(int) = Constant[0] : +# 1474| r1474_7(glval) = PointerAdd[4] : r1474_5, r1474_6 +# 1474| r1474_8(int &) = CopyValue : r1474_7 +# 1474| mu1474_9(int &) = Store[x0] : &:r1474_1, r1474_8 # 1475| r1475_1(glval) = VariableAddress[x1] : -# 1475| r1475_2(glval) = VariableAddress[xs] : -# 1475| r1475_3(int *) = Convert : r1475_2 -# 1475| r1475_4(int) = Constant[1] : -# 1475| r1475_5(glval) = PointerAdd[4] : r1475_3, r1475_4 -# 1475| r1475_6(int &) = CopyValue : r1475_5 -# 1475| mu1475_7(int &) = Store[x1] : &:r1475_1, r1475_6 +# 1475| r1475_2(glval) = VariableAddress[unnamed_local_variable] : +# 1475| r1475_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1475_2, ~m? +# 1475| r1475_4(glval) = CopyValue : r1475_3 +# 1475| r1475_5(int *) = Convert : r1475_4 +# 1475| r1475_6(int) = Constant[1] : +# 1475| r1475_7(glval) = PointerAdd[4] : r1475_5, r1475_6 +# 1475| r1475_8(int &) = CopyValue : r1475_7 +# 1475| mu1475_9(int &) = Store[x1] : &:r1475_1, r1475_8 # 1476| r1476_1(int) = Constant[3] : # 1476| r1476_2(glval) = VariableAddress[x1] : # 1476| r1476_3(int &) = Load[x1] : &:r1476_2, ~m? @@ -7981,361 +8022,1703 @@ ir.cpp: # 1462| v1462_5(void) = AliasedUse : ~m? # 1462| v1462_6(void) = ExitFunction : -# 1482| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1482| void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() # 1482| Block 0 -# 1482| v1482_1(void) = EnterFunction : -# 1482| mu1482_2(unknown) = AliasedDefinition : -# 1482| mu1482_3(unknown) = InitializeNonLocal : -# 1482| r1482_4(glval) = VariableAddress[#this] : -# 1482| mu1482_5(glval) = InitializeParameter[#this] : &:r1482_4 -# 1482| r1482_6(glval) = Load[#this] : &:r1482_4, ~m? -# 1482| mu1482_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1482_6 -# 1482| v1482_8(void) = NoOp : -# 1482| v1482_9(void) = ReturnIndirection[#this] : &:r1482_6, ~m? -# 1482| v1482_10(void) = ReturnVoid : -# 1482| v1482_11(void) = AliasedUse : ~m? -# 1482| v1482_12(void) = ExitFunction : +# 1482| v1482_1(void) = EnterFunction : +# 1482| mu1482_2(unknown) = AliasedDefinition : +# 1482| mu1482_3(unknown) = InitializeNonLocal : +# 1482| r1482_4(glval) = VariableAddress[#this] : +# 1482| mu1482_5(glval) = InitializeParameter[#this] : &:r1482_4 +# 1482| r1482_6(glval) = Load[#this] : &:r1482_4, ~m? +# 1482| mu1482_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1482_6 +# 1482| v1482_8(void) = NoOp : +# 1482| v1482_9(void) = ReturnIndirection[#this] : &:r1482_6, ~m? +# 1482| v1482_10(void) = ReturnVoid : +# 1482| v1482_11(void) = AliasedUse : ~m? +# 1482| v1482_12(void) = ExitFunction : -# 1489| void data_member_structured_binding() -# 1489| Block 0 -# 1489| v1489_1(void) = EnterFunction : -# 1489| mu1489_2(unknown) = AliasedDefinition : -# 1489| mu1489_3(unknown) = InitializeNonLocal : -# 1490| r1490_1(glval) = VariableAddress[s] : -# 1490| mu1490_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1490_1 -# 1490| r1490_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : -# 1490| v1490_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1490_3, this:r1490_1 -# 1490| mu1490_5(unknown) = ^CallSideEffect : ~m? -# 1490| mu1490_6(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1490_1 -# 1493| r1493_1(glval) = VariableAddress[(unnamed local variable)] : -# 1493| r1493_2(glval) = VariableAddress[s] : -# 1493| r1493_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1493_2, ~m? -# 1493| mu1493_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1493_1, r1493_3 -# 1493| r1493_5(glval) = VariableAddress[i] : -# 1493| r1493_6(glval) = VariableAddress[(unnamed local variable)] : -# 1493| r1493_7(glval) = FieldAddress[i] : r1493_6 -# 1493| mu1493_8(int) = Store[i] : &:r1493_5, r1493_7 -# 1493| r1493_9(glval) = VariableAddress[d] : -# 1493| r1493_10(glval) = VariableAddress[(unnamed local variable)] : -# 1493| r1493_11(glval) = FieldAddress[d] : r1493_10 -# 1493| mu1493_12(double) = Store[d] : &:r1493_9, r1493_11 -# 1493| r1493_13(glval) = VariableAddress[b] : -# 1493| r1493_14(glval) = VariableAddress[(unnamed local variable)] : -# 1493| r1493_15(glval) = FieldAddress[b] : r1493_14 -# 1493| mu1493_16(unsigned int) = Store[b] : &:r1493_13, r1493_15 -# 1493| r1493_17(glval) = VariableAddress[r] : -# 1493| r1493_18(glval) = VariableAddress[(unnamed local variable)] : -# 1493| r1493_19(glval) = FieldAddress[r] : r1493_18 -# 1493| r1493_20(int &) = Load[?] : &:r1493_19, ~m? -# 1493| r1493_21(glval) = CopyValue : r1493_20 -# 1493| mu1493_22(int) = Store[r] : &:r1493_17, r1493_21 -# 1494| r1494_1(double) = Constant[4.0] : -# 1494| r1494_2(glval) = VariableAddress[d] : -# 1494| mu1494_3(double) = Store[d] : &:r1494_2, r1494_1 -# 1495| r1495_1(glval) = VariableAddress[rd] : -# 1495| r1495_2(glval) = VariableAddress[d] : -# 1495| r1495_3(double &) = CopyValue : r1495_2 -# 1495| mu1495_4(double &) = Store[rd] : &:r1495_1, r1495_3 -# 1496| r1496_1(glval) = VariableAddress[v] : -# 1496| r1496_2(glval) = VariableAddress[i] : -# 1496| r1496_3(int) = Load[i] : &:r1496_2, ~m? -# 1496| mu1496_4(int) = Store[v] : &:r1496_1, r1496_3 -# 1497| r1497_1(int) = Constant[5] : -# 1497| r1497_2(glval) = VariableAddress[r] : -# 1497| mu1497_3(int) = Store[r] : &:r1497_2, r1497_1 -# 1498| r1498_1(glval) = VariableAddress[rr] : -# 1498| r1498_2(glval) = VariableAddress[r] : -# 1498| r1498_3(int &) = CopyValue : r1498_2 -# 1498| mu1498_4(int &) = Store[rr] : &:r1498_1, r1498_3 -# 1499| r1499_1(glval) = VariableAddress[w] : -# 1499| r1499_2(glval) = VariableAddress[r] : -# 1499| r1499_3(int) = Load[r] : &:r1499_2, ~m? -# 1499| mu1499_4(int) = Store[w] : &:r1499_1, r1499_3 -# 1503| r1503_1(glval) = VariableAddress[unnamed_local_variable] : -# 1503| r1503_2(glval) = VariableAddress[s] : -# 1503| r1503_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1503_2, ~m? -# 1503| mu1503_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1503_1, r1503_3 -# 1504| r1504_1(glval) = VariableAddress[i] : -# 1504| r1504_2(glval) = VariableAddress[unnamed_local_variable] : -# 1504| r1504_3(glval) = FieldAddress[i] : r1504_2 -# 1504| r1504_4(int &) = CopyValue : r1504_3 -# 1504| mu1504_5(int &) = Store[i] : &:r1504_1, r1504_4 -# 1505| r1505_1(glval) = VariableAddress[d] : -# 1505| r1505_2(glval) = VariableAddress[unnamed_local_variable] : -# 1505| r1505_3(glval) = FieldAddress[d] : r1505_2 -# 1505| r1505_4(double &) = CopyValue : r1505_3 -# 1505| mu1505_5(double &) = Store[d] : &:r1505_1, r1505_4 -# 1507| r1507_1(glval) = VariableAddress[r] : -# 1507| r1507_2(glval) = VariableAddress[unnamed_local_variable] : -# 1507| r1507_3(glval) = FieldAddress[r] : r1507_2 -# 1507| r1507_4(int &) = Load[?] : &:r1507_3, ~m? -# 1507| r1507_5(glval) = CopyValue : r1507_4 -# 1507| r1507_6(int &) = CopyValue : r1507_5 -# 1507| mu1507_7(int &) = Store[r] : &:r1507_1, r1507_6 -# 1508| r1508_1(double) = Constant[4.0] : -# 1508| r1508_2(glval) = VariableAddress[d] : -# 1508| r1508_3(double &) = Load[d] : &:r1508_2, ~m? -# 1508| r1508_4(glval) = CopyValue : r1508_3 -# 1508| mu1508_5(double) = Store[?] : &:r1508_4, r1508_1 -# 1509| r1509_1(glval) = VariableAddress[rd] : -# 1509| r1509_2(glval) = VariableAddress[d] : -# 1509| r1509_3(double &) = Load[d] : &:r1509_2, ~m? -# 1509| r1509_4(glval) = CopyValue : r1509_3 -# 1509| r1509_5(double &) = CopyValue : r1509_4 -# 1509| mu1509_6(double &) = Store[rd] : &:r1509_1, r1509_5 -# 1510| r1510_1(glval) = VariableAddress[v] : -# 1510| r1510_2(glval) = VariableAddress[i] : -# 1510| r1510_3(int &) = Load[i] : &:r1510_2, ~m? -# 1510| r1510_4(int) = Load[?] : &:r1510_3, ~m? -# 1510| mu1510_5(int) = Store[v] : &:r1510_1, r1510_4 -# 1511| r1511_1(int) = Constant[5] : -# 1511| r1511_2(glval) = VariableAddress[r] : -# 1511| r1511_3(int &) = Load[r] : &:r1511_2, ~m? -# 1511| r1511_4(glval) = CopyValue : r1511_3 -# 1511| mu1511_5(int) = Store[?] : &:r1511_4, r1511_1 -# 1512| r1512_1(glval) = VariableAddress[rr] : -# 1512| r1512_2(glval) = VariableAddress[r] : -# 1512| r1512_3(int &) = Load[r] : &:r1512_2, ~m? -# 1512| r1512_4(glval) = CopyValue : r1512_3 -# 1512| r1512_5(int &) = CopyValue : r1512_4 -# 1512| mu1512_6(int &) = Store[rr] : &:r1512_1, r1512_5 -# 1513| r1513_1(glval) = VariableAddress[w] : -# 1513| r1513_2(glval) = VariableAddress[r] : -# 1513| r1513_3(int &) = Load[r] : &:r1513_2, ~m? -# 1513| r1513_4(int) = Load[?] : &:r1513_3, ~m? -# 1513| mu1513_5(int) = Store[w] : &:r1513_1, r1513_4 -# 1515| v1515_1(void) = NoOp : -# 1489| v1489_4(void) = ReturnVoid : -# 1489| v1489_5(void) = AliasedUse : ~m? -# 1489| v1489_6(void) = ExitFunction : +# 1486| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1486| Block 0 +# 1486| v1486_1(void) = EnterFunction : +# 1486| mu1486_2(unknown) = AliasedDefinition : +# 1486| mu1486_3(unknown) = InitializeNonLocal : +# 1486| r1486_4(glval) = VariableAddress[#this] : +# 1486| mu1486_5(glval) = InitializeParameter[#this] : &:r1486_4 +# 1486| r1486_6(glval) = Load[#this] : &:r1486_4, ~m? +# 1486| mu1486_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1486_6 +#-----| Goto -> Block 2 -# 1542| void StructuredBindingTuple::StructuredBindingTuple() -# 1542| Block 0 -# 1542| v1542_1(void) = EnterFunction : -# 1542| mu1542_2(unknown) = AliasedDefinition : -# 1542| mu1542_3(unknown) = InitializeNonLocal : -# 1542| r1542_4(glval) = VariableAddress[#this] : -# 1542| mu1542_5(glval) = InitializeParameter[#this] : &:r1542_4 -# 1542| r1542_6(glval) = Load[#this] : &:r1542_4, ~m? -# 1542| mu1542_7(StructuredBindingTuple) = InitializeIndirection[#this] : &:r1542_6 -# 1542| v1542_8(void) = NoOp : -# 1542| v1542_9(void) = ReturnIndirection[#this] : &:r1542_6, ~m? -# 1542| v1542_10(void) = ReturnVoid : -# 1542| v1542_11(void) = AliasedUse : ~m? -# 1542| v1542_12(void) = ExitFunction : +# 1486| Block 1 +# 1486| r1486_8(glval) = FieldAddress[m] : mu1486_5 +# 1486| r1486_9(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1486| v1486_10(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1486_9, this:r1486_8 +# 1486| mu1486_11(unknown) = ^CallSideEffect : ~m? +# 1486| mu1486_12(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1486_8 +#-----| Goto -> Block 2 -# 1552| std::tuple_element::type& StructuredBindingTuple::get() -# 1552| Block 0 -# 1552| v1552_1(void) = EnterFunction : -# 1552| mu1552_2(unknown) = AliasedDefinition : -# 1552| mu1552_3(unknown) = InitializeNonLocal : -# 1552| r1552_4(glval) = VariableAddress[#this] : -# 1552| mu1552_5(glval) = InitializeParameter[#this] : &:r1552_4 -# 1552| r1552_6(glval) = Load[#this] : &:r1552_4, ~m? -# 1552| mu1552_7(StructuredBindingTuple) = InitializeIndirection[#this] : &:r1552_6 -# 1552| r1552_8(glval) = VariableAddress[#return] : -# 1552| r1552_9(glval) = VariableAddress[#this] : -# 1552| r1552_10(StructuredBindingTuple *) = Load[#this] : &:r1552_9, ~m? -# 1552| r1552_11(glval) = FieldAddress[i] : r1552_10 -#-----| r0_1(int &) = CopyValue : r1552_11 -#-----| mu0_2(int &) = Store[#return] : &:r1552_8, r0_1 -# 1552| v1552_12(void) = ReturnIndirection[#this] : &:r1552_6, ~m? -# 1552| r1552_13(glval) = VariableAddress[#return] : -# 1552| v1552_14(void) = ReturnValue : &:r1552_13, ~m? -# 1552| v1552_15(void) = AliasedUse : ~m? -# 1552| v1552_16(void) = ExitFunction : +# 1486| Block 2 +# 1486| v1486_13(void) = NoOp : +# 1486| v1486_14(void) = ReturnIndirection[#this] : &:r1486_6, ~m? +# 1486| v1486_15(void) = ReturnVoid : +# 1486| v1486_16(void) = AliasedUse : ~m? +# 1486| v1486_17(void) = ExitFunction : -# 1554| std::tuple_element::type& StructuredBindingTuple::get() -# 1554| Block 0 -# 1554| v1554_1(void) = EnterFunction : -# 1554| mu1554_2(unknown) = AliasedDefinition : -# 1554| mu1554_3(unknown) = InitializeNonLocal : -# 1554| r1554_4(glval) = VariableAddress[#this] : -# 1554| mu1554_5(glval) = InitializeParameter[#this] : &:r1554_4 -# 1554| r1554_6(glval) = Load[#this] : &:r1554_4, ~m? -# 1554| mu1554_7(StructuredBindingTuple) = InitializeIndirection[#this] : &:r1554_6 -# 1554| r1554_8(glval) = VariableAddress[#return] : -# 1554| r1554_9(glval) = VariableAddress[#this] : -# 1554| r1554_10(StructuredBindingTuple *) = Load[#this] : &:r1554_9, ~m? -# 1554| r1554_11(glval) = FieldAddress[d] : r1554_10 -#-----| r0_1(double &) = CopyValue : r1554_11 -#-----| mu0_2(double &) = Store[#return] : &:r1554_8, r0_1 -# 1554| v1554_12(void) = ReturnIndirection[#this] : &:r1554_6, ~m? -# 1554| r1554_13(glval) = VariableAddress[#return] : -# 1554| v1554_14(void) = ReturnValue : &:r1554_13, ~m? -# 1554| v1554_15(void) = AliasedUse : ~m? -# 1554| v1554_16(void) = ExitFunction : +# 1486| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) +# 1486| Block 0 +# 1486| v1486_1(void) = EnterFunction : +# 1486| mu1486_2(unknown) = AliasedDefinition : +# 1486| mu1486_3(unknown) = InitializeNonLocal : +# 1486| r1486_4(glval) = VariableAddress[#this] : +# 1486| mu1486_5(glval) = InitializeParameter[#this] : &:r1486_4 +# 1486| r1486_6(glval) = Load[#this] : &:r1486_4, ~m? +# 1486| mu1486_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1486_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(StructuredBindingDataMemberStruct &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1486| r1486_8(glval) = FieldAddress[i] : mu1486_5 +# 1486| r1486_9(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_10(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_9, ~m? +# 1486| r1486_11(glval) = CopyValue : r1486_10 +# 1486| r1486_12(glval) = FieldAddress[i] : r1486_11 +# 1486| r1486_13(int) = Load[?] : &:r1486_12, ~m? +# 1486| mu1486_14(int) = Store[?] : &:r1486_8, r1486_13 +# 1486| r1486_15(glval) = FieldAddress[d] : mu1486_5 +# 1486| r1486_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_17(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_16, ~m? +# 1486| r1486_18(glval) = CopyValue : r1486_17 +# 1486| r1486_19(glval) = FieldAddress[d] : r1486_18 +# 1486| r1486_20(double) = Load[?] : &:r1486_19, ~m? +# 1486| mu1486_21(double) = Store[?] : &:r1486_15, r1486_20 +# 1486| r1486_22(glval) = FieldAddress[b] : mu1486_5 +# 1486| r1486_23(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_24(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_23, ~m? +# 1486| r1486_25(glval) = CopyValue : r1486_24 +# 1486| r1486_26(glval) = FieldAddress[b] : r1486_25 +# 1486| r1486_27(unsigned int) = Load[?] : &:r1486_26, ~m? +# 1486| mu1486_28(unsigned int) = Store[?] : &:r1486_22, r1486_27 +# 1486| r1486_29(glval) = FieldAddress[r] : mu1486_5 +# 1486| r1486_30(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_31(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_30, ~m? +# 1486| r1486_32(glval) = CopyValue : r1486_31 +# 1486| r1486_33(glval) = FieldAddress[r] : r1486_32 +# 1486| r1486_34(int &) = Load[?] : &:r1486_33, ~m? +# 1486| mu1486_35(int &) = Store[?] : &:r1486_29, r1486_34 +# 1486| r1486_36(glval) = FieldAddress[p] : mu1486_5 +# 1486| r1486_37(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_38(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_37, ~m? +# 1486| r1486_39(glval) = CopyValue : r1486_38 +# 1486| r1486_40(glval) = FieldAddress[p] : r1486_39 +# 1486| r1486_41(int *) = Load[?] : &:r1486_40, ~m? +# 1486| mu1486_42(int *) = Store[?] : &:r1486_36, r1486_41 +# 1486| r1486_43(glval) = FieldAddress[xs] : mu1486_5 +# 1486| r1486_44(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_45(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_44, ~m? +# 1486| r1486_46(glval) = CopyValue : r1486_45 +# 1486| r1486_47(glval) = FieldAddress[xs] : r1486_46 +# 1486| r1486_48(int[2]) = Load[?] : &:r1486_47, ~m? +# 1486| mu1486_49(int[2]) = Store[?] : &:r1486_43, r1486_48 +# 1486| r1486_50(glval) = FieldAddress[r_alt] : mu1486_5 +# 1486| r1486_51(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_52(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_51, ~m? +# 1486| r1486_53(glval) = CopyValue : r1486_52 +# 1486| r1486_54(glval) = FieldAddress[r_alt] : r1486_53 +# 1486| r1486_55(int &) = Load[?] : &:r1486_54, ~m? +# 1486| mu1486_56(int &) = Store[?] : &:r1486_50, r1486_55 +# 1486| r1486_57(glval) = FieldAddress[m] : mu1486_5 +# 1486| r1486_58(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_59(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_58, ~m? +# 1486| r1486_60(glval) = CopyValue : r1486_59 +# 1486| r1486_61(glval) = FieldAddress[m] : r1486_60 +# 1486| r1486_62(StructuredBindingDataMemberMemberStruct) = Load[?] : &:r1486_61, ~m? +# 1486| mu1486_63(StructuredBindingDataMemberMemberStruct) = Store[?] : &:r1486_57, r1486_62 +# 1486| v1486_64(void) = NoOp : +# 1486| v1486_65(void) = ReturnIndirection[#this] : &:r1486_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 1486| v1486_66(void) = ReturnVoid : +# 1486| v1486_67(void) = AliasedUse : ~m? +# 1486| v1486_68(void) = ExitFunction : -# 1556| std::tuple_element::type StructuredBindingTuple::get() -# 1556| Block 0 -# 1556| v1556_1(void) = EnterFunction : -# 1556| mu1556_2(unknown) = AliasedDefinition : -# 1556| mu1556_3(unknown) = InitializeNonLocal : -# 1556| r1556_4(glval) = VariableAddress[#this] : -# 1556| mu1556_5(glval) = InitializeParameter[#this] : &:r1556_4 -# 1556| r1556_6(glval) = Load[#this] : &:r1556_4, ~m? -# 1556| mu1556_7(StructuredBindingTuple) = InitializeIndirection[#this] : &:r1556_6 -# 1556| r1556_8(glval) = VariableAddress[#return] : -# 1556| r1556_9(glval) = VariableAddress[#this] : -# 1556| r1556_10(StructuredBindingTuple *) = Load[#this] : &:r1556_9, ~m? -# 1556| r1556_11(glval) = FieldAddress[r] : r1556_10 -# 1556| r1556_12(int &) = Load[?] : &:r1556_11, ~m? -# 1556| r1556_13(glval) = CopyValue : r1556_12 -# 1556| r1556_14(int &) = CopyValue : r1556_13 -# 1556| mu1556_15(int &) = Store[#return] : &:r1556_8, r1556_14 -# 1556| v1556_16(void) = ReturnIndirection[#this] : &:r1556_6, ~m? -# 1556| r1556_17(glval) = VariableAddress[#return] : -# 1556| v1556_18(void) = ReturnValue : &:r1556_17, ~m? -# 1556| v1556_19(void) = AliasedUse : ~m? -# 1556| v1556_20(void) = ExitFunction : +# 1499| void data_member_structured_binding() +# 1499| Block 0 +# 1499| v1499_1(void) = EnterFunction : +# 1499| mu1499_2(unknown) = AliasedDefinition : +# 1499| mu1499_3(unknown) = InitializeNonLocal : +# 1500| r1500_1(glval) = VariableAddress[s] : +# 1500| mu1500_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1500_1 +# 1500| r1500_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : +# 1500| v1500_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1500_3, this:r1500_1 +# 1500| mu1500_5(unknown) = ^CallSideEffect : ~m? +# 1500| mu1500_6(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1500_1 +# 1503| r1503_1(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_2(glval) = VariableAddress[s] : +# 1503| r1503_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1503_2, ~m? +# 1503| mu1503_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1503_1, r1503_3 +# 1503| r1503_5(glval) = VariableAddress[i] : +# 1503| r1503_6(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_7(glval) = FieldAddress[i] : r1503_6 +# 1503| mu1503_8(int &) = Store[i] : &:r1503_5, r1503_7 +# 1503| r1503_9(glval) = VariableAddress[d] : +# 1503| r1503_10(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_11(glval) = FieldAddress[d] : r1503_10 +# 1503| mu1503_12(double &) = Store[d] : &:r1503_9, r1503_11 +# 1503| r1503_13(glval) = VariableAddress[b] : +# 1503| r1503_14(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_15(glval) = FieldAddress[b] : r1503_14 +# 1503| mu1503_16(unsigned int &) = Store[b] : &:r1503_13, r1503_15 +# 1503| r1503_17(glval) = VariableAddress[r] : +# 1503| r1503_18(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_19(glval) = FieldAddress[r] : r1503_18 +# 1503| r1503_20(int &) = Load[?] : &:r1503_19, ~m? +# 1503| r1503_21(glval) = CopyValue : r1503_20 +# 1503| mu1503_22(int &) = Store[r] : &:r1503_17, r1503_21 +# 1503| r1503_23(glval) = VariableAddress[p] : +# 1503| r1503_24(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_25(glval) = FieldAddress[p] : r1503_24 +# 1503| mu1503_26(int *&) = Store[p] : &:r1503_23, r1503_25 +# 1503| r1503_27(glval) = VariableAddress[xs] : +# 1503| r1503_28(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_29(glval) = FieldAddress[xs] : r1503_28 +# 1503| mu1503_30(int(&)[2]) = Store[xs] : &:r1503_27, r1503_29 +# 1503| r1503_31(glval) = VariableAddress[r_alt] : +# 1503| r1503_32(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_33(glval) = FieldAddress[r_alt] : r1503_32 +# 1503| r1503_34(int &) = Load[?] : &:r1503_33, ~m? +# 1503| r1503_35(glval) = CopyValue : r1503_34 +# 1503| mu1503_36(int &) = Store[r_alt] : &:r1503_31, r1503_35 +# 1503| r1503_37(glval) = VariableAddress[m] : +# 1503| r1503_38(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_39(glval) = FieldAddress[m] : r1503_38 +# 1503| mu1503_40(StructuredBindingDataMemberMemberStruct &) = Store[m] : &:r1503_37, r1503_39 +# 1504| r1504_1(double) = Constant[4.0] : +# 1504| r1504_2(glval) = VariableAddress[d] : +# 1504| r1504_3(double &) = Load[d] : &:r1504_2, ~m? +# 1504| mu1504_4(double) = Store[?] : &:r1504_3, r1504_1 +# 1505| r1505_1(glval) = VariableAddress[rd] : +# 1505| r1505_2(glval) = VariableAddress[d] : +# 1505| r1505_3(double &) = Load[d] : &:r1505_2, ~m? +# 1505| r1505_4(double &) = CopyValue : r1505_3 +# 1505| mu1505_5(double &) = Store[rd] : &:r1505_1, r1505_4 +# 1506| r1506_1(glval) = VariableAddress[v] : +# 1506| r1506_2(glval) = VariableAddress[i] : +# 1506| r1506_3(int &) = Load[i] : &:r1506_2, ~m? +# 1506| r1506_4(int) = Load[?] : &:r1506_3, ~m? +# 1506| mu1506_5(int) = Store[v] : &:r1506_1, r1506_4 +# 1507| r1507_1(int) = Constant[5] : +# 1507| r1507_2(glval) = VariableAddress[r] : +# 1507| r1507_3(int &) = Load[r] : &:r1507_2, ~m? +# 1507| mu1507_4(int) = Store[?] : &:r1507_3, r1507_1 +# 1508| r1508_1(int) = Constant[6] : +# 1508| r1508_2(glval) = VariableAddress[p] : +# 1508| r1508_3(int *&) = Load[p] : &:r1508_2, ~m? +# 1508| r1508_4(int *) = Load[?] : &:r1508_3, ~m? +# 1508| r1508_5(glval) = CopyValue : r1508_4 +# 1508| mu1508_6(int) = Store[?] : &:r1508_5, r1508_1 +# 1509| r1509_1(glval) = VariableAddress[rr] : +# 1509| r1509_2(glval) = VariableAddress[r] : +# 1509| r1509_3(int &) = Load[r] : &:r1509_2, ~m? +# 1509| r1509_4(int &) = CopyValue : r1509_3 +# 1509| mu1509_5(int &) = Store[rr] : &:r1509_1, r1509_4 +# 1510| r1510_1(glval) = VariableAddress[pr] : +# 1510| r1510_2(glval) = VariableAddress[r] : +# 1510| r1510_3(int &) = Load[r] : &:r1510_2, ~m? +# 1510| r1510_4(int *) = CopyValue : r1510_3 +# 1510| mu1510_5(int *) = Store[pr] : &:r1510_1, r1510_4 +# 1511| r1511_1(glval) = VariableAddress[w] : +# 1511| r1511_2(glval) = VariableAddress[r] : +# 1511| r1511_3(int &) = Load[r] : &:r1511_2, ~m? +# 1511| r1511_4(int) = Load[?] : &:r1511_3, ~m? +# 1511| mu1511_5(int) = Store[w] : &:r1511_1, r1511_4 +# 1515| r1515_1(glval) = VariableAddress[unnamed_local_variable] : +# 1515| r1515_2(glval) = VariableAddress[s] : +# 1515| r1515_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1515_2, ~m? +# 1515| mu1515_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1515_1, r1515_3 +# 1516| r1516_1(glval) = VariableAddress[i] : +# 1516| r1516_2(glval) = VariableAddress[unnamed_local_variable] : +# 1516| r1516_3(glval) = FieldAddress[i] : r1516_2 +# 1516| r1516_4(int &) = CopyValue : r1516_3 +# 1516| mu1516_5(int &) = Store[i] : &:r1516_1, r1516_4 +# 1517| r1517_1(glval) = VariableAddress[d] : +# 1517| r1517_2(glval) = VariableAddress[unnamed_local_variable] : +# 1517| r1517_3(glval) = FieldAddress[d] : r1517_2 +# 1517| r1517_4(double &) = CopyValue : r1517_3 +# 1517| mu1517_5(double &) = Store[d] : &:r1517_1, r1517_4 +# 1519| r1519_1(glval) = VariableAddress[r] : +# 1519| r1519_2(glval) = VariableAddress[unnamed_local_variable] : +# 1519| r1519_3(glval) = FieldAddress[r] : r1519_2 +# 1519| r1519_4(int &) = Load[?] : &:r1519_3, ~m? +# 1519| r1519_5(glval) = CopyValue : r1519_4 +# 1519| r1519_6(int &) = CopyValue : r1519_5 +# 1519| mu1519_7(int &) = Store[r] : &:r1519_1, r1519_6 +# 1520| r1520_1(glval) = VariableAddress[p] : +# 1520| r1520_2(glval) = VariableAddress[unnamed_local_variable] : +# 1520| r1520_3(glval) = FieldAddress[p] : r1520_2 +# 1520| r1520_4(int *&) = CopyValue : r1520_3 +# 1520| mu1520_5(int *&) = Store[p] : &:r1520_1, r1520_4 +# 1521| r1521_1(double) = Constant[4.0] : +# 1521| r1521_2(glval) = VariableAddress[d] : +# 1521| r1521_3(double &) = Load[d] : &:r1521_2, ~m? +# 1521| r1521_4(glval) = CopyValue : r1521_3 +# 1521| mu1521_5(double) = Store[?] : &:r1521_4, r1521_1 +# 1522| r1522_1(glval) = VariableAddress[rd] : +# 1522| r1522_2(glval) = VariableAddress[d] : +# 1522| r1522_3(double &) = Load[d] : &:r1522_2, ~m? +# 1522| r1522_4(glval) = CopyValue : r1522_3 +# 1522| r1522_5(double &) = CopyValue : r1522_4 +# 1522| mu1522_6(double &) = Store[rd] : &:r1522_1, r1522_5 +# 1523| r1523_1(glval) = VariableAddress[v] : +# 1523| r1523_2(glval) = VariableAddress[i] : +# 1523| r1523_3(int &) = Load[i] : &:r1523_2, ~m? +# 1523| r1523_4(int) = Load[?] : &:r1523_3, ~m? +# 1523| mu1523_5(int) = Store[v] : &:r1523_1, r1523_4 +# 1524| r1524_1(int) = Constant[5] : +# 1524| r1524_2(glval) = VariableAddress[r] : +# 1524| r1524_3(int &) = Load[r] : &:r1524_2, ~m? +# 1524| r1524_4(glval) = CopyValue : r1524_3 +# 1524| mu1524_5(int) = Store[?] : &:r1524_4, r1524_1 +# 1525| r1525_1(int) = Constant[6] : +# 1525| r1525_2(glval) = VariableAddress[p] : +# 1525| r1525_3(int *&) = Load[p] : &:r1525_2, ~m? +# 1525| r1525_4(int *) = Load[?] : &:r1525_3, ~m? +# 1525| r1525_5(glval) = CopyValue : r1525_4 +# 1525| mu1525_6(int) = Store[?] : &:r1525_5, r1525_1 +# 1526| r1526_1(glval) = VariableAddress[rr] : +# 1526| r1526_2(glval) = VariableAddress[r] : +# 1526| r1526_3(int &) = Load[r] : &:r1526_2, ~m? +# 1526| r1526_4(glval) = CopyValue : r1526_3 +# 1526| r1526_5(int &) = CopyValue : r1526_4 +# 1526| mu1526_6(int &) = Store[rr] : &:r1526_1, r1526_5 +# 1527| r1527_1(glval) = VariableAddress[pr] : +# 1527| r1527_2(glval) = VariableAddress[r] : +# 1527| r1527_3(int &) = Load[r] : &:r1527_2, ~m? +# 1527| r1527_4(glval) = CopyValue : r1527_3 +# 1527| r1527_5(int *) = CopyValue : r1527_4 +# 1527| mu1527_6(int *) = Store[pr] : &:r1527_1, r1527_5 +# 1528| r1528_1(glval) = VariableAddress[w] : +# 1528| r1528_2(glval) = VariableAddress[r] : +# 1528| r1528_3(int &) = Load[r] : &:r1528_2, ~m? +# 1528| r1528_4(int) = Load[?] : &:r1528_3, ~m? +# 1528| mu1528_5(int) = Store[w] : &:r1528_1, r1528_4 +# 1530| v1530_1(void) = NoOp : +# 1499| v1499_4(void) = ReturnVoid : +# 1499| v1499_5(void) = AliasedUse : ~m? +# 1499| v1499_6(void) = ExitFunction : -# 1558| void tuple_structured_binding() -# 1558| Block 0 -# 1558| v1558_1(void) = EnterFunction : -# 1558| mu1558_2(unknown) = AliasedDefinition : -# 1558| mu1558_3(unknown) = InitializeNonLocal : -# 1559| r1559_1(glval) = VariableAddress[t] : -# 1559| mu1559_2(StructuredBindingTuple) = Uninitialized[t] : &:r1559_1 -# 1559| r1559_3(glval) = FunctionAddress[StructuredBindingTuple] : -# 1559| v1559_4(void) = Call[StructuredBindingTuple] : func:r1559_3, this:r1559_1 -# 1559| mu1559_5(unknown) = ^CallSideEffect : ~m? -# 1559| mu1559_6(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1559_1 -# 1562| r1562_1(glval) = VariableAddress[(unnamed local variable)] : -# 1562| r1562_2(glval) = VariableAddress[t] : -# 1562| r1562_3(StructuredBindingTuple) = Load[t] : &:r1562_2, ~m? -# 1562| mu1562_4(StructuredBindingTuple) = Store[(unnamed local variable)] : &:r1562_1, r1562_3 -# 1562| r1562_5(glval) = VariableAddress[i] : -# 1562| r1562_6(glval) = VariableAddress[(unnamed local variable)] : -# 1562| r1562_7(glval) = FunctionAddress[get] : -# 1562| r1562_8(int &) = Call[get] : func:r1562_7, this:r1562_6 -# 1562| mu1562_9(unknown) = ^CallSideEffect : ~m? -# 1562| v1562_10(void) = ^IndirectReadSideEffect[-1] : &:r1562_6, ~m? -# 1562| mu1562_11(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1562_6 -# 1562| r1562_12(glval) = CopyValue : r1562_8 -# 1562| r1562_13(int &) = CopyValue : r1562_12 -# 1562| mu1562_14(int &) = Store[i] : &:r1562_5, r1562_13 -# 1562| r1562_15(glval) = VariableAddress[d] : -# 1562| r1562_16(glval) = VariableAddress[(unnamed local variable)] : -# 1562| r1562_17(glval) = FunctionAddress[get] : -# 1562| r1562_18(double &) = Call[get] : func:r1562_17, this:r1562_16 -# 1562| mu1562_19(unknown) = ^CallSideEffect : ~m? -# 1562| v1562_20(void) = ^IndirectReadSideEffect[-1] : &:r1562_16, ~m? -# 1562| mu1562_21(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1562_16 -# 1562| r1562_22(glval) = CopyValue : r1562_18 -# 1562| r1562_23(double &) = CopyValue : r1562_22 -# 1562| mu1562_24(double &) = Store[d] : &:r1562_15, r1562_23 -# 1562| r1562_25(glval) = VariableAddress[r] : -# 1562| r1562_26(glval) = VariableAddress[(unnamed local variable)] : -# 1562| r1562_27(glval) = FunctionAddress[get] : -# 1562| r1562_28(int &) = Call[get] : func:r1562_27, this:r1562_26 -# 1562| mu1562_29(unknown) = ^CallSideEffect : ~m? -# 1562| v1562_30(void) = ^IndirectReadSideEffect[-1] : &:r1562_26, ~m? -# 1562| mu1562_31(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1562_26 -# 1562| r1562_32(glval) = CopyValue : r1562_28 -# 1562| r1562_33(int &) = CopyValue : r1562_32 -# 1562| mu1562_34(int &) = Store[r] : &:r1562_25, r1562_33 -# 1563| r1563_1(double) = Constant[4.0] : -# 1563| r1563_2(glval) = VariableAddress[d] : -# 1563| r1563_3(double &) = Load[d] : &:r1563_2, ~m? -# 1563| r1563_4(glval) = CopyValue : r1563_3 -# 1563| mu1563_5(double) = Store[?] : &:r1563_4, r1563_1 -# 1564| r1564_1(glval) = VariableAddress[rd] : -# 1564| r1564_2(glval) = VariableAddress[d] : -# 1564| r1564_3(double &) = Load[d] : &:r1564_2, ~m? -# 1564| r1564_4(glval) = CopyValue : r1564_3 -# 1564| r1564_5(double &) = CopyValue : r1564_4 -# 1564| mu1564_6(double &) = Store[rd] : &:r1564_1, r1564_5 -# 1565| r1565_1(glval) = VariableAddress[v] : -# 1565| r1565_2(glval) = VariableAddress[i] : -# 1565| r1565_3(int &) = Load[i] : &:r1565_2, ~m? -# 1565| r1565_4(int) = Load[?] : &:r1565_3, ~m? -# 1565| mu1565_5(int) = Store[v] : &:r1565_1, r1565_4 -# 1566| r1566_1(int) = Constant[5] : -# 1566| r1566_2(glval) = VariableAddress[r] : -# 1566| r1566_3(int &) = Load[r] : &:r1566_2, ~m? -# 1566| r1566_4(glval) = CopyValue : r1566_3 -# 1566| mu1566_5(int) = Store[?] : &:r1566_4, r1566_1 -# 1567| r1567_1(glval) = VariableAddress[rr] : -# 1567| r1567_2(glval) = VariableAddress[r] : -# 1567| r1567_3(int &) = Load[r] : &:r1567_2, ~m? -# 1567| r1567_4(glval) = CopyValue : r1567_3 -# 1567| r1567_5(int &) = CopyValue : r1567_4 -# 1567| mu1567_6(int &) = Store[rr] : &:r1567_1, r1567_5 -# 1568| r1568_1(glval) = VariableAddress[w] : -# 1568| r1568_2(glval) = VariableAddress[r] : -# 1568| r1568_3(int &) = Load[r] : &:r1568_2, ~m? -# 1568| r1568_4(int) = Load[?] : &:r1568_3, ~m? -# 1568| mu1568_5(int) = Store[w] : &:r1568_1, r1568_4 -# 1572| r1572_1(glval) = VariableAddress[unnamed_local_variable] : -# 1572| r1572_2(glval) = VariableAddress[t] : -# 1572| r1572_3(StructuredBindingTuple) = Load[t] : &:r1572_2, ~m? -# 1572| mu1572_4(StructuredBindingTuple) = Store[unnamed_local_variable] : &:r1572_1, r1572_3 -# 1573| r1573_1(glval) = VariableAddress[i] : -# 1573| r1573_2(glval) = VariableAddress[unnamed_local_variable] : -# 1573| r1573_3(glval) = FunctionAddress[get] : -# 1573| r1573_4(int &) = Call[get] : func:r1573_3, this:r1573_2 -# 1573| mu1573_5(unknown) = ^CallSideEffect : ~m? -# 1573| v1573_6(void) = ^IndirectReadSideEffect[-1] : &:r1573_2, ~m? -# 1573| mu1573_7(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1573_2 -# 1573| r1573_8(glval) = CopyValue : r1573_4 -# 1573| r1573_9(int &) = CopyValue : r1573_8 -# 1573| mu1573_10(int &) = Store[i] : &:r1573_1, r1573_9 -# 1574| r1574_1(glval) = VariableAddress[d] : -# 1574| r1574_2(glval) = VariableAddress[unnamed_local_variable] : -# 1574| r1574_3(glval) = FunctionAddress[get] : -# 1574| r1574_4(double &) = Call[get] : func:r1574_3, this:r1574_2 -# 1574| mu1574_5(unknown) = ^CallSideEffect : ~m? -# 1574| v1574_6(void) = ^IndirectReadSideEffect[-1] : &:r1574_2, ~m? -# 1574| mu1574_7(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1574_2 -# 1574| r1574_8(glval) = CopyValue : r1574_4 -# 1574| r1574_9(double &) = CopyValue : r1574_8 -# 1574| mu1574_10(double &) = Store[d] : &:r1574_1, r1574_9 -# 1575| r1575_1(glval) = VariableAddress[r] : -# 1575| r1575_2(glval) = VariableAddress[unnamed_local_variable] : -# 1575| r1575_3(glval) = FunctionAddress[get] : -# 1575| r1575_4(int &) = Call[get] : func:r1575_3, this:r1575_2 -# 1575| mu1575_5(unknown) = ^CallSideEffect : ~m? -# 1575| v1575_6(void) = ^IndirectReadSideEffect[-1] : &:r1575_2, ~m? -# 1575| mu1575_7(StructuredBindingTuple) = ^IndirectMayWriteSideEffect[-1] : &:r1575_2 -# 1575| r1575_8(glval) = CopyValue : r1575_4 -# 1575| r1575_9(int &) = CopyValue : r1575_8 -# 1575| mu1575_10(int &) = Store[r] : &:r1575_1, r1575_9 -# 1576| r1576_1(double) = Constant[4.0] : -# 1576| r1576_2(glval) = VariableAddress[d] : -# 1576| r1576_3(double &) = Load[d] : &:r1576_2, ~m? -# 1576| r1576_4(glval) = CopyValue : r1576_3 -# 1576| mu1576_5(double) = Store[?] : &:r1576_4, r1576_1 -# 1577| r1577_1(glval) = VariableAddress[rd] : -# 1577| r1577_2(glval) = VariableAddress[d] : -# 1577| r1577_3(double &) = Load[d] : &:r1577_2, ~m? -# 1577| r1577_4(glval) = CopyValue : r1577_3 -# 1577| r1577_5(double &) = CopyValue : r1577_4 -# 1577| mu1577_6(double &) = Store[rd] : &:r1577_1, r1577_5 -# 1578| r1578_1(glval) = VariableAddress[v] : -# 1578| r1578_2(glval) = VariableAddress[i] : -# 1578| r1578_3(int &) = Load[i] : &:r1578_2, ~m? -# 1578| r1578_4(int) = Load[?] : &:r1578_3, ~m? -# 1578| mu1578_5(int) = Store[v] : &:r1578_1, r1578_4 -# 1579| r1579_1(int) = Constant[5] : -# 1579| r1579_2(glval) = VariableAddress[r] : -# 1579| r1579_3(int &) = Load[r] : &:r1579_2, ~m? -# 1579| r1579_4(glval) = CopyValue : r1579_3 -# 1579| mu1579_5(int) = Store[?] : &:r1579_4, r1579_1 -# 1580| r1580_1(glval) = VariableAddress[rr] : -# 1580| r1580_2(glval) = VariableAddress[r] : -# 1580| r1580_3(int &) = Load[r] : &:r1580_2, ~m? -# 1580| r1580_4(glval) = CopyValue : r1580_3 -# 1580| r1580_5(int &) = CopyValue : r1580_4 -# 1580| mu1580_6(int &) = Store[rr] : &:r1580_1, r1580_5 -# 1581| r1581_1(glval) = VariableAddress[w] : -# 1581| r1581_2(glval) = VariableAddress[r] : -# 1581| r1581_3(int &) = Load[r] : &:r1581_2, ~m? -# 1581| r1581_4(int) = Load[?] : &:r1581_3, ~m? -# 1581| mu1581_5(int) = Store[w] : &:r1581_1, r1581_4 -# 1583| v1583_1(void) = NoOp : -# 1558| v1558_4(void) = ReturnVoid : -# 1558| v1558_5(void) = AliasedUse : ~m? -# 1558| v1558_6(void) = ExitFunction : +# 1539| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() +# 1539| Block 0 +# 1539| v1539_1(void) = EnterFunction : +# 1539| mu1539_2(unknown) = AliasedDefinition : +# 1539| mu1539_3(unknown) = InitializeNonLocal : +# 1539| r1539_4(glval) = VariableAddress[#this] : +# 1539| mu1539_5(glval) = InitializeParameter[#this] : &:r1539_4 +# 1539| r1539_6(glval) = Load[#this] : &:r1539_4, ~m? +# 1539| mu1539_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1539_6 +# 1539| v1539_8(void) = NoOp : +# 1539| v1539_9(void) = ReturnIndirection[#this] : &:r1539_6, ~m? +# 1539| v1539_10(void) = ReturnVoid : +# 1539| v1539_11(void) = AliasedUse : ~m? +# 1539| v1539_12(void) = ExitFunction : + +# 1539| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) +# 1539| Block 0 +# 1539| v1539_1(void) = EnterFunction : +# 1539| mu1539_2(unknown) = AliasedDefinition : +# 1539| mu1539_3(unknown) = InitializeNonLocal : +# 1539| r1539_4(glval) = VariableAddress[#this] : +# 1539| mu1539_5(glval) = InitializeParameter[#this] : &:r1539_4 +# 1539| r1539_6(glval) = Load[#this] : &:r1539_4, ~m? +# 1539| mu1539_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1539_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(StructuredBindingTupleRefGet &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1539| r1539_8(glval) = FieldAddress[i] : mu1539_5 +# 1539| r1539_9(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_10(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_9, ~m? +# 1539| r1539_11(glval) = CopyValue : r1539_10 +# 1539| r1539_12(glval) = FieldAddress[i] : r1539_11 +# 1539| r1539_13(int) = Load[?] : &:r1539_12, ~m? +# 1539| mu1539_14(int) = Store[?] : &:r1539_8, r1539_13 +# 1539| r1539_15(glval) = FieldAddress[d] : mu1539_5 +# 1539| r1539_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_17(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_16, ~m? +# 1539| r1539_18(glval) = CopyValue : r1539_17 +# 1539| r1539_19(glval) = FieldAddress[d] : r1539_18 +# 1539| r1539_20(double) = Load[?] : &:r1539_19, ~m? +# 1539| mu1539_21(double) = Store[?] : &:r1539_15, r1539_20 +# 1539| r1539_22(glval) = FieldAddress[r] : mu1539_5 +# 1539| r1539_23(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_24(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_23, ~m? +# 1539| r1539_25(glval) = CopyValue : r1539_24 +# 1539| r1539_26(glval) = FieldAddress[r] : r1539_25 +# 1539| r1539_27(int &) = Load[?] : &:r1539_26, ~m? +# 1539| mu1539_28(int &) = Store[?] : &:r1539_22, r1539_27 +# 1539| v1539_29(void) = NoOp : +# 1539| v1539_30(void) = ReturnIndirection[#this] : &:r1539_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 1539| v1539_31(void) = ReturnVoid : +# 1539| v1539_32(void) = AliasedUse : ~m? +# 1539| v1539_33(void) = ExitFunction : + +# 1567| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1567| Block 0 +# 1567| v1567_1(void) = EnterFunction : +# 1567| mu1567_2(unknown) = AliasedDefinition : +# 1567| mu1567_3(unknown) = InitializeNonLocal : +# 1567| r1567_4(glval) = VariableAddress[#this] : +# 1567| mu1567_5(glval) = InitializeParameter[#this] : &:r1567_4 +# 1567| r1567_6(glval) = Load[#this] : &:r1567_4, ~m? +# 1567| mu1567_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1567_6 +# 1568| r1568_1(glval) = VariableAddress[#return] : +# 1568| r1568_2(glval) = VariableAddress[#this] : +# 1568| r1568_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1568_2, ~m? +# 1568| r1568_4(glval) = FieldAddress[i] : r1568_3 +#-----| r0_1(int &) = CopyValue : r1568_4 +#-----| mu0_2(int &) = Store[#return] : &:r1568_1, r0_1 +# 1567| v1567_8(void) = ReturnIndirection[#this] : &:r1567_6, ~m? +# 1567| r1567_9(glval) = VariableAddress[#return] : +# 1567| v1567_10(void) = ReturnValue : &:r1567_9, ~m? +# 1567| v1567_11(void) = AliasedUse : ~m? +# 1567| v1567_12(void) = ExitFunction : + +# 1571| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1571| Block 0 +# 1571| v1571_1(void) = EnterFunction : +# 1571| mu1571_2(unknown) = AliasedDefinition : +# 1571| mu1571_3(unknown) = InitializeNonLocal : +# 1571| r1571_4(glval) = VariableAddress[#this] : +# 1571| mu1571_5(glval) = InitializeParameter[#this] : &:r1571_4 +# 1571| r1571_6(glval) = Load[#this] : &:r1571_4, ~m? +# 1571| mu1571_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1571_6 +# 1572| r1572_1(glval) = VariableAddress[#return] : +# 1572| r1572_2(glval) = VariableAddress[#this] : +# 1572| r1572_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1572_2, ~m? +# 1572| r1572_4(glval) = FieldAddress[d] : r1572_3 +#-----| r0_1(double &) = CopyValue : r1572_4 +#-----| mu0_2(double &) = Store[#return] : &:r1572_1, r0_1 +# 1571| v1571_8(void) = ReturnIndirection[#this] : &:r1571_6, ~m? +# 1571| r1571_9(glval) = VariableAddress[#return] : +# 1571| v1571_10(void) = ReturnValue : &:r1571_9, ~m? +# 1571| v1571_11(void) = AliasedUse : ~m? +# 1571| v1571_12(void) = ExitFunction : + +# 1575| std::tuple_element::type StructuredBindingTupleRefGet::get() +# 1575| Block 0 +# 1575| v1575_1(void) = EnterFunction : +# 1575| mu1575_2(unknown) = AliasedDefinition : +# 1575| mu1575_3(unknown) = InitializeNonLocal : +# 1575| r1575_4(glval) = VariableAddress[#this] : +# 1575| mu1575_5(glval) = InitializeParameter[#this] : &:r1575_4 +# 1575| r1575_6(glval) = Load[#this] : &:r1575_4, ~m? +# 1575| mu1575_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1575_6 +# 1576| r1576_1(glval) = VariableAddress[#return] : +# 1576| r1576_2(glval) = VariableAddress[#this] : +# 1576| r1576_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1576_2, ~m? +# 1576| r1576_4(glval) = FieldAddress[r] : r1576_3 +# 1576| r1576_5(int &) = Load[?] : &:r1576_4, ~m? +# 1576| r1576_6(glval) = CopyValue : r1576_5 +# 1576| r1576_7(int &) = CopyValue : r1576_6 +# 1576| mu1576_8(int &) = Store[#return] : &:r1576_1, r1576_7 +# 1575| v1575_8(void) = ReturnIndirection[#this] : &:r1575_6, ~m? +# 1575| r1575_9(glval) = VariableAddress[#return] : +# 1575| v1575_10(void) = ReturnValue : &:r1575_9, ~m? +# 1575| v1575_11(void) = AliasedUse : ~m? +# 1575| v1575_12(void) = ExitFunction : + +# 1579| void tuple_structured_binding_ref_get() +# 1579| Block 0 +# 1579| v1579_1(void) = EnterFunction : +# 1579| mu1579_2(unknown) = AliasedDefinition : +# 1579| mu1579_3(unknown) = InitializeNonLocal : +# 1580| r1580_1(glval) = VariableAddress[t] : +# 1580| mu1580_2(StructuredBindingTupleRefGet) = Uninitialized[t] : &:r1580_1 +# 1580| r1580_3(glval) = FunctionAddress[StructuredBindingTupleRefGet] : +# 1580| v1580_4(void) = Call[StructuredBindingTupleRefGet] : func:r1580_3, this:r1580_1 +# 1580| mu1580_5(unknown) = ^CallSideEffect : ~m? +# 1580| mu1580_6(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1580_1 +# 1583| r1583_1(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_2(glval) = VariableAddress[t] : +# 1583| r1583_3(StructuredBindingTupleRefGet) = Load[t] : &:r1583_2, ~m? +# 1583| mu1583_4(StructuredBindingTupleRefGet) = Store[(unnamed local variable)] : &:r1583_1, r1583_3 +# 1583| r1583_5(glval) = VariableAddress[i] : +# 1583| r1583_6(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_7(glval) = FunctionAddress[get] : +# 1583| r1583_8(int &) = Call[get] : func:r1583_7, this:r1583_6 +# 1583| mu1583_9(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_10(void) = ^IndirectReadSideEffect[-1] : &:r1583_6, ~m? +# 1583| mu1583_11(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_6 +# 1583| r1583_12(glval) = CopyValue : r1583_8 +# 1583| r1583_13(int &) = CopyValue : r1583_12 +# 1583| mu1583_14(int &) = Store[i] : &:r1583_5, r1583_13 +# 1583| r1583_15(glval) = VariableAddress[d] : +# 1583| r1583_16(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_17(glval) = FunctionAddress[get] : +# 1583| r1583_18(double &) = Call[get] : func:r1583_17, this:r1583_16 +# 1583| mu1583_19(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_20(void) = ^IndirectReadSideEffect[-1] : &:r1583_16, ~m? +# 1583| mu1583_21(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_16 +# 1583| r1583_22(glval) = CopyValue : r1583_18 +# 1583| r1583_23(double &) = CopyValue : r1583_22 +# 1583| mu1583_24(double &) = Store[d] : &:r1583_15, r1583_23 +# 1583| r1583_25(glval) = VariableAddress[r] : +# 1583| r1583_26(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_27(glval) = FunctionAddress[get] : +# 1583| r1583_28(int &) = Call[get] : func:r1583_27, this:r1583_26 +# 1583| mu1583_29(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_30(void) = ^IndirectReadSideEffect[-1] : &:r1583_26, ~m? +# 1583| mu1583_31(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_26 +# 1583| r1583_32(glval) = CopyValue : r1583_28 +# 1583| r1583_33(int &) = CopyValue : r1583_32 +# 1583| mu1583_34(int &) = Store[r] : &:r1583_25, r1583_33 +# 1584| r1584_1(double) = Constant[4.0] : +# 1584| r1584_2(glval) = VariableAddress[d] : +# 1584| r1584_3(double &) = Load[d] : &:r1584_2, ~m? +# 1584| r1584_4(glval) = CopyValue : r1584_3 +# 1584| mu1584_5(double) = Store[?] : &:r1584_4, r1584_1 +# 1585| r1585_1(glval) = VariableAddress[rd] : +# 1585| r1585_2(glval) = VariableAddress[d] : +# 1585| r1585_3(double &) = Load[d] : &:r1585_2, ~m? +# 1585| r1585_4(glval) = CopyValue : r1585_3 +# 1585| r1585_5(double &) = CopyValue : r1585_4 +# 1585| mu1585_6(double &) = Store[rd] : &:r1585_1, r1585_5 +# 1586| r1586_1(glval) = VariableAddress[v] : +# 1586| r1586_2(glval) = VariableAddress[i] : +# 1586| r1586_3(int &) = Load[i] : &:r1586_2, ~m? +# 1586| r1586_4(int) = Load[?] : &:r1586_3, ~m? +# 1586| mu1586_5(int) = Store[v] : &:r1586_1, r1586_4 +# 1587| r1587_1(int) = Constant[5] : +# 1587| r1587_2(glval) = VariableAddress[r] : +# 1587| r1587_3(int &) = Load[r] : &:r1587_2, ~m? +# 1587| r1587_4(glval) = CopyValue : r1587_3 +# 1587| mu1587_5(int) = Store[?] : &:r1587_4, r1587_1 +# 1588| r1588_1(glval) = VariableAddress[rr] : +# 1588| r1588_2(glval) = VariableAddress[r] : +# 1588| r1588_3(int &) = Load[r] : &:r1588_2, ~m? +# 1588| r1588_4(glval) = CopyValue : r1588_3 +# 1588| r1588_5(int &) = CopyValue : r1588_4 +# 1588| mu1588_6(int &) = Store[rr] : &:r1588_1, r1588_5 +# 1589| r1589_1(glval) = VariableAddress[w] : +# 1589| r1589_2(glval) = VariableAddress[r] : +# 1589| r1589_3(int &) = Load[r] : &:r1589_2, ~m? +# 1589| r1589_4(int) = Load[?] : &:r1589_3, ~m? +# 1589| mu1589_5(int) = Store[w] : &:r1589_1, r1589_4 +# 1593| r1593_1(glval) = VariableAddress[unnamed_local_variable] : +# 1593| r1593_2(glval) = VariableAddress[t] : +# 1593| r1593_3(StructuredBindingTupleRefGet) = Load[t] : &:r1593_2, ~m? +# 1593| mu1593_4(StructuredBindingTupleRefGet) = Store[unnamed_local_variable] : &:r1593_1, r1593_3 +# 1594| r1594_1(glval) = VariableAddress[i] : +# 1594| r1594_2(glval) = VariableAddress[unnamed_local_variable] : +# 1594| r1594_3(glval) = FunctionAddress[get] : +# 1594| r1594_4(int &) = Call[get] : func:r1594_3, this:r1594_2 +# 1594| mu1594_5(unknown) = ^CallSideEffect : ~m? +# 1594| v1594_6(void) = ^IndirectReadSideEffect[-1] : &:r1594_2, ~m? +# 1594| mu1594_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1594_2 +# 1594| r1594_8(glval) = CopyValue : r1594_4 +# 1594| r1594_9(int &) = CopyValue : r1594_8 +# 1594| mu1594_10(int &) = Store[i] : &:r1594_1, r1594_9 +# 1595| r1595_1(glval) = VariableAddress[d] : +# 1595| r1595_2(glval) = VariableAddress[unnamed_local_variable] : +# 1595| r1595_3(glval) = FunctionAddress[get] : +# 1595| r1595_4(double &) = Call[get] : func:r1595_3, this:r1595_2 +# 1595| mu1595_5(unknown) = ^CallSideEffect : ~m? +# 1595| v1595_6(void) = ^IndirectReadSideEffect[-1] : &:r1595_2, ~m? +# 1595| mu1595_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1595_2 +# 1595| r1595_8(glval) = CopyValue : r1595_4 +# 1595| r1595_9(double &) = CopyValue : r1595_8 +# 1595| mu1595_10(double &) = Store[d] : &:r1595_1, r1595_9 +# 1596| r1596_1(glval) = VariableAddress[r] : +# 1596| r1596_2(glval) = VariableAddress[unnamed_local_variable] : +# 1596| r1596_3(glval) = FunctionAddress[get] : +# 1596| r1596_4(int &) = Call[get] : func:r1596_3, this:r1596_2 +# 1596| mu1596_5(unknown) = ^CallSideEffect : ~m? +# 1596| v1596_6(void) = ^IndirectReadSideEffect[-1] : &:r1596_2, ~m? +# 1596| mu1596_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1596_2 +# 1596| r1596_8(glval) = CopyValue : r1596_4 +# 1596| r1596_9(int &) = CopyValue : r1596_8 +# 1596| mu1596_10(int &) = Store[r] : &:r1596_1, r1596_9 +# 1597| r1597_1(double) = Constant[4.0] : +# 1597| r1597_2(glval) = VariableAddress[d] : +# 1597| r1597_3(double &) = Load[d] : &:r1597_2, ~m? +# 1597| r1597_4(glval) = CopyValue : r1597_3 +# 1597| mu1597_5(double) = Store[?] : &:r1597_4, r1597_1 +# 1598| r1598_1(glval) = VariableAddress[rd] : +# 1598| r1598_2(glval) = VariableAddress[d] : +# 1598| r1598_3(double &) = Load[d] : &:r1598_2, ~m? +# 1598| r1598_4(glval) = CopyValue : r1598_3 +# 1598| r1598_5(double &) = CopyValue : r1598_4 +# 1598| mu1598_6(double &) = Store[rd] : &:r1598_1, r1598_5 +# 1599| r1599_1(glval) = VariableAddress[v] : +# 1599| r1599_2(glval) = VariableAddress[i] : +# 1599| r1599_3(int &) = Load[i] : &:r1599_2, ~m? +# 1599| r1599_4(int) = Load[?] : &:r1599_3, ~m? +# 1599| mu1599_5(int) = Store[v] : &:r1599_1, r1599_4 +# 1600| r1600_1(int) = Constant[5] : +# 1600| r1600_2(glval) = VariableAddress[r] : +# 1600| r1600_3(int &) = Load[r] : &:r1600_2, ~m? +# 1600| r1600_4(glval) = CopyValue : r1600_3 +# 1600| mu1600_5(int) = Store[?] : &:r1600_4, r1600_1 +# 1601| r1601_1(glval) = VariableAddress[rr] : +# 1601| r1601_2(glval) = VariableAddress[r] : +# 1601| r1601_3(int &) = Load[r] : &:r1601_2, ~m? +# 1601| r1601_4(glval) = CopyValue : r1601_3 +# 1601| r1601_5(int &) = CopyValue : r1601_4 +# 1601| mu1601_6(int &) = Store[rr] : &:r1601_1, r1601_5 +# 1602| r1602_1(glval) = VariableAddress[w] : +# 1602| r1602_2(glval) = VariableAddress[r] : +# 1602| r1602_3(int &) = Load[r] : &:r1602_2, ~m? +# 1602| r1602_4(int) = Load[?] : &:r1602_3, ~m? +# 1602| mu1602_5(int) = Store[w] : &:r1602_1, r1602_4 +# 1604| v1604_1(void) = NoOp : +# 1579| v1579_4(void) = ReturnVoid : +# 1579| v1579_5(void) = AliasedUse : ~m? +# 1579| v1579_6(void) = ExitFunction : + +# 1606| void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() +# 1606| Block 0 +# 1606| v1606_1(void) = EnterFunction : +# 1606| mu1606_2(unknown) = AliasedDefinition : +# 1606| mu1606_3(unknown) = InitializeNonLocal : +# 1606| r1606_4(glval) = VariableAddress[#this] : +# 1606| mu1606_5(glval) = InitializeParameter[#this] : &:r1606_4 +# 1606| r1606_6(glval) = Load[#this] : &:r1606_4, ~m? +# 1606| mu1606_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1606_6 +# 1606| v1606_8(void) = NoOp : +# 1606| v1606_9(void) = ReturnIndirection[#this] : &:r1606_6, ~m? +# 1606| v1606_10(void) = ReturnVoid : +# 1606| v1606_11(void) = AliasedUse : ~m? +# 1606| v1606_12(void) = ExitFunction : + +# 1633| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1633| Block 0 +# 1633| v1633_1(void) = EnterFunction : +# 1633| mu1633_2(unknown) = AliasedDefinition : +# 1633| mu1633_3(unknown) = InitializeNonLocal : +# 1633| r1633_4(glval) = VariableAddress[#this] : +# 1633| mu1633_5(glval) = InitializeParameter[#this] : &:r1633_4 +# 1633| r1633_6(glval) = Load[#this] : &:r1633_4, ~m? +# 1633| mu1633_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1633_6 +# 1634| r1634_1(glval) = VariableAddress[#return] : +# 1634| r1634_2(glval) = VariableAddress[#this] : +# 1634| r1634_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1634_2, ~m? +# 1634| r1634_4(glval) = FieldAddress[i] : r1634_3 +# 1634| r1634_5(int) = Load[?] : &:r1634_4, ~m? +# 1634| mu1634_6(int) = Store[#return] : &:r1634_1, r1634_5 +# 1633| v1633_8(void) = ReturnIndirection[#this] : &:r1633_6, ~m? +# 1633| r1633_9(glval) = VariableAddress[#return] : +# 1633| v1633_10(void) = ReturnValue : &:r1633_9, ~m? +# 1633| v1633_11(void) = AliasedUse : ~m? +# 1633| v1633_12(void) = ExitFunction : + +# 1637| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1637| Block 0 +# 1637| v1637_1(void) = EnterFunction : +# 1637| mu1637_2(unknown) = AliasedDefinition : +# 1637| mu1637_3(unknown) = InitializeNonLocal : +# 1637| r1637_4(glval) = VariableAddress[#this] : +# 1637| mu1637_5(glval) = InitializeParameter[#this] : &:r1637_4 +# 1637| r1637_6(glval) = Load[#this] : &:r1637_4, ~m? +# 1637| mu1637_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1637_6 +# 1638| r1638_1(glval) = VariableAddress[#return] : +# 1638| r1638_2(glval) = VariableAddress[#this] : +# 1638| r1638_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1638_2, ~m? +# 1638| r1638_4(glval) = FieldAddress[r] : r1638_3 +# 1638| r1638_5(int &) = Load[?] : &:r1638_4, ~m? +# 1638| r1638_6(glval) = CopyValue : r1638_5 +# 1638| r1638_7(int &) = CopyValue : r1638_6 +# 1638| mu1638_8(int &) = Store[#return] : &:r1638_1, r1638_7 +# 1637| v1637_8(void) = ReturnIndirection[#this] : &:r1637_6, ~m? +# 1637| r1637_9(glval) = VariableAddress[#return] : +# 1637| v1637_10(void) = ReturnValue : &:r1637_9, ~m? +# 1637| v1637_11(void) = AliasedUse : ~m? +# 1637| v1637_12(void) = ExitFunction : + +# 1641| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1641| Block 0 +# 1641| v1641_1(void) = EnterFunction : +# 1641| mu1641_2(unknown) = AliasedDefinition : +# 1641| mu1641_3(unknown) = InitializeNonLocal : +# 1641| r1641_4(glval) = VariableAddress[#this] : +# 1641| mu1641_5(glval) = InitializeParameter[#this] : &:r1641_4 +# 1641| r1641_6(glval) = Load[#this] : &:r1641_4, ~m? +# 1641| mu1641_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1641_6 +# 1642| r1642_1(glval) = VariableAddress[#return] : +# 1642| r1642_2(glval) = VariableAddress[#temp1642:12] : +# 1642| r1642_3(int) = Constant[5] : +# 1642| mu1642_4(int) = Store[#temp1642:12] : &:r1642_2, r1642_3 +# 1642| r1642_5(int &) = CopyValue : r1642_2 +# 1642| mu1642_6(int &&) = Store[#return] : &:r1642_1, r1642_5 +# 1641| v1641_8(void) = ReturnIndirection[#this] : &:r1641_6, ~m? +# 1641| r1641_9(glval) = VariableAddress[#return] : +# 1641| v1641_10(void) = ReturnValue : &:r1641_9, ~m? +# 1641| v1641_11(void) = AliasedUse : ~m? +# 1641| v1641_12(void) = ExitFunction : + +# 1645| void tuple_structured_binding_no_ref_get() +# 1645| Block 0 +# 1645| v1645_1(void) = EnterFunction : +# 1645| mu1645_2(unknown) = AliasedDefinition : +# 1645| mu1645_3(unknown) = InitializeNonLocal : +# 1646| r1646_1(glval) = VariableAddress[t] : +# 1646| mu1646_2(StructuredBindingTupleNoRefGet) = Uninitialized[t] : &:r1646_1 +# 1646| r1646_3(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : +# 1646| v1646_4(void) = Call[StructuredBindingTupleNoRefGet] : func:r1646_3, this:r1646_1 +# 1646| mu1646_5(unknown) = ^CallSideEffect : ~m? +# 1646| mu1646_6(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1646_1 +# 1649| r1649_1(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_2(glval) = VariableAddress[t] : +# 1649| r1649_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1649_2 +# 1649| mu1649_4(StructuredBindingTupleNoRefGet &) = Store[(unnamed local variable)] : &:r1649_1, r1649_3 +# 1649| r1649_5(glval) = VariableAddress[i] : +# 1649| r1649_6(glval) = VariableAddress[#temp1649:16] : +# 1649| r1649_7(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_8(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_7, ~m? +# 1649| r1649_9(glval) = CopyValue : r1649_8 +# 1649| r1649_10(glval) = FunctionAddress[get] : +# 1649| r1649_11(int) = Call[get] : func:r1649_10, this:r1649_9 +# 1649| mu1649_12(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_13(void) = ^IndirectReadSideEffect[-1] : &:r1649_9, ~m? +# 1649| mu1649_14(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_9 +# 1649| mu1649_15(int) = Store[#temp1649:16] : &:r1649_6, r1649_11 +# 1649| r1649_16(int &) = CopyValue : r1649_6 +# 1649| mu1649_17(int &&) = Store[i] : &:r1649_5, r1649_16 +# 1649| r1649_18(glval) = VariableAddress[r] : +# 1649| r1649_19(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_20(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_19, ~m? +# 1649| r1649_21(glval) = CopyValue : r1649_20 +# 1649| r1649_22(glval) = FunctionAddress[get] : +# 1649| r1649_23(int &) = Call[get] : func:r1649_22, this:r1649_21 +# 1649| mu1649_24(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_25(void) = ^IndirectReadSideEffect[-1] : &:r1649_21, ~m? +# 1649| mu1649_26(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_21 +# 1649| r1649_27(glval) = CopyValue : r1649_23 +# 1649| r1649_28(int &) = CopyValue : r1649_27 +# 1649| mu1649_29(int &) = Store[r] : &:r1649_18, r1649_28 +# 1649| r1649_30(glval) = VariableAddress[rv] : +# 1649| r1649_31(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_32(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_31, ~m? +# 1649| r1649_33(glval) = CopyValue : r1649_32 +# 1649| r1649_34(glval) = FunctionAddress[get] : +# 1649| r1649_35(int &&) = Call[get] : func:r1649_34, this:r1649_33 +# 1649| mu1649_36(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_37(void) = ^IndirectReadSideEffect[-1] : &:r1649_33, ~m? +# 1649| mu1649_38(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_33 +# 1649| r1649_39(glval) = CopyValue : r1649_35 +# 1649| r1649_40(int &) = CopyValue : r1649_39 +# 1649| mu1649_41(int &&) = Store[rv] : &:r1649_30, r1649_40 +# 1650| r1650_1(int) = Constant[4] : +# 1650| r1650_2(glval) = VariableAddress[i] : +# 1650| r1650_3(int &&) = Load[i] : &:r1650_2, ~m? +# 1650| r1650_4(glval) = CopyValue : r1650_3 +# 1650| mu1650_5(int) = Store[?] : &:r1650_4, r1650_1 +# 1651| r1651_1(glval) = VariableAddress[ri] : +# 1651| r1651_2(glval) = VariableAddress[i] : +# 1651| r1651_3(int &&) = Load[i] : &:r1651_2, ~m? +# 1651| r1651_4(glval) = CopyValue : r1651_3 +# 1651| r1651_5(int &) = CopyValue : r1651_4 +# 1651| mu1651_6(int &) = Store[ri] : &:r1651_1, r1651_5 +# 1652| r1652_1(glval) = VariableAddress[v] : +# 1652| r1652_2(glval) = VariableAddress[i] : +# 1652| r1652_3(int &&) = Load[i] : &:r1652_2, ~m? +# 1652| r1652_4(int) = Load[?] : &:r1652_3, ~m? +# 1652| mu1652_5(int) = Store[v] : &:r1652_1, r1652_4 +# 1653| r1653_1(int) = Constant[5] : +# 1653| r1653_2(glval) = VariableAddress[r] : +# 1653| r1653_3(int &) = Load[r] : &:r1653_2, ~m? +# 1653| r1653_4(glval) = CopyValue : r1653_3 +# 1653| mu1653_5(int) = Store[?] : &:r1653_4, r1653_1 +# 1654| r1654_1(glval) = VariableAddress[rr] : +# 1654| r1654_2(glval) = VariableAddress[r] : +# 1654| r1654_3(int &) = Load[r] : &:r1654_2, ~m? +# 1654| r1654_4(glval) = CopyValue : r1654_3 +# 1654| r1654_5(int &) = CopyValue : r1654_4 +# 1654| mu1654_6(int &) = Store[rr] : &:r1654_1, r1654_5 +# 1655| r1655_1(glval) = VariableAddress[w] : +# 1655| r1655_2(glval) = VariableAddress[r] : +# 1655| r1655_3(int &) = Load[r] : &:r1655_2, ~m? +# 1655| r1655_4(int) = Load[?] : &:r1655_3, ~m? +# 1655| mu1655_5(int) = Store[w] : &:r1655_1, r1655_4 +# 1659| r1659_1(glval) = VariableAddress[unnamed_local_variable] : +# 1659| r1659_2(glval) = VariableAddress[t] : +# 1659| r1659_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1659_2 +# 1659| mu1659_4(StructuredBindingTupleNoRefGet &) = Store[unnamed_local_variable] : &:r1659_1, r1659_3 +# 1660| r1660_1(glval) = VariableAddress[i] : +# 1660| r1660_2(glval) = VariableAddress[#temp1660:20] : +# 1660| r1660_3(glval) = VariableAddress[unnamed_local_variable] : +# 1660| r1660_4(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1660_3, ~m? +# 1660| r1660_5(glval) = CopyValue : r1660_4 +# 1660| r1660_6(glval) = FunctionAddress[get] : +# 1660| r1660_7(int) = Call[get] : func:r1660_6, this:r1660_5 +# 1660| mu1660_8(unknown) = ^CallSideEffect : ~m? +# 1660| v1660_9(void) = ^IndirectReadSideEffect[-1] : &:r1660_5, ~m? +# 1660| mu1660_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1660_5 +# 1660| mu1660_11(int) = Store[#temp1660:20] : &:r1660_2, r1660_7 +# 1660| r1660_12(int &) = CopyValue : r1660_2 +# 1660| mu1660_13(int &&) = Store[i] : &:r1660_1, r1660_12 +# 1661| r1661_1(glval) = VariableAddress[r] : +# 1661| r1661_2(glval) = VariableAddress[unnamed_local_variable] : +# 1661| r1661_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1661_2, ~m? +# 1661| r1661_4(glval) = CopyValue : r1661_3 +# 1661| r1661_5(glval) = FunctionAddress[get] : +# 1661| r1661_6(int &) = Call[get] : func:r1661_5, this:r1661_4 +# 1661| mu1661_7(unknown) = ^CallSideEffect : ~m? +# 1661| v1661_8(void) = ^IndirectReadSideEffect[-1] : &:r1661_4, ~m? +# 1661| mu1661_9(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1661_4 +# 1661| r1661_10(glval) = CopyValue : r1661_6 +# 1661| r1661_11(int &) = CopyValue : r1661_10 +# 1661| mu1661_12(int &) = Store[r] : &:r1661_1, r1661_11 +# 1662| r1662_1(glval) = VariableAddress[rv] : +# 1662| r1662_2(glval) = VariableAddress[unnamed_local_variable] : +# 1662| r1662_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1662_2, ~m? +# 1662| r1662_4(glval) = CopyValue : r1662_3 +# 1662| r1662_5(glval) = FunctionAddress[get] : +# 1662| r1662_6(int &&) = Call[get] : func:r1662_5, this:r1662_4 +# 1662| mu1662_7(unknown) = ^CallSideEffect : ~m? +# 1662| v1662_8(void) = ^IndirectReadSideEffect[-1] : &:r1662_4, ~m? +# 1662| mu1662_9(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1662_4 +# 1662| r1662_10(glval) = CopyValue : r1662_6 +# 1662| r1662_11(int &) = CopyValue : r1662_10 +# 1662| mu1662_12(int &&) = Store[rv] : &:r1662_1, r1662_11 +# 1663| r1663_1(int) = Constant[4] : +# 1663| r1663_2(glval) = VariableAddress[i] : +# 1663| r1663_3(int &&) = Load[i] : &:r1663_2, ~m? +# 1663| r1663_4(glval) = CopyValue : r1663_3 +# 1663| mu1663_5(int) = Store[?] : &:r1663_4, r1663_1 +# 1664| r1664_1(glval) = VariableAddress[ri] : +# 1664| r1664_2(glval) = VariableAddress[i] : +# 1664| r1664_3(int &&) = Load[i] : &:r1664_2, ~m? +# 1664| r1664_4(glval) = CopyValue : r1664_3 +# 1664| r1664_5(int &) = CopyValue : r1664_4 +# 1664| mu1664_6(int &) = Store[ri] : &:r1664_1, r1664_5 +# 1665| r1665_1(glval) = VariableAddress[v] : +# 1665| r1665_2(glval) = VariableAddress[i] : +# 1665| r1665_3(int &&) = Load[i] : &:r1665_2, ~m? +# 1665| r1665_4(int) = Load[?] : &:r1665_3, ~m? +# 1665| mu1665_5(int) = Store[v] : &:r1665_1, r1665_4 +# 1666| r1666_1(int) = Constant[5] : +# 1666| r1666_2(glval) = VariableAddress[r] : +# 1666| r1666_3(int &) = Load[r] : &:r1666_2, ~m? +# 1666| r1666_4(glval) = CopyValue : r1666_3 +# 1666| mu1666_5(int) = Store[?] : &:r1666_4, r1666_1 +# 1667| r1667_1(glval) = VariableAddress[rr] : +# 1667| r1667_2(glval) = VariableAddress[r] : +# 1667| r1667_3(int &) = Load[r] : &:r1667_2, ~m? +# 1667| r1667_4(glval) = CopyValue : r1667_3 +# 1667| r1667_5(int &) = CopyValue : r1667_4 +# 1667| mu1667_6(int &) = Store[rr] : &:r1667_1, r1667_5 +# 1668| r1668_1(glval) = VariableAddress[w] : +# 1668| r1668_2(glval) = VariableAddress[r] : +# 1668| r1668_3(int &) = Load[r] : &:r1668_2, ~m? +# 1668| r1668_4(int) = Load[?] : &:r1668_3, ~m? +# 1668| mu1668_5(int) = Store[w] : &:r1668_1, r1668_4 +# 1670| v1670_1(void) = NoOp : +# 1645| v1645_4(void) = ReturnVoid : +# 1645| v1645_5(void) = AliasedUse : ~m? +# 1645| v1645_6(void) = ExitFunction : + +# 1672| void array_structured_binding_non_ref_init() +# 1672| Block 0 +# 1672| v1672_1(void) = EnterFunction : +# 1672| mu1672_2(unknown) = AliasedDefinition : +# 1672| mu1672_3(unknown) = InitializeNonLocal : +# 1673| r1673_1(glval) = VariableAddress[xs] : +# 1673| mu1673_2(int[2]) = Uninitialized[xs] : &:r1673_1 +# 1673| r1673_3(int) = Constant[0] : +# 1673| r1673_4(glval) = PointerAdd[4] : r1673_1, r1673_3 +# 1673| r1673_5(int) = Constant[1] : +# 1673| mu1673_6(int) = Store[?] : &:r1673_4, r1673_5 +# 1673| r1673_7(int) = Constant[1] : +# 1673| r1673_8(glval) = PointerAdd[4] : r1673_1, r1673_7 +# 1673| r1673_9(int) = Constant[2] : +# 1673| mu1673_10(int) = Store[?] : &:r1673_8, r1673_9 +# 1674| r1674_1(glval) = VariableAddress[(unnamed local variable)] : +# 1674| r1674_2(glval) = VariableAddress[xs] : +# 1674| r1674_3(int[2]) = Load[xs] : &:r1674_2, ~m? +# 1674| mu1674_4(int[2]) = Store[(unnamed local variable)] : &:r1674_1, r1674_3 +# 1674| r1674_5(glval) = VariableAddress[x0] : +#-----| r0_1(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_2(int *) = Convert : r0_1 +#-----| r0_3(unsigned long) = Constant[0] : +#-----| r0_4(glval) = PointerAdd[4] : r0_2, r0_3 +#-----| mu0_5(int &) = Store[x0] : &:r1674_5, r0_4 +# 1674| r1674_6(glval) = VariableAddress[x1] : +#-----| r0_6(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_7(int *) = Convert : r0_6 +#-----| r0_8(unsigned long) = Constant[1] : +#-----| r0_9(glval) = PointerAdd[4] : r0_7, r0_8 +#-----| mu0_10(int &) = Store[x1] : &:r1674_6, r0_9 +# 1675| v1675_1(void) = NoOp : +# 1672| v1672_4(void) = ReturnVoid : +# 1672| v1672_5(void) = AliasedUse : ~m? +# 1672| v1672_6(void) = ExitFunction : + +# 1680| void CapturedLambdaMyObj::CapturedLambdaMyObj() +# 1680| Block 0 +# 1680| v1680_1(void) = EnterFunction : +# 1680| mu1680_2(unknown) = AliasedDefinition : +# 1680| mu1680_3(unknown) = InitializeNonLocal : +# 1680| r1680_4(glval) = VariableAddress[#this] : +# 1680| mu1680_5(glval) = InitializeParameter[#this] : &:r1680_4 +# 1680| r1680_6(glval) = Load[#this] : &:r1680_4, ~m? +# 1680| mu1680_7(CapturedLambdaMyObj) = InitializeIndirection[#this] : &:r1680_6 +# 1680| v1680_8(void) = NoOp : +# 1680| v1680_9(void) = ReturnIndirection[#this] : &:r1680_6, ~m? +# 1680| v1680_10(void) = ReturnVoid : +# 1680| v1680_11(void) = AliasedUse : ~m? +# 1680| v1680_12(void) = ExitFunction : + +# 1683| void captured_lambda(int, int&, int&&) +# 1683| Block 0 +# 1683| v1683_1(void) = EnterFunction : +# 1683| mu1683_2(unknown) = AliasedDefinition : +# 1683| mu1683_3(unknown) = InitializeNonLocal : +# 1683| r1683_4(glval) = VariableAddress[x] : +# 1683| mu1683_5(int) = InitializeParameter[x] : &:r1683_4 +# 1683| r1683_6(glval) = VariableAddress[y] : +# 1683| mu1683_7(int &) = InitializeParameter[y] : &:r1683_6 +# 1683| r1683_8(int &) = Load[y] : &:r1683_6, ~m? +# 1683| mu1683_9(unknown) = InitializeIndirection[y] : &:r1683_8 +# 1683| r1683_10(glval) = VariableAddress[z] : +# 1683| mu1683_11(int &&) = InitializeParameter[z] : &:r1683_10 +# 1683| r1683_12(int &&) = Load[z] : &:r1683_10, ~m? +# 1683| mu1683_13(unknown) = InitializeIndirection[z] : &:r1683_12 +# 1685| r1685_1(glval) = VariableAddress[obj1] : +# 1685| r1685_2(glval) = VariableAddress[#temp1685:24] : +# 1685| mu1685_3(CapturedLambdaMyObj) = Uninitialized[#temp1685:24] : &:r1685_2 +# 1685| r1685_4(glval) = FunctionAddress[CapturedLambdaMyObj] : +# 1685| v1685_5(void) = Call[CapturedLambdaMyObj] : func:r1685_4, this:r1685_2 +# 1685| mu1685_6(unknown) = ^CallSideEffect : ~m? +# 1685| mu1685_7(CapturedLambdaMyObj) = ^IndirectMayWriteSideEffect[-1] : &:r1685_2 +# 1685| r1685_8(glval) = Convert : r1685_2 +# 1685| r1685_9(CapturedLambdaMyObj &) = CopyValue : r1685_8 +# 1685| mu1685_10(CapturedLambdaMyObj &) = Store[obj1] : &:r1685_1, r1685_9 +# 1686| r1686_1(glval) = VariableAddress[obj2] : +# 1686| mu1686_2(CapturedLambdaMyObj) = Uninitialized[obj2] : &:r1686_1 +# 1686| r1686_3(glval) = FunctionAddress[CapturedLambdaMyObj] : +# 1686| v1686_4(void) = Call[CapturedLambdaMyObj] : func:r1686_3, this:r1686_1 +# 1686| mu1686_5(unknown) = ^CallSideEffect : ~m? +# 1686| mu1686_6(CapturedLambdaMyObj) = ^IndirectMayWriteSideEffect[-1] : &:r1686_1 +# 1688| r1688_1(glval) = VariableAddress[lambda_outer] : +# 1688| r1688_2(glval) = VariableAddress[#temp1688:24] : +# 1688| mu1688_3(decltype([...](...){...})) = Uninitialized[#temp1688:24] : &:r1688_2 +# 1688| r1688_4(glval) = FieldAddress[obj1] : r1688_2 +# 1688| r1688_5(glval) = VariableAddress[obj1] : +# 1688| r1688_6(CapturedLambdaMyObj &) = Load[obj1] : &:r1688_5, ~m? +#-----| r0_1(CapturedLambdaMyObj) = Load[?] : &:r1688_6, ~m? +#-----| mu0_2(CapturedLambdaMyObj) = Store[?] : &:r1688_4, r0_1 +# 1688| r1688_7(glval) = FieldAddress[obj2] : r1688_2 +# 1688| r1688_8(glval) = VariableAddress[obj2] : +# 1688| r1688_9(CapturedLambdaMyObj) = Load[obj2] : &:r1688_8, ~m? +# 1688| mu1688_10(CapturedLambdaMyObj) = Store[?] : &:r1688_7, r1688_9 +# 1688| r1688_11(glval) = FieldAddress[x] : r1688_2 +# 1688| r1688_12(glval) = VariableAddress[x] : +# 1688| r1688_13(int) = Load[x] : &:r1688_12, ~m? +# 1688| mu1688_14(int) = Store[?] : &:r1688_11, r1688_13 +# 1688| r1688_15(glval) = FieldAddress[y] : r1688_2 +# 1688| r1688_16(glval) = VariableAddress[y] : +# 1688| r1688_17(int &) = Load[y] : &:r1688_16, ~m? +# 1690| r1690_1(int) = Load[?] : &:r1688_17, ~m? +# 1690| mu1690_2(int) = Store[?] : &:r1688_15, r1690_1 +# 1688| r1688_18(glval) = FieldAddress[z] : r1688_2 +# 1688| r1688_19(glval) = VariableAddress[z] : +# 1688| r1688_20(int &&) = Load[z] : &:r1688_19, ~m? +# 1690| r1690_3(int) = Load[?] : &:r1688_20, ~m? +# 1690| mu1690_4(int) = Store[?] : &:r1688_18, r1690_3 +# 1688| r1688_21(decltype([...](...){...})) = Load[#temp1688:24] : &:r1688_2, ~m? +# 1688| mu1688_22(decltype([...](...){...})) = Store[lambda_outer] : &:r1688_1, r1688_21 +# 1691| v1691_1(void) = NoOp : +# 1683| v1683_14(void) = ReturnIndirection[y] : &:r1683_8, ~m? +# 1683| v1683_15(void) = ReturnIndirection[z] : &:r1683_12, ~m? +# 1683| v1683_16(void) = ReturnVoid : +# 1683| v1683_17(void) = AliasedUse : ~m? +# 1683| v1683_18(void) = ExitFunction : + +# 1688| void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const +# 1688| Block 0 +# 1688| v1688_1(void) = EnterFunction : +# 1688| mu1688_2(unknown) = AliasedDefinition : +# 1688| mu1688_3(unknown) = InitializeNonLocal : +# 1688| r1688_4(glval) = VariableAddress[#this] : +# 1688| mu1688_5(glval) = InitializeParameter[#this] : &:r1688_4 +# 1688| r1688_6(glval) = Load[#this] : &:r1688_4, ~m? +# 1688| mu1688_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_6 +# 1689| r1689_1(glval) = VariableAddress[lambda_inner] : +# 1689| r1689_2(glval) = VariableAddress[#temp1689:28] : +# 1689| mu1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2 +# 1689| r1689_4(glval) = FieldAddress[obj1] : r1689_2 +# 1689| r1689_5(glval) = VariableAddress[#this] : +# 1689| r1689_6(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_5, ~m? +# 1689| r1689_7(glval) = FieldAddress[obj1] : r1689_6 +# 1689| r1689_8(CapturedLambdaMyObj) = Load[?] : &:r1689_7, ~m? +# 1689| mu1689_9(CapturedLambdaMyObj) = Store[?] : &:r1689_4, r1689_8 +# 1689| r1689_10(glval) = FieldAddress[obj2] : r1689_2 +# 1689| r1689_11(glval) = VariableAddress[#this] : +# 1689| r1689_12(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_11, ~m? +# 1689| r1689_13(glval) = FieldAddress[obj2] : r1689_12 +# 1689| r1689_14(CapturedLambdaMyObj) = Load[?] : &:r1689_13, ~m? +# 1689| mu1689_15(CapturedLambdaMyObj) = Store[?] : &:r1689_10, r1689_14 +# 1689| r1689_16(glval) = FieldAddress[x] : r1689_2 +# 1689| r1689_17(glval) = VariableAddress[#this] : +# 1689| r1689_18(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_17, ~m? +# 1689| r1689_19(glval) = FieldAddress[x] : r1689_18 +# 1689| r1689_20(int) = Load[?] : &:r1689_19, ~m? +# 1689| mu1689_21(int) = Store[?] : &:r1689_16, r1689_20 +# 1689| r1689_22(glval) = FieldAddress[y] : r1689_2 +# 1689| r1689_23(glval) = VariableAddress[#this] : +# 1689| r1689_24(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_23, ~m? +# 1689| r1689_25(glval) = FieldAddress[y] : r1689_24 +# 1689| r1689_26(int) = Load[?] : &:r1689_25, ~m? +# 1689| mu1689_27(int) = Store[?] : &:r1689_22, r1689_26 +# 1689| r1689_28(glval) = FieldAddress[z] : r1689_2 +# 1689| r1689_29(glval) = VariableAddress[#this] : +# 1689| r1689_30(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_29, ~m? +# 1689| r1689_31(glval) = FieldAddress[z] : r1689_30 +# 1689| r1689_32(int) = Load[?] : &:r1689_31, ~m? +# 1689| mu1689_33(int) = Store[?] : &:r1689_28, r1689_32 +# 1689| r1689_34(decltype([...](...){...})) = Load[#temp1689:28] : &:r1689_2, ~m? +# 1689| mu1689_35(decltype([...](...){...})) = Store[lambda_inner] : &:r1689_1, r1689_34 +# 1690| v1690_1(void) = NoOp : +# 1688| v1688_8(void) = ReturnIndirection[#this] : &:r1688_6, ~m? +# 1688| v1688_9(void) = ReturnVoid : +# 1688| v1688_10(void) = AliasedUse : ~m? +# 1688| v1688_11(void) = ExitFunction : + +# 1689| void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::operator()() const +# 1689| Block 0 +# 1689| v1689_1(void) = EnterFunction : +# 1689| mu1689_2(unknown) = AliasedDefinition : +# 1689| mu1689_3(unknown) = InitializeNonLocal : +# 1689| r1689_4(glval) = VariableAddress[#this] : +# 1689| mu1689_5(glval) = InitializeParameter[#this] : &:r1689_4 +# 1689| r1689_6(glval) = Load[#this] : &:r1689_4, ~m? +# 1689| mu1689_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1689_6 +# 1689| v1689_8(void) = NoOp : +# 1689| v1689_9(void) = NoOp : +# 1689| v1689_10(void) = ReturnIndirection[#this] : &:r1689_6, ~m? +# 1689| v1689_11(void) = ReturnVoid : +# 1689| v1689_12(void) = AliasedUse : ~m? +# 1689| v1689_13(void) = ExitFunction : + +# 1693| int goto_on_same_line() +# 1693| Block 0 +# 1693| v1693_1(void) = EnterFunction : +# 1693| mu1693_2(unknown) = AliasedDefinition : +# 1693| mu1693_3(unknown) = InitializeNonLocal : +# 1694| r1694_1(glval) = VariableAddress[x] : +# 1694| r1694_2(int) = Constant[42] : +# 1694| mu1694_3(int) = Store[x] : &:r1694_1, r1694_2 +# 1695| v1695_1(void) = NoOp : +# 1695| v1695_2(void) = NoOp : +# 1696| r1696_1(glval) = VariableAddress[#return] : +# 1696| r1696_2(glval) = VariableAddress[x] : +# 1696| r1696_3(int) = Load[x] : &:r1696_2, ~m? +# 1696| mu1696_4(int) = Store[#return] : &:r1696_1, r1696_3 +# 1693| r1693_4(glval) = VariableAddress[#return] : +# 1693| v1693_5(void) = ReturnValue : &:r1693_4, ~m? +# 1693| v1693_6(void) = AliasedUse : ~m? +# 1693| v1693_7(void) = ExitFunction : + +# 1701| void TrivialLambdaClass::m() const +# 1701| Block 0 +# 1701| v1701_1(void) = EnterFunction : +# 1701| mu1701_2(unknown) = AliasedDefinition : +# 1701| mu1701_3(unknown) = InitializeNonLocal : +# 1701| r1701_4(glval) = VariableAddress[#this] : +# 1701| mu1701_5(glval) = InitializeParameter[#this] : &:r1701_4 +# 1701| r1701_6(glval) = Load[#this] : &:r1701_4, ~m? +# 1701| mu1701_7(TrivialLambdaClass) = InitializeIndirection[#this] : &:r1701_6 +# 1702| r1702_1(glval) = VariableAddress[l_m_outer] : +# 1702| r1702_2(glval) = VariableAddress[#temp1702:25] : +# 1702| mu1702_3(decltype([...](...){...})) = Uninitialized[#temp1702:25] : &:r1702_2 +# 1702| r1702_4(glval) = FieldAddress[(captured this)] : r1702_2 +# 1702| r1702_5(glval) = VariableAddress[#this] : +# 1702| r1702_6(TrivialLambdaClass *) = Load[#this] : &:r1702_5, ~m? +# 1702| r1702_7(TrivialLambdaClass) = Load[?] : &:r1702_6, ~m? +# 1702| mu1702_8(TrivialLambdaClass) = Store[?] : &:r1702_4, r1702_7 +# 1702| r1702_9(decltype([...](...){...})) = Load[#temp1702:25] : &:r1702_2, ~m? +# 1702| mu1702_10(decltype([...](...){...})) = Store[l_m_outer] : &:r1702_1, r1702_9 +# 1709| v1709_1(void) = NoOp : +# 1701| v1701_8(void) = ReturnIndirection[#this] : &:r1701_6, ~m? +# 1701| v1701_9(void) = ReturnVoid : +# 1701| v1701_10(void) = AliasedUse : ~m? +# 1701| v1701_11(void) = ExitFunction : + +# 1702| void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const +# 1702| Block 0 +# 1702| v1702_1(void) = EnterFunction : +# 1702| mu1702_2(unknown) = AliasedDefinition : +# 1702| mu1702_3(unknown) = InitializeNonLocal : +# 1702| r1702_4(glval) = VariableAddress[#this] : +# 1702| mu1702_5(glval) = InitializeParameter[#this] : &:r1702_4 +# 1702| r1702_6(glval) = Load[#this] : &:r1702_4, ~m? +# 1702| mu1702_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1702_6 +# 1703| r1703_1(glval) = VariableAddress[#this] : +# 1703| r1703_2(lambda [] type at line 1702, col. 26 *) = Load[#this] : &:r1703_1, ~m? +# 1703| r1703_3(glval) = FieldAddress[(captured this)] : r1703_2 +# 1703| r1703_4(TrivialLambdaClass *) = CopyValue : r1703_3 +# 1703| r1703_5(glval) = FunctionAddress[m] : +# 1703| v1703_6(void) = Call[m] : func:r1703_5, this:r1703_4 +# 1703| mu1703_7(unknown) = ^CallSideEffect : ~m? +# 1703| v1703_8(void) = ^IndirectReadSideEffect[-1] : &:r1703_4, ~m? +# 1705| r1705_1(glval) = VariableAddress[l_m_inner] : +# 1705| r1705_2(glval) = VariableAddress[#temp1705:29] : +# 1705| mu1705_3(decltype([...](...){...})) = Uninitialized[#temp1705:29] : &:r1705_2 +# 1705| r1705_4(glval) = FieldAddress[(captured this)] : r1705_2 +# 1705| r1705_5(glval) = VariableAddress[#this] : +# 1705| r1705_6(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1705_5, ~m? +# 1705| r1705_7(glval) = FieldAddress[(captured this)] : r1705_6 +# 1705| r1705_8(TrivialLambdaClass) = Load[?] : &:r1705_7, ~m? +# 1705| mu1705_9(TrivialLambdaClass) = Store[?] : &:r1705_4, r1705_8 +# 1705| r1705_10(decltype([...](...){...})) = Load[#temp1705:29] : &:r1705_2, ~m? +# 1705| mu1705_11(decltype([...](...){...})) = Store[l_m_inner] : &:r1705_1, r1705_10 +# 1708| v1708_1(void) = NoOp : +# 1702| v1702_8(void) = ReturnIndirection[#this] : &:r1702_6, ~m? +# 1702| v1702_9(void) = ReturnVoid : +# 1702| v1702_10(void) = AliasedUse : ~m? +# 1702| v1702_11(void) = ExitFunction : + +# 1705| void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const +# 1705| Block 0 +# 1705| v1705_1(void) = EnterFunction : +# 1705| mu1705_2(unknown) = AliasedDefinition : +# 1705| mu1705_3(unknown) = InitializeNonLocal : +# 1705| r1705_4(glval) = VariableAddress[#this] : +# 1705| mu1705_5(glval) = InitializeParameter[#this] : &:r1705_4 +# 1705| r1705_6(glval) = Load[#this] : &:r1705_4, ~m? +# 1705| mu1705_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1705_6 +# 1706| r1706_1(glval) = VariableAddress[#this] : +# 1706| r1706_2(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1706_1, ~m? +# 1706| r1706_3(glval) = FieldAddress[(captured this)] : r1706_2 +# 1706| r1706_4(TrivialLambdaClass *) = CopyValue : r1706_3 +# 1706| r1706_5(glval) = FunctionAddress[m] : +# 1706| v1706_6(void) = Call[m] : func:r1706_5, this:r1706_4 +# 1706| mu1706_7(unknown) = ^CallSideEffect : ~m? +# 1706| v1706_8(void) = ^IndirectReadSideEffect[-1] : &:r1706_4, ~m? +# 1707| v1707_1(void) = NoOp : +# 1705| v1705_8(void) = ReturnIndirection[#this] : &:r1705_6, ~m? +# 1705| v1705_9(void) = ReturnVoid : +# 1705| v1705_10(void) = AliasedUse : ~m? +# 1705| v1705_11(void) = ExitFunction : + +# 1712| void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) +# 1712| Block 0 +# 1712| v1712_1(void) = EnterFunction : +# 1712| mu1712_2(unknown) = AliasedDefinition : +# 1712| mu1712_3(unknown) = InitializeNonLocal : +# 1712| r1712_4(glval) = VariableAddress[p1] : +# 1712| mu1712_5(TrivialLambdaClass) = InitializeParameter[p1] : &:r1712_4 +# 1712| r1712_6(glval) = VariableAddress[p2] : +# 1712| mu1712_7(TrivialLambdaClass &) = InitializeParameter[p2] : &:r1712_6 +# 1712| r1712_8(TrivialLambdaClass &) = Load[p2] : &:r1712_6, ~m? +# 1712| mu1712_9(unknown) = InitializeIndirection[p2] : &:r1712_8 +# 1712| r1712_10(glval) = VariableAddress[p3] : +# 1712| mu1712_11(TrivialLambdaClass &&) = InitializeParameter[p3] : &:r1712_10 +# 1712| r1712_12(TrivialLambdaClass &&) = Load[p3] : &:r1712_10, ~m? +# 1712| mu1712_13(unknown) = InitializeIndirection[p3] : &:r1712_12 +# 1713| r1713_1(glval) = VariableAddress[l1] : +# 1713| mu1713_2(TrivialLambdaClass) = Uninitialized[l1] : &:r1713_1 +# 1714| r1714_1(glval) = VariableAddress[l2] : +# 1714| r1714_2(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_3(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_4(TrivialLambdaClass) = Constant[0] : +# 1714| mu1714_5(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_3, r1714_4 +# 1714| r1714_6(TrivialLambdaClass) = Load[#temp1714:36] : &:r1714_3, ~m? +# 1714| mu1714_7(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_2, r1714_6 +# 1714| r1714_8(glval) = Convert : r1714_2 +# 1714| r1714_9(TrivialLambdaClass &) = CopyValue : r1714_8 +# 1714| mu1714_10(TrivialLambdaClass &) = Store[l2] : &:r1714_1, r1714_9 +# 1716| r1716_1(glval) = VariableAddress[l_outer1] : +# 1716| r1716_2(glval) = VariableAddress[#temp1716:20] : +# 1716| mu1716_3(decltype([...](...){...})) = Uninitialized[#temp1716:20] : &:r1716_2 +# 1716| r1716_4(glval) = FieldAddress[p1] : r1716_2 +# 1716| r1716_5(glval) = VariableAddress[p1] : +# 1716| r1716_6(TrivialLambdaClass) = Load[p1] : &:r1716_5, ~m? +# 1716| mu1716_7(TrivialLambdaClass) = Store[?] : &:r1716_4, r1716_6 +# 1716| r1716_8(glval) = FieldAddress[p2] : r1716_2 +# 1716| r1716_9(glval) = VariableAddress[p2] : +# 1716| r1716_10(TrivialLambdaClass &) = Load[p2] : &:r1716_9, ~m? +#-----| r0_1(TrivialLambdaClass) = Load[?] : &:r1716_10, ~m? +#-----| mu0_2(TrivialLambdaClass) = Store[?] : &:r1716_8, r0_1 +# 1716| r1716_11(glval) = FieldAddress[p3] : r1716_2 +# 1716| r1716_12(glval) = VariableAddress[p3] : +# 1716| r1716_13(TrivialLambdaClass &&) = Load[p3] : &:r1716_12, ~m? +#-----| r0_3(TrivialLambdaClass) = Load[?] : &:r1716_13, ~m? +#-----| mu0_4(TrivialLambdaClass) = Store[?] : &:r1716_11, r0_3 +# 1716| r1716_14(glval) = FieldAddress[l1] : r1716_2 +# 1716| r1716_15(glval) = VariableAddress[l1] : +# 1716| r1716_16(TrivialLambdaClass) = Load[l1] : &:r1716_15, ~m? +# 1716| mu1716_17(TrivialLambdaClass) = Store[?] : &:r1716_14, r1716_16 +# 1716| r1716_18(glval) = FieldAddress[l2] : r1716_2 +# 1716| r1716_19(glval) = VariableAddress[l2] : +# 1716| r1716_20(TrivialLambdaClass &) = Load[l2] : &:r1716_19, ~m? +#-----| r0_5(TrivialLambdaClass) = Load[?] : &:r1716_20, ~m? +#-----| mu0_6(TrivialLambdaClass) = Store[?] : &:r1716_18, r0_5 +# 1716| r1716_21(decltype([...](...){...})) = Load[#temp1716:20] : &:r1716_2, ~m? +# 1716| mu1716_22(decltype([...](...){...})) = Store[l_outer1] : &:r1716_1, r1716_21 +# 1719| v1719_1(void) = NoOp : +# 1712| v1712_14(void) = ReturnIndirection[p2] : &:r1712_8, ~m? +# 1712| v1712_15(void) = ReturnIndirection[p3] : &:r1712_12, ~m? +# 1712| v1712_16(void) = ReturnVoid : +# 1712| v1712_17(void) = AliasedUse : ~m? +# 1712| v1712_18(void) = ExitFunction : + +# 1716| void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const +# 1716| Block 0 +# 1716| v1716_1(void) = EnterFunction : +# 1716| mu1716_2(unknown) = AliasedDefinition : +# 1716| mu1716_3(unknown) = InitializeNonLocal : +# 1716| r1716_4(glval) = VariableAddress[#this] : +# 1716| mu1716_5(glval) = InitializeParameter[#this] : &:r1716_4 +# 1716| r1716_6(glval) = Load[#this] : &:r1716_4, ~m? +# 1716| mu1716_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_6 +# 1717| r1717_1(glval) = VariableAddress[l_inner1] : +# 1717| r1717_2(glval) = VariableAddress[#temp1717:24] : +# 1717| mu1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2 +# 1717| r1717_4(glval) = FieldAddress[p1] : r1717_2 +# 1717| r1717_5(glval) = VariableAddress[#this] : +# 1717| r1717_6(lambda [] type at line 1717, col. 25 *) = Load[#this] : &:r1717_5, ~m? +# 1717| r1717_7(glval) = FieldAddress[p1] : r1717_6 +# 1717| r1717_8(TrivialLambdaClass) = Load[?] : &:r1717_7, ~m? +# 1717| mu1717_9(TrivialLambdaClass) = Store[?] : &:r1717_4, r1717_8 +# 1717| r1717_10(decltype([...](...){...})) = Load[#temp1717:24] : &:r1717_2, ~m? +# 1717| mu1717_11(decltype([...](...){...})) = Store[l_inner1] : &:r1717_1, r1717_10 +# 1718| v1718_1(void) = NoOp : +# 1716| v1716_8(void) = ReturnIndirection[#this] : &:r1716_6, ~m? +# 1716| v1716_9(void) = ReturnVoid : +# 1716| v1716_10(void) = AliasedUse : ~m? +# 1716| v1716_11(void) = ExitFunction : + +# 1717| void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const +# 1717| Block 0 +# 1717| v1717_1(void) = EnterFunction : +# 1717| mu1717_2(unknown) = AliasedDefinition : +# 1717| mu1717_3(unknown) = InitializeNonLocal : +# 1717| r1717_4(glval) = VariableAddress[#this] : +# 1717| mu1717_5(glval) = InitializeParameter[#this] : &:r1717_4 +# 1717| r1717_6(glval) = Load[#this] : &:r1717_4, ~m? +# 1717| mu1717_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1717_6 +# 1717| v1717_8(void) = NoOp : +# 1717| v1717_9(void) = ReturnIndirection[#this] : &:r1717_6, ~m? +# 1717| v1717_10(void) = ReturnVoid : +# 1717| v1717_11(void) = AliasedUse : ~m? +# 1717| v1717_12(void) = ExitFunction : + +# 1724| void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass() +# 1724| Block 0 +# 1724| v1724_1(void) = EnterFunction : +# 1724| mu1724_2(unknown) = AliasedDefinition : +# 1724| mu1724_3(unknown) = InitializeNonLocal : +# 1724| r1724_4(glval) = VariableAddress[#this] : +# 1724| mu1724_5(glval) = InitializeParameter[#this] : &:r1724_4 +# 1724| r1724_6(glval) = Load[#this] : &:r1724_4, ~m? +# 1724| mu1724_7(CopyConstructorWithImplicitArgumentClass) = InitializeIndirection[#this] : &:r1724_6 +# 1724| v1724_8(void) = NoOp : +# 1724| v1724_9(void) = ReturnIndirection[#this] : &:r1724_6, ~m? +# 1724| v1724_10(void) = ReturnVoid : +# 1724| v1724_11(void) = AliasedUse : ~m? +# 1724| v1724_12(void) = ExitFunction : + +# 1725| void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass(CopyConstructorWithImplicitArgumentClass const&) +# 1725| Block 0 +# 1725| v1725_1(void) = EnterFunction : +# 1725| mu1725_2(unknown) = AliasedDefinition : +# 1725| mu1725_3(unknown) = InitializeNonLocal : +# 1725| r1725_4(glval) = VariableAddress[#this] : +# 1725| mu1725_5(glval) = InitializeParameter[#this] : &:r1725_4 +# 1725| r1725_6(glval) = Load[#this] : &:r1725_4, ~m? +# 1725| mu1725_7(CopyConstructorWithImplicitArgumentClass) = InitializeIndirection[#this] : &:r1725_6 +# 1725| r1725_8(glval) = VariableAddress[c] : +# 1725| mu1725_9(CopyConstructorWithImplicitArgumentClass &) = InitializeParameter[c] : &:r1725_8 +# 1725| r1725_10(CopyConstructorWithImplicitArgumentClass &) = Load[c] : &:r1725_8, ~m? +# 1725| mu1725_11(unknown) = InitializeIndirection[c] : &:r1725_10 +# 1726| r1726_1(glval) = VariableAddress[c] : +# 1726| r1726_2(CopyConstructorWithImplicitArgumentClass &) = Load[c] : &:r1726_1, ~m? +# 1726| r1726_3(glval) = CopyValue : r1726_2 +# 1726| r1726_4(glval) = FieldAddress[x] : r1726_3 +# 1726| r1726_5(int) = Load[?] : &:r1726_4, ~m? +# 1726| r1726_6(glval) = VariableAddress[#this] : +# 1726| r1726_7(CopyConstructorWithImplicitArgumentClass *) = Load[#this] : &:r1726_6, ~m? +# 1726| r1726_8(glval) = FieldAddress[x] : r1726_7 +# 1726| mu1726_9(int) = Store[?] : &:r1726_8, r1726_5 +# 1727| v1727_1(void) = NoOp : +# 1725| v1725_12(void) = ReturnIndirection[#this] : &:r1725_6, ~m? +# 1725| v1725_13(void) = ReturnIndirection[c] : &:r1725_10, ~m? +# 1725| v1725_14(void) = ReturnVoid : +# 1725| v1725_15(void) = AliasedUse : ~m? +# 1725| v1725_16(void) = ExitFunction : + +# 1733| void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass() +# 1733| Block 0 +# 1733| v1733_1(void) = EnterFunction : +# 1733| mu1733_2(unknown) = AliasedDefinition : +# 1733| mu1733_3(unknown) = InitializeNonLocal : +# 1733| r1733_4(glval) = VariableAddress[#this] : +# 1733| mu1733_5(glval) = InitializeParameter[#this] : &:r1733_4 +# 1733| r1733_6(glval) = Load[#this] : &:r1733_4, ~m? +# 1733| mu1733_7(CopyConstructorWithBitwiseCopyClass) = InitializeIndirection[#this] : &:r1733_6 +# 1733| v1733_8(void) = NoOp : +# 1733| v1733_9(void) = ReturnIndirection[#this] : &:r1733_6, ~m? +# 1733| v1733_10(void) = ReturnVoid : +# 1733| v1733_11(void) = AliasedUse : ~m? +# 1733| v1733_12(void) = ExitFunction : + +# 1736| void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass(CopyConstructorTestNonVirtualClass const&) +# 1736| Block 0 +# 1736| v1736_1(void) = EnterFunction : +# 1736| mu1736_2(unknown) = AliasedDefinition : +# 1736| mu1736_3(unknown) = InitializeNonLocal : +# 1736| r1736_4(glval) = VariableAddress[#this] : +# 1736| mu1736_5(glval) = InitializeParameter[#this] : &:r1736_4 +# 1736| r1736_6(glval) = Load[#this] : &:r1736_4, ~m? +# 1736| mu1736_7(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1736_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(CopyConstructorTestNonVirtualClass &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(CopyConstructorTestNonVirtualClass &) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1736| r1736_8(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1736_5 +# 1736| r1736_9(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1736| r1736_10(glval) = VariableAddress[(unnamed parameter 0)] : +# 1736| r1736_11(CopyConstructorTestNonVirtualClass &) = Load[(unnamed parameter 0)] : &:r1736_10, ~m? +# 1736| r1736_12(glval) = CopyValue : r1736_11 +# 1736| r1736_13(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : r1736_12 +# 1736| r1736_14(CopyConstructorWithImplicitArgumentClass &) = CopyValue : r1736_13 +# 1736| v1736_15(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1736_9, this:r1736_8, 0:r1736_14 +# 1736| mu1736_16(unknown) = ^CallSideEffect : ~m? +# 1736| v1736_17(void) = ^BufferReadSideEffect[0] : &:r1736_14, ~m? +# 1736| mu1736_18(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1736_8 +# 1736| v1736_19(void) = NoOp : +# 1736| v1736_20(void) = ReturnIndirection[#this] : &:r1736_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 1736| v1736_21(void) = ReturnVoid : +# 1736| v1736_22(void) = AliasedUse : ~m? +# 1736| v1736_23(void) = ExitFunction : + +# 1740| void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass() +# 1740| Block 0 +# 1740| v1740_1(void) = EnterFunction : +# 1740| mu1740_2(unknown) = AliasedDefinition : +# 1740| mu1740_3(unknown) = InitializeNonLocal : +# 1740| r1740_4(glval) = VariableAddress[#this] : +# 1740| mu1740_5(glval) = InitializeParameter[#this] : &:r1740_4 +# 1740| r1740_6(glval) = Load[#this] : &:r1740_4, ~m? +# 1740| mu1740_7(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1740_6 +# 1740| r1740_8(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1740_5 +# 1740| r1740_9(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1740| v1740_10(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1740_9, this:r1740_8 +# 1740| mu1740_11(unknown) = ^CallSideEffect : ~m? +# 1740| mu1740_12(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1740_8 +# 1740| r1740_13(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithBitwiseCopyClass] : mu1740_5 +# 1740| r1740_14(glval) = FunctionAddress[CopyConstructorWithBitwiseCopyClass] : +# 1740| v1740_15(void) = Call[CopyConstructorWithBitwiseCopyClass] : func:r1740_14, this:r1740_13 +# 1740| mu1740_16(unknown) = ^CallSideEffect : ~m? +# 1740| mu1740_17(CopyConstructorWithBitwiseCopyClass) = ^IndirectMayWriteSideEffect[-1] : &:r1740_13 +# 1740| v1740_18(void) = NoOp : +# 1740| v1740_19(void) = ReturnIndirection[#this] : &:r1740_6, ~m? +# 1740| v1740_20(void) = ReturnVoid : +# 1740| v1740_21(void) = AliasedUse : ~m? +# 1740| v1740_22(void) = ExitFunction : + +# 1743| void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass(CopyConstructorTestVirtualClass const&) +# 1743| Block 0 +# 1743| v1743_1(void) = EnterFunction : +# 1743| mu1743_2(unknown) = AliasedDefinition : +# 1743| mu1743_3(unknown) = InitializeNonLocal : +# 1743| r1743_4(glval) = VariableAddress[#this] : +# 1743| mu1743_5(glval) = InitializeParameter[#this] : &:r1743_4 +# 1743| r1743_6(glval) = Load[#this] : &:r1743_4, ~m? +# 1743| mu1743_7(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1743_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(CopyConstructorTestVirtualClass &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(CopyConstructorTestVirtualClass &) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1743| r1743_8(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1743_5 +# 1743| r1743_9(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1743| r1743_10(glval) = VariableAddress[(unnamed parameter 0)] : +# 1743| r1743_11(CopyConstructorTestVirtualClass &) = Load[(unnamed parameter 0)] : &:r1743_10, ~m? +# 1743| r1743_12(glval) = CopyValue : r1743_11 +# 1743| r1743_13(glval) = ConvertToVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : r1743_12 +# 1743| r1743_14(CopyConstructorWithImplicitArgumentClass &) = CopyValue : r1743_13 +# 1743| v1743_15(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1743_9, this:r1743_8, 0:r1743_14 +# 1743| mu1743_16(unknown) = ^CallSideEffect : ~m? +# 1743| v1743_17(void) = ^BufferReadSideEffect[0] : &:r1743_14, ~m? +# 1743| mu1743_18(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1743_8 +# 1743| v1743_19(void) = NoOp : +# 1743| v1743_20(void) = ReturnIndirection[#this] : &:r1743_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 1743| v1743_21(void) = ReturnVoid : +# 1743| v1743_22(void) = AliasedUse : ~m? +# 1743| v1743_23(void) = ExitFunction : + +# 1747| void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass() +# 1747| Block 0 +# 1747| v1747_1(void) = EnterFunction : +# 1747| mu1747_2(unknown) = AliasedDefinition : +# 1747| mu1747_3(unknown) = InitializeNonLocal : +# 1747| r1747_4(glval) = VariableAddress[#this] : +# 1747| mu1747_5(glval) = InitializeParameter[#this] : &:r1747_4 +# 1747| r1747_6(glval) = Load[#this] : &:r1747_4, ~m? +# 1747| mu1747_7(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1747_6 +# 1747| r1747_8(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1747_5 +# 1747| r1747_9(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1747| v1747_10(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1747_9, this:r1747_8 +# 1747| mu1747_11(unknown) = ^CallSideEffect : ~m? +# 1747| mu1747_12(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1747_8 +# 1747| r1747_13(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithBitwiseCopyClass] : mu1747_5 +# 1747| r1747_14(glval) = FunctionAddress[CopyConstructorWithBitwiseCopyClass] : +# 1747| v1747_15(void) = Call[CopyConstructorWithBitwiseCopyClass] : func:r1747_14, this:r1747_13 +# 1747| mu1747_16(unknown) = ^CallSideEffect : ~m? +# 1747| mu1747_17(CopyConstructorWithBitwiseCopyClass) = ^IndirectMayWriteSideEffect[-1] : &:r1747_13 +# 1747| v1747_18(void) = NoOp : +# 1747| v1747_19(void) = ReturnIndirection[#this] : &:r1747_6, ~m? +# 1747| v1747_20(void) = ReturnVoid : +# 1747| v1747_21(void) = AliasedUse : ~m? +# 1747| v1747_22(void) = ExitFunction : + +# 1750| int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) +# 1750| Block 0 +# 1750| v1750_1(void) = EnterFunction : +# 1750| mu1750_2(unknown) = AliasedDefinition : +# 1750| mu1750_3(unknown) = InitializeNonLocal : +# 1751| r1751_1(glval) = VariableAddress[x] : +# 1751| mu1751_2(CopyConstructorTestNonVirtualClass &) = InitializeParameter[x] : &:r1751_1 +# 1751| r1751_3(CopyConstructorTestNonVirtualClass &) = Load[x] : &:r1751_1, ~m? +# 1751| mu1751_4(unknown) = InitializeIndirection[x] : &:r1751_3 +# 1752| r1752_1(glval) = VariableAddress[y] : +# 1752| mu1752_2(CopyConstructorTestVirtualClass &) = InitializeParameter[y] : &:r1752_1 +# 1752| r1752_3(CopyConstructorTestVirtualClass &) = Load[y] : &:r1752_1, ~m? +# 1752| mu1752_4(unknown) = InitializeIndirection[y] : &:r1752_3 +# 1753| r1753_1(glval) = VariableAddress[cx] : +# 1753| mu1753_2(CopyConstructorTestNonVirtualClass) = Uninitialized[cx] : &:r1753_1 +# 1753| r1753_3(glval) = FunctionAddress[CopyConstructorTestNonVirtualClass] : +# 1753| r1753_4(glval) = VariableAddress[x] : +# 1753| r1753_5(CopyConstructorTestNonVirtualClass &) = Load[x] : &:r1753_4, ~m? +# 1753| r1753_6(glval) = CopyValue : r1753_5 +# 1753| r1753_7(CopyConstructorTestNonVirtualClass &) = CopyValue : r1753_6 +# 1753| v1753_8(void) = Call[CopyConstructorTestNonVirtualClass] : func:r1753_3, this:r1753_1, 0:r1753_7 +# 1753| mu1753_9(unknown) = ^CallSideEffect : ~m? +# 1753| v1753_10(void) = ^BufferReadSideEffect[0] : &:r1753_7, ~m? +# 1753| mu1753_11(CopyConstructorTestNonVirtualClass) = ^IndirectMayWriteSideEffect[-1] : &:r1753_1 +# 1754| r1754_1(glval) = VariableAddress[cy] : +# 1754| mu1754_2(CopyConstructorTestVirtualClass) = Uninitialized[cy] : &:r1754_1 +# 1754| r1754_3(glval) = FunctionAddress[CopyConstructorTestVirtualClass] : +# 1754| r1754_4(glval) = VariableAddress[y] : +# 1754| r1754_5(CopyConstructorTestVirtualClass &) = Load[y] : &:r1754_4, ~m? +# 1754| r1754_6(glval) = CopyValue : r1754_5 +# 1754| r1754_7(CopyConstructorTestVirtualClass &) = CopyValue : r1754_6 +# 1754| v1754_8(void) = Call[CopyConstructorTestVirtualClass] : func:r1754_3, this:r1754_1, 0:r1754_7 +# 1754| mu1754_9(unknown) = ^CallSideEffect : ~m? +# 1754| v1754_10(void) = ^BufferReadSideEffect[0] : &:r1754_7, ~m? +# 1754| mu1754_11(CopyConstructorTestVirtualClass) = ^IndirectMayWriteSideEffect[-1] : &:r1754_1 +# 1755| v1755_1(void) = Unreached : + +# 1751| Block 1 +# 1751| v1751_5(void) = ReturnIndirection[x] : &:r1751_3, ~m? +# 1752| v1752_5(void) = ReturnIndirection[y] : &:r1752_3, ~m? +# 1750| r1750_4(glval) = VariableAddress[#return] : +# 1750| v1750_5(void) = ReturnValue : &:r1750_4, ~m? +# 1750| v1750_6(void) = AliasedUse : ~m? +# 1750| v1750_7(void) = ExitFunction : + +# 1757| void if_initialization(int) +# 1757| Block 0 +# 1757| v1757_1(void) = EnterFunction : +# 1757| mu1757_2(unknown) = AliasedDefinition : +# 1757| mu1757_3(unknown) = InitializeNonLocal : +# 1757| r1757_4(glval) = VariableAddress[x] : +# 1757| mu1757_5(int) = InitializeParameter[x] : &:r1757_4 +# 1758| r1758_1(glval) = VariableAddress[y] : +# 1758| r1758_2(glval) = VariableAddress[x] : +# 1758| r1758_3(int) = Load[x] : &:r1758_2, ~m? +# 1758| mu1758_4(int) = Store[y] : &:r1758_1, r1758_3 +# 1758| r1758_5(glval) = VariableAddress[x] : +# 1758| r1758_6(int) = Load[x] : &:r1758_5, ~m? +# 1758| r1758_7(int) = Constant[1] : +# 1758| r1758_8(int) = Add : r1758_6, r1758_7 +# 1758| r1758_9(int) = Constant[0] : +# 1758| r1758_10(bool) = CompareNE : r1758_8, r1758_9 +# 1758| v1758_11(void) = ConditionalBranch : r1758_10 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 1759| Block 1 +# 1759| r1759_1(glval) = VariableAddress[x] : +# 1759| r1759_2(int) = Load[x] : &:r1759_1, ~m? +# 1759| r1759_3(glval) = VariableAddress[y] : +# 1759| r1759_4(int) = Load[y] : &:r1759_3, ~m? +# 1759| r1759_5(int) = Add : r1759_2, r1759_4 +# 1759| r1759_6(glval) = VariableAddress[x] : +# 1759| mu1759_7(int) = Store[x] : &:r1759_6, r1759_5 +#-----| Goto -> Block 2 + +# 1762| Block 2 +# 1762| r1762_1(glval) = VariableAddress[w] : +# 1762| mu1762_2(int) = Uninitialized[w] : &:r1762_1 +# 1763| r1763_1(glval) = VariableAddress[x] : +# 1763| r1763_2(int) = Load[x] : &:r1763_1, ~m? +# 1763| r1763_3(glval) = VariableAddress[w] : +# 1763| mu1763_4(int) = Store[w] : &:r1763_3, r1763_2 +# 1763| r1763_5(glval) = VariableAddress[x] : +# 1763| r1763_6(int) = Load[x] : &:r1763_5, ~m? +# 1763| r1763_7(int) = Constant[1] : +# 1763| r1763_8(int) = Add : r1763_6, r1763_7 +# 1763| r1763_9(int) = Constant[0] : +# 1763| r1763_10(bool) = CompareNE : r1763_8, r1763_9 +# 1763| v1763_11(void) = ConditionalBranch : r1763_10 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 1764| Block 3 +# 1764| r1764_1(glval) = VariableAddress[x] : +# 1764| r1764_2(int) = Load[x] : &:r1764_1, ~m? +# 1764| r1764_3(glval) = VariableAddress[w] : +# 1764| r1764_4(int) = Load[w] : &:r1764_3, ~m? +# 1764| r1764_5(int) = Add : r1764_2, r1764_4 +# 1764| r1764_6(glval) = VariableAddress[x] : +# 1764| mu1764_7(int) = Store[x] : &:r1764_6, r1764_5 +#-----| Goto -> Block 4 + +# 1767| Block 4 +# 1767| r1767_1(glval) = VariableAddress[x] : +# 1767| r1767_2(int) = Load[x] : &:r1767_1, ~m? +# 1767| r1767_3(glval) = VariableAddress[w] : +# 1767| mu1767_4(int) = Store[w] : &:r1767_3, r1767_2 +# 1767| r1767_5(glval) = VariableAddress[w2] : +# 1767| r1767_6(glval) = VariableAddress[w] : +# 1767| r1767_7(int) = Load[w] : &:r1767_6, ~m? +# 1767| mu1767_8(int) = Store[w2] : &:r1767_5, r1767_7 +# 1767| r1767_9(glval) = VariableAddress[w2] : +# 1767| r1767_10(int) = Load[w2] : &:r1767_9, ~m? +# 1767| r1767_11(int) = Constant[0] : +# 1767| r1767_12(bool) = CompareNE : r1767_10, r1767_11 +# 1767| r1767_13(bool) = CopyValue : r1767_12 +# 1767| v1767_14(void) = ConditionalBranch : r1767_13 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 1768| Block 5 +# 1768| r1768_1(glval) = VariableAddress[x] : +# 1768| r1768_2(int) = Load[x] : &:r1768_1, ~m? +# 1768| r1768_3(glval) = VariableAddress[w] : +# 1768| r1768_4(int) = Load[w] : &:r1768_3, ~m? +# 1768| r1768_5(int) = Add : r1768_2, r1768_4 +# 1768| r1768_6(glval) = VariableAddress[x] : +# 1768| mu1768_7(int) = Store[x] : &:r1768_6, r1768_5 +#-----| Goto -> Block 6 + +# 1771| Block 6 +# 1771| r1771_1(glval) = VariableAddress[v] : +# 1771| r1771_2(glval) = VariableAddress[x] : +# 1771| r1771_3(int) = Load[x] : &:r1771_2, ~m? +# 1771| mu1771_4(int) = Store[v] : &:r1771_1, r1771_3 +# 1771| r1771_5(glval) = VariableAddress[v2] : +# 1771| r1771_6(glval) = VariableAddress[v] : +# 1771| r1771_7(int) = Load[v] : &:r1771_6, ~m? +# 1771| mu1771_8(int) = Store[v2] : &:r1771_5, r1771_7 +# 1771| r1771_9(glval) = VariableAddress[v2] : +# 1771| r1771_10(int) = Load[v2] : &:r1771_9, ~m? +# 1771| r1771_11(int) = Constant[0] : +# 1771| r1771_12(bool) = CompareNE : r1771_10, r1771_11 +# 1771| r1771_13(bool) = CopyValue : r1771_12 +# 1771| v1771_14(void) = ConditionalBranch : r1771_13 +#-----| False -> Block 8 +#-----| True -> Block 7 + +# 1772| Block 7 +# 1772| r1772_1(glval) = VariableAddress[x] : +# 1772| r1772_2(int) = Load[x] : &:r1772_1, ~m? +# 1772| r1772_3(glval) = VariableAddress[v] : +# 1772| r1772_4(int) = Load[v] : &:r1772_3, ~m? +# 1772| r1772_5(int) = Add : r1772_2, r1772_4 +# 1772| r1772_6(glval) = VariableAddress[x] : +# 1772| mu1772_7(int) = Store[x] : &:r1772_6, r1772_5 +#-----| Goto -> Block 8 + +# 1775| Block 8 +# 1775| r1775_1(glval) = VariableAddress[z] : +# 1775| r1775_2(glval) = VariableAddress[x] : +# 1775| r1775_3(int) = Load[x] : &:r1775_2, ~m? +# 1775| mu1775_4(int) = Store[z] : &:r1775_1, r1775_3 +# 1776| r1776_1(glval) = VariableAddress[z] : +# 1776| r1776_2(int) = Load[z] : &:r1776_1, ~m? +# 1776| r1776_3(int) = Constant[0] : +# 1776| r1776_4(bool) = CompareNE : r1776_2, r1776_3 +# 1776| v1776_5(void) = ConditionalBranch : r1776_4 +#-----| False -> Block 10 +#-----| True -> Block 9 + +# 1777| Block 9 +# 1777| r1777_1(glval) = VariableAddress[x] : +# 1777| r1777_2(int) = Load[x] : &:r1777_1, ~m? +# 1777| r1777_3(glval) = VariableAddress[z] : +# 1777| r1777_4(int) = Load[z] : &:r1777_3, ~m? +# 1777| r1777_5(int) = Add : r1777_2, r1777_4 +# 1777| r1777_6(glval) = VariableAddress[x] : +# 1777| mu1777_7(int) = Store[x] : &:r1777_6, r1777_5 +#-----| Goto -> Block 10 + +# 1780| Block 10 +# 1780| r1780_1(glval) = VariableAddress[z2] : +# 1780| r1780_2(glval) = VariableAddress[z] : +# 1780| r1780_3(int) = Load[z] : &:r1780_2, ~m? +# 1780| mu1780_4(int) = Store[z2] : &:r1780_1, r1780_3 +# 1780| r1780_5(glval) = VariableAddress[z2] : +# 1780| r1780_6(int) = Load[z2] : &:r1780_5, ~m? +# 1780| r1780_7(int) = Constant[0] : +# 1780| r1780_8(bool) = CompareNE : r1780_6, r1780_7 +# 1780| r1780_9(bool) = CopyValue : r1780_8 +# 1780| v1780_10(void) = ConditionalBranch : r1780_9 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 1781| Block 11 +# 1781| r1781_1(glval) = VariableAddress[z2] : +# 1781| r1781_2(int) = Load[z2] : &:r1781_1, ~m? +# 1781| r1781_3(glval) = VariableAddress[x] : +# 1781| r1781_4(int) = Load[x] : &:r1781_3, ~m? +# 1781| r1781_5(int) = Add : r1781_4, r1781_2 +# 1781| mu1781_6(int) = Store[x] : &:r1781_3, r1781_5 +#-----| Goto -> Block 12 + +# 1783| Block 12 +# 1783| v1783_1(void) = NoOp : +# 1757| v1757_6(void) = ReturnVoid : +# 1757| v1757_7(void) = AliasedUse : ~m? +# 1757| v1757_8(void) = ExitFunction : + +# 1785| void switch_initialization(int) +# 1785| Block 0 +# 1785| v1785_1(void) = EnterFunction : +# 1785| mu1785_2(unknown) = AliasedDefinition : +# 1785| mu1785_3(unknown) = InitializeNonLocal : +# 1785| r1785_4(glval) = VariableAddress[x] : +# 1785| mu1785_5(int) = InitializeParameter[x] : &:r1785_4 +# 1786| r1786_1(glval) = VariableAddress[y] : +# 1786| r1786_2(glval) = VariableAddress[x] : +# 1786| r1786_3(int) = Load[x] : &:r1786_2, ~m? +# 1786| mu1786_4(int) = Store[y] : &:r1786_1, r1786_3 +# 1786| r1786_5(glval) = VariableAddress[x] : +# 1786| r1786_6(int) = Load[x] : &:r1786_5, ~m? +# 1786| r1786_7(int) = Constant[1] : +# 1786| r1786_8(int) = Add : r1786_6, r1786_7 +# 1786| v1786_9(void) = Switch : r1786_8 +#-----| Default -> Block 1 + +# 1787| Block 1 +# 1787| v1787_1(void) = NoOp : +# 1788| r1788_1(glval) = VariableAddress[x] : +# 1788| r1788_2(int) = Load[x] : &:r1788_1, ~m? +# 1788| r1788_3(glval) = VariableAddress[y] : +# 1788| r1788_4(int) = Load[y] : &:r1788_3, ~m? +# 1788| r1788_5(int) = Add : r1788_2, r1788_4 +# 1788| r1788_6(glval) = VariableAddress[x] : +# 1788| mu1788_7(int) = Store[x] : &:r1788_6, r1788_5 +# 1791| r1791_1(glval) = VariableAddress[w] : +# 1791| mu1791_2(int) = Uninitialized[w] : &:r1791_1 +# 1792| r1792_1(glval) = VariableAddress[x] : +# 1792| r1792_2(int) = Load[x] : &:r1792_1, ~m? +# 1792| r1792_3(glval) = VariableAddress[w] : +# 1792| mu1792_4(int) = Store[w] : &:r1792_3, r1792_2 +# 1792| r1792_5(glval) = VariableAddress[x] : +# 1792| r1792_6(int) = Load[x] : &:r1792_5, ~m? +# 1792| r1792_7(int) = Constant[1] : +# 1792| r1792_8(int) = Add : r1792_6, r1792_7 +# 1792| v1792_9(void) = Switch : r1792_8 +#-----| Default -> Block 2 + +# 1793| Block 2 +# 1793| v1793_1(void) = NoOp : +# 1794| r1794_1(glval) = VariableAddress[x] : +# 1794| r1794_2(int) = Load[x] : &:r1794_1, ~m? +# 1794| r1794_3(glval) = VariableAddress[w] : +# 1794| r1794_4(int) = Load[w] : &:r1794_3, ~m? +# 1794| r1794_5(int) = Add : r1794_2, r1794_4 +# 1794| r1794_6(glval) = VariableAddress[x] : +# 1794| mu1794_7(int) = Store[x] : &:r1794_6, r1794_5 +# 1797| r1797_1(glval) = VariableAddress[x] : +# 1797| r1797_2(int) = Load[x] : &:r1797_1, ~m? +# 1797| r1797_3(glval) = VariableAddress[w] : +# 1797| mu1797_4(int) = Store[w] : &:r1797_3, r1797_2 +# 1797| r1797_5(glval) = VariableAddress[w2] : +# 1797| r1797_6(glval) = VariableAddress[w] : +# 1797| r1797_7(int) = Load[w] : &:r1797_6, ~m? +# 1797| mu1797_8(int) = Store[w2] : &:r1797_5, r1797_7 +# 1797| r1797_9(glval) = VariableAddress[w2] : +# 1797| r1797_10(int) = Load[w2] : &:r1797_9, ~m? +# 1797| r1797_11(int) = CopyValue : r1797_10 +# 1797| v1797_12(void) = Switch : r1797_11 +#-----| Default -> Block 3 + +# 1798| Block 3 +# 1798| v1798_1(void) = NoOp : +# 1799| r1799_1(glval) = VariableAddress[x] : +# 1799| r1799_2(int) = Load[x] : &:r1799_1, ~m? +# 1799| r1799_3(glval) = VariableAddress[w] : +# 1799| r1799_4(int) = Load[w] : &:r1799_3, ~m? +# 1799| r1799_5(int) = Add : r1799_2, r1799_4 +# 1799| r1799_6(glval) = VariableAddress[x] : +# 1799| mu1799_7(int) = Store[x] : &:r1799_6, r1799_5 +# 1802| r1802_1(glval) = VariableAddress[v] : +# 1802| r1802_2(glval) = VariableAddress[x] : +# 1802| r1802_3(int) = Load[x] : &:r1802_2, ~m? +# 1802| mu1802_4(int) = Store[v] : &:r1802_1, r1802_3 +# 1802| r1802_5(glval) = VariableAddress[v2] : +# 1802| r1802_6(glval) = VariableAddress[v] : +# 1802| r1802_7(int) = Load[v] : &:r1802_6, ~m? +# 1802| mu1802_8(int) = Store[v2] : &:r1802_5, r1802_7 +# 1802| r1802_9(glval) = VariableAddress[v2] : +# 1802| r1802_10(int) = Load[v2] : &:r1802_9, ~m? +# 1802| r1802_11(int) = CopyValue : r1802_10 +# 1802| v1802_12(void) = Switch : r1802_11 +#-----| Default -> Block 4 + +# 1803| Block 4 +# 1803| v1803_1(void) = NoOp : +# 1804| r1804_1(glval) = VariableAddress[x] : +# 1804| r1804_2(int) = Load[x] : &:r1804_1, ~m? +# 1804| r1804_3(glval) = VariableAddress[v] : +# 1804| r1804_4(int) = Load[v] : &:r1804_3, ~m? +# 1804| r1804_5(int) = Add : r1804_2, r1804_4 +# 1804| r1804_6(glval) = VariableAddress[x] : +# 1804| mu1804_7(int) = Store[x] : &:r1804_6, r1804_5 +# 1807| r1807_1(glval) = VariableAddress[z] : +# 1807| r1807_2(glval) = VariableAddress[x] : +# 1807| r1807_3(int) = Load[x] : &:r1807_2, ~m? +# 1807| mu1807_4(int) = Store[z] : &:r1807_1, r1807_3 +# 1808| r1808_1(glval) = VariableAddress[z] : +# 1808| r1808_2(int) = Load[z] : &:r1808_1, ~m? +# 1808| v1808_3(void) = Switch : r1808_2 +#-----| Default -> Block 5 + +# 1809| Block 5 +# 1809| v1809_1(void) = NoOp : +# 1810| r1810_1(glval) = VariableAddress[x] : +# 1810| r1810_2(int) = Load[x] : &:r1810_1, ~m? +# 1810| r1810_3(glval) = VariableAddress[z] : +# 1810| r1810_4(int) = Load[z] : &:r1810_3, ~m? +# 1810| r1810_5(int) = Add : r1810_2, r1810_4 +# 1810| r1810_6(glval) = VariableAddress[x] : +# 1810| mu1810_7(int) = Store[x] : &:r1810_6, r1810_5 +# 1813| r1813_1(glval) = VariableAddress[z2] : +# 1813| r1813_2(glval) = VariableAddress[z] : +# 1813| r1813_3(int) = Load[z] : &:r1813_2, ~m? +# 1813| mu1813_4(int) = Store[z2] : &:r1813_1, r1813_3 +# 1813| r1813_5(glval) = VariableAddress[z2] : +# 1813| r1813_6(int) = Load[z2] : &:r1813_5, ~m? +# 1813| r1813_7(int) = CopyValue : r1813_6 +# 1813| v1813_8(void) = Switch : r1813_7 +#-----| Default -> Block 6 + +# 1814| Block 6 +# 1814| v1814_1(void) = NoOp : +# 1815| r1815_1(glval) = VariableAddress[z2] : +# 1815| r1815_2(int) = Load[z2] : &:r1815_1, ~m? +# 1815| r1815_3(glval) = VariableAddress[x] : +# 1815| r1815_4(int) = Load[x] : &:r1815_3, ~m? +# 1815| r1815_5(int) = Add : r1815_4, r1815_2 +# 1815| mu1815_6(int) = Store[x] : &:r1815_3, r1815_5 +# 1817| v1817_1(void) = NoOp : +# 1785| v1785_6(void) = ReturnVoid : +# 1785| v1785_7(void) = AliasedUse : ~m? +# 1785| v1785_8(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/python/ql/test/experimental/dataflow/coverage/dataflowTest.expected b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected similarity index 100% rename from python/ql/test/experimental/dataflow/coverage/dataflowTest.expected rename to cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected diff --git a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql new file mode 100644 index 00000000000..794dbed9628 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.ql @@ -0,0 +1,30 @@ +import cpp +import experimental.semmle.code.cpp.semantic.analysis.ModulusAnalysis +import experimental.semmle.code.cpp.semantic.Semantic +import semmle.code.cpp.ir.IR as IR +import TestUtilities.InlineExpectationsTest + +class ModulusAnalysisTest extends InlineExpectationsTest { + ModulusAnalysisTest() { this = "ModulusAnalysisTest" } + + override string getARelevantTag() { result = "mod" } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(SemExpr e, IR::CallInstruction call | + call.getArgument(0) = e and + call.getStaticCallTarget().hasName("mod") and + tag = "mod" and + element = e.toString() and + location = e.getLocation() and + value = getAModString(e) + ) + } +} + +private string getAModString(SemExpr e) { + exists(SemBound b, int delta, int mod | + semExprModulus(e, b, delta, mod) and + result = b.toString() + "," + delta.toString() + "," + mod.toString() and + not (delta = 0 and mod = 0) + ) +} diff --git a/cpp/ql/test/library-tests/ir/modulus-analysis/test.cpp b/cpp/ql/test/library-tests/ir/modulus-analysis/test.cpp new file mode 100644 index 00000000000..dfdb90ee690 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/modulus-analysis/test.cpp @@ -0,0 +1,60 @@ +template void mod(T value); + +const int c1 = 42; +const int c2 = 43; + +void m(int i, bool cond, int x, int y) { + int eq = i + 3; + + int mul = eq * c1 + 3; // congruent 3 mod 42 + + int seven = 7; + if (mul % c2 == seven) { + mod(mul); // congruent 3 mod 42, 7 mod 43 + } + + int j = cond + ? i * 4 + 3 + : i * 8 + 7; + mod(j); // $ mod=0,3,4 + + if (x % c1 == 3 && y % c1 == 7) { + // Need implies_v2 + mod(x + y); // $ MISSING: 0,10,42 + } + + if (x % c1 == 3 && y % c1 == 7) { + // Need implies_v2 + mod(x - y); // $ MISSING: mod=0,38,42 + } + + if (cond) { + j = i * 4 + 3; + } + else { + j = i * 8 + 7; + } + mod(j); // $ mod=0,3,4 + + if (cond) { + mod(j); // $ mod=0,3,4 + } else { + mod(j); // $ mod=0,3,4 + } + + if ((x & 15) == 3) { + mod(x); // $ mod=0,3,16 + } +} + +void loops(int cap) +{ + for (int i = 0; i < cap; i++) + mod(i); + + for (int j = 0; j < cap; j += 1) + mod(j); + + for (int k = 0; k < cap; k += 3) + mod(k); // $ mod=0,0,3 +} diff --git a/cpp/ql/test/library-tests/ir/points_to/points_to.ql b/cpp/ql/test/library-tests/ir/points_to/points_to.ql index b639a235ee8..6cc7b7efb34 100644 --- a/cpp/ql/test/library-tests/ir/points_to/points_to.ql +++ b/cpp/ql/test/library-tests/ir/points_to/points_to.ql @@ -40,7 +40,7 @@ module Raw { } } -module UnaliasedSSA { +module UnaliasedSsa { private import semmle.code.cpp.ir.implementation.unaliased_ssa.IR private import semmle.code.cpp.ir.implementation.aliased_ssa.internal.AliasedSSA @@ -49,8 +49,8 @@ module UnaliasedSSA { result = getOperandMemoryLocation(instr.getAnOperand()) } - class UnaliasedSSAPointsToTest extends InlineExpectationsTest { - UnaliasedSSAPointsToTest() { this = "UnaliasedSSAPointsToTest" } + class UnaliasedSsaPointsToTest extends InlineExpectationsTest { + UnaliasedSsaPointsToTest() { this = "UnaliasedSSAPointsToTest" } override string getARelevantTag() { result = "ussa" } diff --git a/python/ql/test/experimental/dataflow/match/dataflowTest.expected b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected similarity index 100% rename from python/ql/test/experimental/dataflow/match/dataflowTest.expected rename to cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected diff --git a/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.ql b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.ql new file mode 100644 index 00000000000..d93abe6d504 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.ql @@ -0,0 +1,51 @@ +import cpp +import experimental.semmle.code.cpp.semantic.analysis.RangeAnalysis +import experimental.semmle.code.cpp.semantic.Semantic +import semmle.code.cpp.ir.IR as IR +import TestUtilities.InlineExpectationsTest + +class RangeAnalysisTest extends InlineExpectationsTest { + RangeAnalysisTest() { this = "RangeAnalysisTest" } + + override string getARelevantTag() { result = "range" } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(SemExpr e, IR::CallInstruction call | + call.getArgument(0) = e and + call.getStaticCallTarget().hasName("range") and + tag = "range" and + element = e.toString() and + location = e.getLocation() and + value = getARangeString(e) + ) + } +} + +private string getDirectionString(boolean d) { + result = "<=" and d = true + or + result = ">=" and d = false +} + +bindingset[value] +private string getOffsetString(int value) { + if value >= 0 then result = "+" + value.toString() else result = value.toString() +} + +bindingset[delta] +private string getBoundString(SemBound b, int delta) { + b instanceof SemZeroBound and result = delta.toString() + or + result = + strictconcat(b.(SemSsaBound).getAVariable().(IR::Instruction).getAst().toString(), ":") + + getOffsetString(delta) +} + +private string getARangeString(SemExpr e) { + exists(SemBound b, int delta, boolean upper | + semBounded(e, b, delta, upper, _) and + if semBounded(e, b, delta, upper.booleanNot(), _) + then delta != 0 and result = "==" + getBoundString(b, delta) + else result = getDirectionString(upper) + getBoundString(b, delta) + ) +} diff --git a/cpp/ql/test/library-tests/ir/range-analysis/test.cpp b/cpp/ql/test/library-tests/ir/range-analysis/test.cpp new file mode 100644 index 00000000000..2c819885b13 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/range-analysis/test.cpp @@ -0,0 +1,51 @@ +template void range(T value); + int f1(int x, int y) { + if (x < 500) { + if (x > 400) { + range(x); // $ range=>=401 range=<=499 + return x; + } + + if (y - 2 == x && y > 300) { + range(x + y); // $ range=>=300 range=>=x+1 range=>=y-1 + return x + y; + } + + if (x != y + 1) { + range(x); // $ range=<=400 + int sum = x + y; + } else { + if (y > 300) { + range(x); // $ range=>=302 range=<=400 range===y+1 + range(y); // $ range=>=301 range=<=399 range===x-1 + int sum = x + y; + } + } + + if (x > 500) { + range(x); // $ range=<=400 range=>=501 + return x; + } + } + + return 0; + } + + int f2(int x, int y, int z) { + if (x < 500) { + if (x > 400) { + range(x); // $ range=>=401 range=<=499 + return x; + } + + if (y == x - 1 && y > 300 && y + 2 == z && z == 350) { + range(x); // $ range===349 range===y+1 range===z-1 + range(y); // $ range===348 range===x-1 range===z-2 + range(z); // $ range===350 range===x+1 range===y+2 + return x + y + z; + } + } + + return 0; + } + diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql new file mode 100644 index 00000000000..c41ed2cb200 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.ql @@ -0,0 +1,24 @@ +import cpp +import experimental.semmle.code.cpp.semantic.analysis.SignAnalysisCommon +import experimental.semmle.code.cpp.semantic.Semantic +import semmle.code.cpp.ir.IR as IR +import TestUtilities.InlineExpectationsTest + +class SignAnalysisTest extends InlineExpectationsTest { + SignAnalysisTest() { this = "SignAnalysisTest" } + + override string getARelevantTag() { result = "sign" } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(SemExpr e, IR::CallInstruction call | + call.getArgument(0) = e and + call.getStaticCallTarget().hasName("sign") and + tag = "sign" and + element = e.toString() and + location = e.getLocation() and + value = getASignString(e) + ) + } +} + +private string getASignString(SemExpr e) { result = strictconcat(semExprSign(e).toString(), "") } diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/test.cpp b/cpp/ql/test/library-tests/ir/sign-analysis/test.cpp new file mode 100644 index 00000000000..9d4136490ea --- /dev/null +++ b/cpp/ql/test/library-tests/ir/sign-analysis/test.cpp @@ -0,0 +1,57 @@ +template T sign(T value); + +int f1(int x, int y) { + if (x < 0) { + return sign(x); // $ sign=- + } + if (x < y) { + return sign(y); // $ sign=+ + } + + return 0; +} + +void u(int x) { + unsigned c = (unsigned)x; + sign(c); // $ sign=+0 +} + +void constants() { + int i_pos = 1234; + sign(i_pos); // $ sign=+ + int i_neg = -1234; + sign(i_neg); // $ sign=- + int i_zero = 0; + sign(i_zero); // $ sign=0 + long l_pos = 1234; + sign(l_pos); // $ sign=+ + long l_neg = -1234; + sign(l_neg); // $ sign=- + long l_zero = 0; + sign(l_zero); // $ sign=0 + long l_pos_big = 0x00000001baadf00d; + sign(l_pos_big); // $ sign=+ + float f_pos = 1.234f; + sign(f_pos); // $ sign=+ + float f_neg = -1.234f; + sign(f_neg); // $ sign=- + float f_zero = 0.0f; + sign(f_zero); // $ sign=0 +} + +void arithmetic(int y) { + int x = 0; + sign(x + 1); // $ sign=+ + x = -1; + sign(x); // $ sign=- + sign(x + 1); // $ sign=+-0 // Ideally 0 because it's constant + if (y < 0) { + sign(y); // $ sign=- + sign(y + 1); // $ sign=+-0 // Ideally -0 because it's only adding one. + int z = y; + sign(++z); // $ sign=+-0 // Ideally -0 because it's only adding one. + z = y; + sign(z++); // $ sign=- + sign(z); // $ sign=+-0 // Ideally -0 because it's only adding one. + } +} diff --git a/cpp/ql/test/library-tests/lambdas/captures/elements.expected b/cpp/ql/test/library-tests/lambdas/captures/elements.expected index d292f86c0fd..a0077dacec9 100644 --- a/cpp/ql/test/library-tests/lambdas/captures/elements.expected +++ b/cpp/ql/test/library-tests/lambdas/captures/elements.expected @@ -122,11 +122,13 @@ | captures.cpp:22:18:24:3 | initializer for myLambda | | captures.cpp:22:18:24:3 | y | | captures.cpp:22:18:24:3 | {...} | +| captures.cpp:22:19:22:19 | (reference dereference) | +| captures.cpp:22:19:22:19 | (reference dereference) | | captures.cpp:22:19:22:19 | (unnamed constructor) | | captures.cpp:22:19:22:19 | (unnamed constructor) | | captures.cpp:22:19:22:19 | (unnamed constructor) | -| captures.cpp:22:19:22:19 | Unknown literal | -| captures.cpp:22:19:22:19 | Unknown literal | +| captures.cpp:22:19:22:19 | (unnamed parameter 0) | +| captures.cpp:22:19:22:19 | (unnamed parameter 0) | | captures.cpp:22:19:22:19 | constructor init of field x | | captures.cpp:22:19:22:19 | constructor init of field y | | captures.cpp:22:19:22:19 | declaration of (unnamed constructor) | @@ -135,6 +137,8 @@ | captures.cpp:22:19:22:19 | definition of operator= | | captures.cpp:22:19:22:19 | operator= | | captures.cpp:22:19:22:19 | return ... | +| captures.cpp:22:19:22:19 | x | +| captures.cpp:22:19:22:19 | y | | captures.cpp:22:19:22:19 | { ... } | | captures.cpp:22:23:22:23 | definition of x | | captures.cpp:22:23:22:23 | x | @@ -152,10 +156,10 @@ | captures.cpp:23:12:23:16 | x | | captures.cpp:23:12:23:16 | y | | captures.cpp:23:12:23:20 | ... + ... | -| captures.cpp:23:16:23:16 | (reference dereference) | | captures.cpp:23:16:23:16 | definition of y | | captures.cpp:23:16:23:16 | y | | captures.cpp:23:16:23:16 | y | +| captures.cpp:23:18:23:18 | (reference dereference) | | captures.cpp:23:20:23:20 | z | | captures.cpp:26:3:26:24 | return ... | | captures.cpp:26:10:26:17 | (const lambda [] type at line 22, col. 19)... | @@ -182,15 +186,17 @@ | end_pos.cpp:9:14:11:5 | [...](...){...} | | end_pos.cpp:9:14:11:5 | initializer for fp | | end_pos.cpp:9:14:11:5 | {...} | +| end_pos.cpp:9:15:9:15 | (reference dereference) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) | -| end_pos.cpp:9:15:9:15 | Unknown literal | +| end_pos.cpp:9:15:9:15 | (unnamed parameter 0) | | end_pos.cpp:9:15:9:15 | constructor init of field ii | | end_pos.cpp:9:15:9:15 | declaration of (unnamed constructor) | | end_pos.cpp:9:15:9:15 | definition of (unnamed constructor) | | end_pos.cpp:9:15:9:15 | definition of (unnamed constructor) | | end_pos.cpp:9:15:9:15 | definition of operator= | +| end_pos.cpp:9:15:9:15 | ii | | end_pos.cpp:9:15:9:15 | operator= | | end_pos.cpp:9:15:9:15 | return ... | | end_pos.cpp:9:15:9:15 | { ... } | diff --git a/cpp/ql/test/library-tests/sideEffects/stmts/stmts.expected b/cpp/ql/test/library-tests/sideEffects/stmts/stmts.expected index be1a1a7d973..8e8d4c4b1a5 100644 --- a/cpp/ql/test/library-tests/sideEffects/stmts/stmts.expected +++ b/cpp/ql/test/library-tests/sideEffects/stmts/stmts.expected @@ -2,6 +2,7 @@ | stmts.c:3:5:3:10 | declaration | true | true | | stmts.c:4:5:4:18 | declaration | true | true | | stmts.c:5:5:5:16 | declaration | false | true | +| stmts.c:7:5:7:5 | { ... } | true | true | | stmts.c:7:5:14:5 | switch (...) ... | true | true | | stmts.c:7:15:14:5 | { ... } | true | true | | stmts.c:8:9:8:15 | case ...: | true | true | diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/assign.expected b/cpp/ql/test/library-tests/special_members/generated_copy/assign.expected index eec36e7e39c..28c90cb5233 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/assign.expected +++ b/cpp/ql/test/library-tests/special_members/generated_copy/assign.expected @@ -11,6 +11,7 @@ | difference::Base | can | does NOT | have implicit copy assignment | | difference::OnlyAssign | can | does | have implicit copy assignment | | difference::OnlyCtor | can NOT | does NOT | have implicit copy assignment | +| instantiated_explicit_ctor::Wrapper | can | does | have implicit copy assignment | | moves::MoveAssign | can NOT | does NOT | have implicit copy assignment | | moves::MoveCtor | can NOT | does NOT | have implicit copy assignment | | private_cc::C | can | does NOT | have implicit copy assignment | diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/copy.cpp b/cpp/ql/test/library-tests/special_members/generated_copy/copy.cpp index 8d68cfdc09e..fac52670bca 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/copy.cpp +++ b/cpp/ql/test/library-tests/special_members/generated_copy/copy.cpp @@ -131,3 +131,21 @@ namespace difference { class OnlyAssign : Base { }; } + +namespace instantiated_explicit_ctor { + template + class Wrapper { + public: + Wrapper(Wrapper &other) { + m_t = other.m_t; + } + + Wrapper() { + m_t = 0; + } + private: + T m_t; + }; + + Wrapper wrapped_int; +} diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/ctor.expected b/cpp/ql/test/library-tests/special_members/generated_copy/ctor.expected index 22745978bf8..90a3f811e5d 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/ctor.expected +++ b/cpp/ql/test/library-tests/special_members/generated_copy/ctor.expected @@ -11,6 +11,7 @@ | difference::Base | can | does NOT | have implicit copy constructor | | difference::OnlyAssign | can NOT | does NOT | have implicit copy constructor | | difference::OnlyCtor | can | does | have implicit copy constructor | +| instantiated_explicit_ctor::Wrapper | can | does NOT | have implicit copy constructor | | moves::MoveAssign | can NOT | does NOT | have implicit copy constructor | | moves::MoveCtor | can NOT | does NOT | have implicit copy constructor | | private_cc::C | can | does NOT | have implicit copy constructor | diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected index 22282641b37..434b950e35c 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected +++ b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected @@ -86,5 +86,9 @@ | copy.cpp:131:9:131:9 | OnlyAssign | deleted | | | copy.cpp:131:9:131:9 | operator= | | | | copy.cpp:131:9:131:9 | operator= | | | +| copy.cpp:137:9:137:9 | operator= | | | +| copy.cpp:139:5:139:11 | Wrapper | | | +| copy.cpp:143:5:143:5 | Wrapper | | | +| copy.cpp:143:5:143:11 | Wrapper | | | | file://:0:0:0:0 | operator= | | | | file://:0:0:0:0 | operator= | | | diff --git a/cpp/ql/test/library-tests/stmt_expr/cfg.ql b/cpp/ql/test/library-tests/stmt_expr/cfg.ql index b6699eaee11..772ee7d3888 100644 --- a/cpp/ql/test/library-tests/stmt_expr/cfg.ql +++ b/cpp/ql/test/library-tests/stmt_expr/cfg.ql @@ -1,5 +1,4 @@ import cpp -import semmle.code.cpp.exprs.ObjectiveC from ControlFlowNode x, ControlFlowNode y, string entryPoint where diff --git a/cpp/ql/test/library-tests/string_analysis/StringAnalysis.ql b/cpp/ql/test/library-tests/string_analysis/StringAnalysis.ql index eda9acae5d9..a529b9f7952 100644 --- a/cpp/ql/test/library-tests/string_analysis/StringAnalysis.ql +++ b/cpp/ql/test/library-tests/string_analysis/StringAnalysis.ql @@ -5,7 +5,7 @@ import cpp -from AnalysedString s, string str +from AnalyzedString s, string str where if s.(StringLiteral).getUnspecifiedType().(DerivedType).getBaseType() instanceof Wchar_t then str = "[?]" diff --git a/cpp/ql/test/library-tests/switch/blocks.expected b/cpp/ql/test/library-tests/switch/blocks.expected index 9e08264d0f7..53ee2582d68 100644 --- a/cpp/ql/test/library-tests/switch/blocks.expected +++ b/cpp/ql/test/library-tests/switch/blocks.expected @@ -1,12 +1,9 @@ -| switch.c:2:5:2:5 | f | switch.c:2:14:12:1 | { ... } | switch.c:3:5:10:5 | switch (...) ... | -| switch.c:2:5:2:5 | f | switch.c:2:14:12:1 | { ... } | switch.c:10:5:10:5 | label ...: | +| switch.c:2:5:2:5 | f | switch.c:2:14:12:1 | { ... } | switch.c:3:5:3:5 | { ... } | | switch.c:2:5:2:5 | f | switch.c:2:14:12:1 | { ... } | switch.c:11:5:11:13 | return ... | | switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:15:2:15:7 | declaration | -| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:17:5:26:5 | switch (...) ... | -| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:26:5:26:5 | label ...: | +| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:17:5:17:5 | { ... } | | switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:28:5:29:5 | switch (...) ... | -| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:31:5:44:2 | switch (...) ... | -| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:44:2:44:2 | label ...: | +| switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:31:5:31:5 | { ... } | | switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:46:2:51:2 | switch (...) ... | | switch.c:14:6:14:6 | g | switch.c:14:15:52:1 | { ... } | switch.c:52:1:52:1 | return ... | | switch.cpp:4:5:4:5 | f | switch.cpp:4:14:9:1 | { ... } | switch.cpp:5:5:8:5 | switch (...) ... | diff --git a/cpp/ql/test/library-tests/switch_cfg/cfg.expected b/cpp/ql/test/library-tests/switch_cfg/cfg.expected index 9406983a0ce..bd70096b395 100644 --- a/cpp/ql/test/library-tests/switch_cfg/cfg.expected +++ b/cpp/ql/test/library-tests/switch_cfg/cfg.expected @@ -1,87 +1,89 @@ -| 10 | 1 | { ... } | 12 switch (...) ... | -| 10 | 43 | f | | -| 12 | 2 | switch (...) ... | 12 cond | -| 12 | 3 | cond | 12 { ... } | -| 12 | 4 | { ... } | 13 case ...: | -| 12 | 4 | { ... } | 16 case ...: | -| 12 | 4 | { ... } | 18 case ...: | -| 12 | 4 | { ... } | 21 case ...: | -| 12 | 4 | { ... } | 22 case ...: | -| 12 | 4 | { ... } | 24 case ...: | -| 12 | 4 | { ... } | 25 default: | -| 12 | 4 | { ... } | 26 case ...: | -| 12 | 4 | { ... } | 28 case ...: | +| 10 | 1 | { ... } | 12 { ... } | +| 10 | 44 | f | | +| 12 | 2 | { ... } | 12 switch (...) ... | +| 12 | 3 | switch (...) ... | 12 cond | +| 12 | 4 | cond | 12 { ... } | +| 12 | 5 | { ... } | 13 case ...: | +| 12 | 5 | { ... } | 16 case ...: | +| 12 | 5 | { ... } | 18 case ...: | +| 12 | 5 | { ... } | 21 case ...: | +| 12 | 5 | { ... } | 22 case ...: | +| 12 | 5 | { ... } | 24 case ...: | +| 12 | 5 | { ... } | 25 default: | +| 12 | 5 | { ... } | 26 case ...: | +| 12 | 5 | { ... } | 28 case ...: | | 13 | 1 | 1 | | -| 13 | 5 | case ...: | 14 ExprStmt | -| 14 | 6 | ExprStmt | 14 111 | -| 14 | 7 | 111 | 14 x | -| 14 | 8 | x | 14 ... = ... | -| 14 | 9 | ... = ... | 15 break; | -| 15 | 10 | break; | 31 label ...: | +| 13 | 6 | case ...: | 14 ExprStmt | +| 14 | 7 | ExprStmt | 14 111 | +| 14 | 8 | 111 | 14 x | +| 14 | 9 | x | 14 ... = ... | +| 14 | 10 | ... = ... | 15 break; | +| 15 | 11 | break; | 31 label ...: | | 16 | 1 | 1 | | | 16 | 1 | 2 | | | 16 | 1 | ... + ... | | -| 16 | 5 | case ...: | 17 ExprStmt | -| 17 | 6 | ExprStmt | 17 333 | -| 17 | 7 | 333 | 17 x | -| 17 | 8 | x | 17 ... = ... | -| 17 | 9 | ... = ... | 18 case ...: | +| 16 | 6 | case ...: | 17 ExprStmt | +| 17 | 7 | ExprStmt | 17 333 | +| 17 | 8 | 333 | 17 x | +| 17 | 9 | x | 17 ... = ... | +| 17 | 10 | ... = ... | 18 case ...: | | 18 | 1 | 4 | | -| 18 | 10 | case ...: | 19 ExprStmt | -| 19 | 11 | ExprStmt | 19 444 | -| 19 | 12 | 444 | 19 x | -| 19 | 13 | x | 19 ... = ... | -| 19 | 14 | ... = ... | 20 break; | -| 20 | 15 | break; | 31 label ...: | +| 18 | 11 | case ...: | 19 ExprStmt | +| 19 | 12 | ExprStmt | 19 444 | +| 19 | 13 | 444 | 19 x | +| 19 | 14 | x | 19 ... = ... | +| 19 | 15 | ... = ... | 20 break; | +| 20 | 16 | break; | 31 label ...: | | 21 | 1 | 5 | | -| 21 | 5 | case ...: | 22 case ...: | +| 21 | 6 | case ...: | 22 case ...: | | 22 | 1 | 6 | | -| 22 | 6 | case ...: | 23 ExprStmt | -| 23 | 7 | ExprStmt | 23 777 | -| 23 | 8 | 777 | 23 x | -| 23 | 9 | x | 23 ... = ... | -| 23 | 10 | ... = ... | 24 case ...: | +| 22 | 7 | case ...: | 23 ExprStmt | +| 23 | 8 | ExprStmt | 23 777 | +| 23 | 9 | 777 | 23 x | +| 23 | 10 | x | 23 ... = ... | +| 23 | 11 | ... = ... | 24 case ...: | | 24 | 1 | 7 | | -| 24 | 11 | case ...: | 25 default: | -| 25 | 12 | default: | 26 case ...: | +| 24 | 12 | case ...: | 25 default: | +| 25 | 13 | default: | 26 case ...: | | 26 | 1 | 8 | | -| 26 | 13 | case ...: | 27 ExprStmt | -| 27 | 14 | ExprStmt | 27 888 | -| 27 | 15 | 888 | 27 x | -| 27 | 16 | x | 27 ... = ... | -| 27 | 17 | ... = ... | 28 case ...: | +| 26 | 14 | case ...: | 27 ExprStmt | +| 27 | 15 | ExprStmt | 27 888 | +| 27 | 16 | 888 | 27 x | +| 27 | 17 | x | 27 ... = ... | +| 27 | 18 | ... = ... | 28 case ...: | | 28 | 1 | 9 | | -| 28 | 18 | case ...: | 29 ExprStmt | -| 29 | 19 | ExprStmt | 29 999 | -| 29 | 20 | 999 | 29 x | -| 29 | 21 | x | 29 ... = ... | -| 29 | 22 | ... = ... | 30 break; | -| 30 | 23 | break; | 31 label ...: | -| 31 | 41 | label ...: | 33 return ... | -| 33 | 42 | return ... | 10 f | -| 36 | 1 | { ... } | 38 switch (...) ... | -| 36 | 22 | g | | -| 38 | 2 | switch (...) ... | 38 cond | -| 38 | 3 | cond | 38 { ... } | -| 38 | 4 | { ... } | 39 case ...: | -| 38 | 4 | { ... } | 42 case ...: | -| 38 | 4 | { ... } | 45 label ...: | +| 28 | 19 | case ...: | 29 ExprStmt | +| 29 | 20 | ExprStmt | 29 999 | +| 29 | 21 | 999 | 29 x | +| 29 | 22 | x | 29 ... = ... | +| 29 | 23 | ... = ... | 30 break; | +| 30 | 24 | break; | 31 label ...: | +| 31 | 42 | label ...: | 33 return ... | +| 33 | 43 | return ... | 10 f | +| 36 | 1 | { ... } | 38 { ... } | +| 36 | 23 | g | | +| 38 | 2 | { ... } | 38 switch (...) ... | +| 38 | 3 | switch (...) ... | 38 cond | +| 38 | 4 | cond | 38 { ... } | +| 38 | 5 | { ... } | 39 case ...: | +| 38 | 5 | { ... } | 42 case ...: | +| 38 | 5 | { ... } | 45 label ...: | | 39 | 1 | 1 | | -| 39 | 5 | case ...: | 40 ExprStmt | -| 40 | 6 | ExprStmt | 40 111 | -| 40 | 7 | 111 | 40 x | -| 40 | 8 | x | 40 ... = ... | -| 40 | 9 | ... = ... | 41 break; | -| 41 | 10 | break; | 45 label ...: | +| 39 | 6 | case ...: | 40 ExprStmt | +| 40 | 7 | ExprStmt | 40 111 | +| 40 | 8 | 111 | 40 x | +| 40 | 9 | x | 40 ... = ... | +| 40 | 10 | ... = ... | 41 break; | +| 41 | 11 | break; | 45 label ...: | | 42 | 1 | 2 | | -| 42 | 5 | case ...: | 43 ExprStmt | -| 43 | 6 | ExprStmt | 43 222 | -| 43 | 7 | 222 | 43 x | -| 43 | 8 | x | 43 ... = ... | -| 43 | 9 | ... = ... | 45 label ...: | -| 45 | 16 | label ...: | 46 ExprStmt | -| 46 | 17 | ExprStmt | 46 999 | -| 46 | 18 | 999 | 46 x | -| 46 | 19 | x | 46 ... = ... | -| 46 | 20 | ... = ... | 48 return ... | -| 48 | 21 | return ... | 36 g | +| 42 | 6 | case ...: | 43 ExprStmt | +| 43 | 7 | ExprStmt | 43 222 | +| 43 | 8 | 222 | 43 x | +| 43 | 9 | x | 43 ... = ... | +| 43 | 10 | ... = ... | 45 label ...: | +| 45 | 17 | label ...: | 46 ExprStmt | +| 46 | 18 | ExprStmt | 46 999 | +| 46 | 19 | 999 | 46 x | +| 46 | 20 | x | 46 ... = ... | +| 46 | 21 | ... = ... | 48 return ... | +| 48 | 22 | return ... | 36 g | diff --git a/cpp/ql/test/library-tests/syntax-zoo/builtin.c b/cpp/ql/test/library-tests/syntax-zoo/builtin.c index 9811baafe9a..3677ac541f3 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/builtin.c +++ b/cpp/ql/test/library-tests/syntax-zoo/builtin.c @@ -1,4 +1,4 @@ -// semmle-extractor-options: --clang +// semmle-extractor-options: --clang --edg --clang_version --edg 30500 #define vector(elcount, type) __attribute__((vector_size((elcount)*sizeof(type)))) type 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 5da25abb88a..3cd449300e5 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected @@ -123,3 +123,4 @@ postWithInFlow | 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/library-tests/syntax-zoo/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected index 0f642e95d57..e37a676565c 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected @@ -1498,6 +1498,8 @@ postWithInFlow | bad_asts.cpp:15:10:15:12 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | bad_asts.cpp:16:5:16:5 | s [post update] | PostUpdateNode should not be the target of local flow. | | bad_asts.cpp:16:5:16:5 | s [post update] | PostUpdateNode should not be the target of local flow. | +| bad_asts.cpp:19:10:19:10 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| bad_asts.cpp:19:10:19:10 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | bad_asts.cpp:27:11:27:11 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | break_labels.c:3:9:3:14 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | break_labels.c:5:9:5:14 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | @@ -1626,11 +1628,15 @@ postWithInFlow | cpp11.cpp:60:15:60:16 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:65:10:65:16 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:65:19:65:45 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| cpp11.cpp:65:20:65:20 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:65:35:65:43 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:77:19:77:21 | Argument this [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:77:19:77:21 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:11:82:14 | Argument this [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:11:82:14 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. | +| cpp11.cpp:82:17:82:17 | Argument this [post update] | PostUpdateNode should not be the target of local flow. | +| cpp11.cpp:82:17:82:17 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | +| cpp11.cpp:82:17:82:17 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:17:82:55 | Argument this [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:17:82:55 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:17:82:55 | FieldAddress [post update] | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp index 625258906db..0228e790f2c 100644 --- a/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp +++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp @@ -1,4 +1,4 @@ -// semmle-extractor-options: --edg --trap_container=folder --edg --trap-compression=none + template int addToSelf() { return i + i; }; diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp index 1baabe3ca30..bc83e52850f 100644 --- a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp +++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp @@ -1,4 +1,4 @@ -// semmle-extractor-options: --edg --trap_container=folder --edg --trap-compression=none + template struct C { }; diff --git a/cpp/ql/test/library-tests/usings/Usings1.expected b/cpp/ql/test/library-tests/usings/Usings1.expected index c29cf7dd11f..212769fe804 100644 --- a/cpp/ql/test/library-tests/usings/Usings1.expected +++ b/cpp/ql/test/library-tests/usings/Usings1.expected @@ -1,7 +1,7 @@ -| templates.cpp:9:5:9:14 | using c | UsingDeclarationEntry, enclosingElement:std | -| usings.cpp:8:1:8:11 | using nf | UsingDeclarationEntry, enclosingElement:(global namespace) | +| templates.cpp:9:14:9:14 | using c | UsingDeclarationEntry, enclosingElement:std | +| usings.cpp:8:10:8:11 | using nf | UsingDeclarationEntry, enclosingElement:(global namespace) | | usings.cpp:9:1:9:17 | using namespace N | UsingDirectiveEntry, enclosingElement:(global namespace) | -| usings.cpp:18:3:18:13 | using bf | UsingDeclarationEntry, enclosingElement:D | -| usings.cpp:21:5:21:14 | using gf | UsingDeclarationEntry, enclosingElement:{ ... } | -| usings.cpp:34:3:34:20 | using tbf | UsingDeclarationEntry, enclosingElement:TD | -| usings.cpp:42:5:42:22 | using foo | UsingDeclarationEntry, enclosingElement:nsbar | +| usings.cpp:18:12:18:13 | using bf | UsingDeclarationEntry, enclosingElement:D | +| usings.cpp:21:13:21:14 | using gf | UsingDeclarationEntry, enclosingElement:{ ... } | +| usings.cpp:34:18:34:20 | using tbf | UsingDeclarationEntry, enclosingElement:TD | +| usings.cpp:42:20:42:22 | using foo | UsingDeclarationEntry, enclosingElement:nsbar | diff --git a/cpp/ql/test/library-tests/variables/variables/variable.expected b/cpp/ql/test/library-tests/variables/variables/variable.expected index e99ff83d440..05756351a88 100644 --- a/cpp/ql/test/library-tests/variables/variables/variable.expected +++ b/cpp/ql/test/library-tests/variables/variables/variable.expected @@ -30,7 +30,6 @@ | variables.cpp:15:12:15:13 | v1 | file://:0:0:0:0 | int[10] | StaticStorageDurationVariable | | static | | variables.cpp:15:21:15:22 | pv | file://:0:0:0:0 | int * | GlobalVariable | | static | | variables.cpp:15:21:15:22 | pv | file://:0:0:0:0 | int * | StaticStorageDurationVariable | | static | -| variables.cpp:17:7:17:8 | fp | file://:0:0:0:0 | ..(*)(..) | FunctionPointerVariable | | | | variables.cpp:17:7:17:8 | fp | file://:0:0:0:0 | ..(*)(..) | GlobalVariable | | | | variables.cpp:17:7:17:8 | fp | file://:0:0:0:0 | ..(*)(..) | StaticStorageDurationVariable | | | | variables.cpp:19:7:19:8 | v2 | file://:0:0:0:0 | float[3] | GlobalVariable | | | diff --git a/cpp/ql/test/library-tests/vector_types/vector_types.cpp b/cpp/ql/test/library-tests/vector_types/vector_types.cpp index 5e875b6b953..8f928386af4 100644 --- a/cpp/ql/test/library-tests/vector_types/vector_types.cpp +++ b/cpp/ql/test/library-tests/vector_types/vector_types.cpp @@ -1,6 +1,6 @@ +// semmle-extractor-options: --edg --clang --edg --clang_version --edg 30801 // Compilable with: clang --std=c++0x -msse4.1 vector_types.cpp // (some bits also compilable with gcc) - int printf(...); typedef float v4f __attribute__((vector_size(16))); diff --git a/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedLocals/code2.cpp b/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedLocals/code2.cpp index 7a4d2f28a00..00514347a08 100644 --- a/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedLocals/code2.cpp +++ b/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedLocals/code2.cpp @@ -163,3 +163,16 @@ void test_captured_contructor() myFunction2( [obj](){} ); } + +// --- + +void test_switch_initializer() +{ + bool a = 42, b = 43; // GOOD: a, b are both used + + switch (a = b; a) + { + default: + // ... + } +} diff --git a/cpp/ql/test/query-tests/Critical/UnsafeUseOfThis/UnsafeUseOfThis.expected b/cpp/ql/test/query-tests/Critical/UnsafeUseOfThis/UnsafeUseOfThis.expected index 2b1512242d1..6ea50ab7d8e 100644 --- a/cpp/ql/test/query-tests/Critical/UnsafeUseOfThis/UnsafeUseOfThis.expected +++ b/cpp/ql/test/query-tests/Critical/UnsafeUseOfThis/UnsafeUseOfThis.expected @@ -1,61 +1,103 @@ edges -| test.cpp:7:3:7:3 | InitializeParameter: B | test.cpp:8:12:8:15 | Load: this | -| test.cpp:8:12:8:15 | Load: this | test.cpp:34:16:34:16 | InitializeParameter: x | -| test.cpp:11:8:11:8 | InitializeParameter: b | test.cpp:12:5:12:5 | Load: b | -| test.cpp:12:5:12:5 | CopyValue: (reference dereference) | test.cpp:12:5:12:5 | ConvertToNonVirtualBase: (A)... | -| test.cpp:12:5:12:5 | Load: b | test.cpp:12:5:12:5 | CopyValue: (reference dereference) | -| test.cpp:15:3:15:4 | InitializeParameter: ~B | test.cpp:16:5:16:5 | Load: this | -| test.cpp:16:5:16:5 | Load: this | file://:0:0:0:0 | ConvertToNonVirtualBase: (A *)... | -| test.cpp:21:3:21:3 | InitializeParameter: C | test.cpp:21:13:21:13 | ConvertToNonVirtualBase: call to B | -| test.cpp:21:3:21:3 | InitializeParameter: C | test.cpp:22:12:22:15 | Load: this | -| test.cpp:21:3:21:3 | InitializeParameter: C | test.cpp:25:7:25:10 | Load: this | -| test.cpp:21:13:21:13 | ConvertToNonVirtualBase: call to B | test.cpp:7:3:7:3 | InitializeParameter: B | -| test.cpp:22:12:22:15 | ConvertToNonVirtualBase: (B *)... | test.cpp:34:16:34:16 | InitializeParameter: x | -| test.cpp:22:12:22:15 | Load: this | test.cpp:22:12:22:15 | ConvertToNonVirtualBase: (B *)... | -| test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (B *)... | test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (A *)... | -| test.cpp:25:7:25:10 | Load: this | test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (B *)... | -| test.cpp:31:3:31:3 | InitializeParameter: D | test.cpp:31:12:31:15 | Load: this | -| test.cpp:31:11:31:15 | ConvertToNonVirtualBase: (B)... | test.cpp:31:11:31:15 | CopyValue: (reference to) | -| test.cpp:31:11:31:15 | CopyValue: (reference to) | test.cpp:11:8:11:8 | InitializeParameter: b | -| test.cpp:31:11:31:15 | CopyValue: * ... | test.cpp:31:11:31:15 | ConvertToNonVirtualBase: (B)... | -| test.cpp:31:12:31:15 | Load: this | test.cpp:31:11:31:15 | CopyValue: * ... | -| test.cpp:34:16:34:16 | InitializeParameter: x | test.cpp:35:3:35:3 | Load: x | -| test.cpp:35:3:35:3 | Load: x | test.cpp:35:3:35:3 | ConvertToNonVirtualBase: (A *)... | -| test.cpp:47:3:47:3 | InitializeParameter: F | test.cpp:48:10:48:13 | Load: this | -| test.cpp:48:10:48:13 | ConvertToNonVirtualBase: (E *)... | test.cpp:48:6:48:13 | ConvertToNonVirtualBase: (A *)... | -| test.cpp:48:10:48:13 | Load: this | test.cpp:48:10:48:13 | ConvertToNonVirtualBase: (E *)... | +| test.cpp:7:3:7:3 | this | test.cpp:8:12:8:15 | Load | +| test.cpp:8:12:8:15 | Load | test.cpp:8:12:8:15 | this | +| test.cpp:8:12:8:15 | this | test.cpp:34:16:34:16 | x | +| test.cpp:11:8:11:8 | b | test.cpp:12:5:12:5 | Load | +| test.cpp:12:5:12:5 | (reference dereference) | test.cpp:12:5:12:5 | Unary | +| test.cpp:12:5:12:5 | Load | test.cpp:12:5:12:5 | b | +| test.cpp:12:5:12:5 | Unary | test.cpp:12:5:12:5 | (A)... | +| test.cpp:12:5:12:5 | Unary | test.cpp:12:5:12:5 | (reference dereference) | +| test.cpp:12:5:12:5 | b | test.cpp:12:5:12:5 | Unary | +| test.cpp:15:3:15:4 | this | test.cpp:16:5:16:5 | Load | +| test.cpp:16:5:16:5 | Load | test.cpp:16:5:16:5 | this | +| test.cpp:16:5:16:5 | Unary | file://:0:0:0:0 | (A *)... | +| test.cpp:16:5:16:5 | this | test.cpp:16:5:16:5 | Unary | +| test.cpp:21:3:21:3 | Unary | test.cpp:21:13:21:13 | ConvertToNonVirtualBase | +| test.cpp:21:3:21:3 | this | test.cpp:21:3:21:3 | Unary | +| test.cpp:21:3:21:3 | this | test.cpp:22:12:22:15 | Load | +| test.cpp:21:3:21:3 | this | test.cpp:25:7:25:10 | Load | +| test.cpp:21:13:21:13 | ConvertToNonVirtualBase | test.cpp:7:3:7:3 | this | +| test.cpp:22:12:22:15 | (B *)... | test.cpp:34:16:34:16 | x | +| test.cpp:22:12:22:15 | Load | test.cpp:22:12:22:15 | this | +| test.cpp:22:12:22:15 | Unary | test.cpp:22:12:22:15 | (B *)... | +| test.cpp:22:12:22:15 | this | test.cpp:22:12:22:15 | Unary | +| test.cpp:25:7:25:10 | (B *)... | test.cpp:25:7:25:10 | Unary | +| test.cpp:25:7:25:10 | Load | test.cpp:25:7:25:10 | this | +| test.cpp:25:7:25:10 | Unary | test.cpp:25:7:25:10 | (A *)... | +| test.cpp:25:7:25:10 | Unary | test.cpp:25:7:25:10 | (B *)... | +| test.cpp:25:7:25:10 | this | test.cpp:25:7:25:10 | Unary | +| test.cpp:31:3:31:3 | this | test.cpp:31:12:31:15 | Load | +| test.cpp:31:11:31:15 | (B)... | test.cpp:31:11:31:15 | Unary | +| test.cpp:31:11:31:15 | (reference to) | test.cpp:11:8:11:8 | b | +| test.cpp:31:11:31:15 | * ... | test.cpp:31:11:31:15 | Unary | +| test.cpp:31:11:31:15 | Unary | test.cpp:31:11:31:15 | (B)... | +| test.cpp:31:11:31:15 | Unary | test.cpp:31:11:31:15 | (reference to) | +| test.cpp:31:12:31:15 | Load | test.cpp:31:12:31:15 | this | +| test.cpp:31:12:31:15 | Unary | test.cpp:31:11:31:15 | * ... | +| test.cpp:31:12:31:15 | this | test.cpp:31:12:31:15 | Unary | +| test.cpp:34:16:34:16 | x | test.cpp:35:3:35:3 | Load | +| test.cpp:35:3:35:3 | Load | test.cpp:35:3:35:3 | x | +| test.cpp:35:3:35:3 | Unary | test.cpp:35:3:35:3 | (A *)... | +| test.cpp:35:3:35:3 | x | test.cpp:35:3:35:3 | Unary | +| test.cpp:47:3:47:3 | this | test.cpp:48:10:48:13 | Load | +| test.cpp:48:10:48:13 | (E *)... | test.cpp:48:10:48:13 | Unary | +| test.cpp:48:10:48:13 | Load | test.cpp:48:10:48:13 | this | +| test.cpp:48:10:48:13 | Unary | test.cpp:48:6:48:13 | (A *)... | +| test.cpp:48:10:48:13 | Unary | test.cpp:48:10:48:13 | (E *)... | +| test.cpp:48:10:48:13 | this | test.cpp:48:10:48:13 | Unary | nodes -| file://:0:0:0:0 | ConvertToNonVirtualBase: (A *)... | semmle.label | ConvertToNonVirtualBase: (A *)... | -| test.cpp:7:3:7:3 | InitializeParameter: B | semmle.label | InitializeParameter: B | -| test.cpp:8:12:8:15 | Load: this | semmle.label | Load: this | -| test.cpp:11:8:11:8 | InitializeParameter: b | semmle.label | InitializeParameter: b | -| test.cpp:12:5:12:5 | ConvertToNonVirtualBase: (A)... | semmle.label | ConvertToNonVirtualBase: (A)... | -| test.cpp:12:5:12:5 | CopyValue: (reference dereference) | semmle.label | CopyValue: (reference dereference) | -| test.cpp:12:5:12:5 | Load: b | semmle.label | Load: b | -| test.cpp:15:3:15:4 | InitializeParameter: ~B | semmle.label | InitializeParameter: ~B | -| test.cpp:16:5:16:5 | Load: this | semmle.label | Load: this | -| test.cpp:21:3:21:3 | InitializeParameter: C | semmle.label | InitializeParameter: C | -| test.cpp:21:13:21:13 | ConvertToNonVirtualBase: call to B | semmle.label | ConvertToNonVirtualBase: call to B | -| test.cpp:22:12:22:15 | ConvertToNonVirtualBase: (B *)... | semmle.label | ConvertToNonVirtualBase: (B *)... | -| test.cpp:22:12:22:15 | Load: this | semmle.label | Load: this | -| test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (A *)... | semmle.label | ConvertToNonVirtualBase: (A *)... | -| test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (B *)... | semmle.label | ConvertToNonVirtualBase: (B *)... | -| test.cpp:25:7:25:10 | Load: this | semmle.label | Load: this | -| test.cpp:31:3:31:3 | InitializeParameter: D | semmle.label | InitializeParameter: D | -| test.cpp:31:11:31:15 | ConvertToNonVirtualBase: (B)... | semmle.label | ConvertToNonVirtualBase: (B)... | -| test.cpp:31:11:31:15 | CopyValue: (reference to) | semmle.label | CopyValue: (reference to) | -| test.cpp:31:11:31:15 | CopyValue: * ... | semmle.label | CopyValue: * ... | -| test.cpp:31:12:31:15 | Load: this | semmle.label | Load: this | -| test.cpp:34:16:34:16 | InitializeParameter: x | semmle.label | InitializeParameter: x | -| test.cpp:35:3:35:3 | ConvertToNonVirtualBase: (A *)... | semmle.label | ConvertToNonVirtualBase: (A *)... | -| test.cpp:35:3:35:3 | Load: x | semmle.label | Load: x | -| test.cpp:47:3:47:3 | InitializeParameter: F | semmle.label | InitializeParameter: F | -| test.cpp:48:6:48:13 | ConvertToNonVirtualBase: (A *)... | semmle.label | ConvertToNonVirtualBase: (A *)... | -| test.cpp:48:10:48:13 | ConvertToNonVirtualBase: (E *)... | semmle.label | ConvertToNonVirtualBase: (E *)... | -| test.cpp:48:10:48:13 | Load: this | semmle.label | Load: this | +| file://:0:0:0:0 | (A *)... | semmle.label | (A *)... | +| test.cpp:7:3:7:3 | this | semmle.label | this | +| test.cpp:8:12:8:15 | Load | semmle.label | Load | +| test.cpp:8:12:8:15 | this | semmle.label | this | +| test.cpp:11:8:11:8 | b | semmle.label | b | +| test.cpp:12:5:12:5 | (A)... | semmle.label | (A)... | +| test.cpp:12:5:12:5 | (reference dereference) | semmle.label | (reference dereference) | +| test.cpp:12:5:12:5 | Load | semmle.label | Load | +| test.cpp:12:5:12:5 | Unary | semmle.label | Unary | +| test.cpp:12:5:12:5 | Unary | semmle.label | Unary | +| test.cpp:12:5:12:5 | b | semmle.label | b | +| test.cpp:15:3:15:4 | this | semmle.label | this | +| test.cpp:16:5:16:5 | Load | semmle.label | Load | +| test.cpp:16:5:16:5 | Unary | semmle.label | Unary | +| test.cpp:16:5:16:5 | this | semmle.label | this | +| test.cpp:21:3:21:3 | Unary | semmle.label | Unary | +| test.cpp:21:3:21:3 | this | semmle.label | this | +| test.cpp:21:13:21:13 | ConvertToNonVirtualBase | semmle.label | ConvertToNonVirtualBase | +| test.cpp:22:12:22:15 | (B *)... | semmle.label | (B *)... | +| test.cpp:22:12:22:15 | Load | semmle.label | Load | +| test.cpp:22:12:22:15 | Unary | semmle.label | Unary | +| test.cpp:22:12:22:15 | this | semmle.label | this | +| test.cpp:25:7:25:10 | (A *)... | semmle.label | (A *)... | +| test.cpp:25:7:25:10 | (B *)... | semmle.label | (B *)... | +| test.cpp:25:7:25:10 | Load | semmle.label | Load | +| test.cpp:25:7:25:10 | Unary | semmle.label | Unary | +| test.cpp:25:7:25:10 | Unary | semmle.label | Unary | +| test.cpp:25:7:25:10 | this | semmle.label | this | +| test.cpp:31:3:31:3 | this | semmle.label | this | +| test.cpp:31:11:31:15 | (B)... | semmle.label | (B)... | +| test.cpp:31:11:31:15 | (reference to) | semmle.label | (reference to) | +| test.cpp:31:11:31:15 | * ... | semmle.label | * ... | +| test.cpp:31:11:31:15 | Unary | semmle.label | Unary | +| test.cpp:31:11:31:15 | Unary | semmle.label | Unary | +| test.cpp:31:12:31:15 | Load | semmle.label | Load | +| test.cpp:31:12:31:15 | Unary | semmle.label | Unary | +| test.cpp:31:12:31:15 | this | semmle.label | this | +| test.cpp:34:16:34:16 | x | semmle.label | x | +| test.cpp:35:3:35:3 | (A *)... | semmle.label | (A *)... | +| test.cpp:35:3:35:3 | Load | semmle.label | Load | +| test.cpp:35:3:35:3 | Unary | semmle.label | Unary | +| test.cpp:35:3:35:3 | x | semmle.label | x | +| test.cpp:47:3:47:3 | this | semmle.label | this | +| test.cpp:48:6:48:13 | (A *)... | semmle.label | (A *)... | +| test.cpp:48:10:48:13 | (E *)... | semmle.label | (E *)... | +| test.cpp:48:10:48:13 | Load | semmle.label | Load | +| test.cpp:48:10:48:13 | Unary | semmle.label | Unary | +| test.cpp:48:10:48:13 | Unary | semmle.label | Unary | +| test.cpp:48:10:48:13 | this | semmle.label | this | #select -| test.cpp:12:7:12:7 | call to f | test.cpp:31:3:31:3 | InitializeParameter: D | test.cpp:12:5:12:5 | ConvertToNonVirtualBase: (A)... | Call to pure virtual function during construction | -| test.cpp:16:5:16:5 | call to f | test.cpp:15:3:15:4 | InitializeParameter: ~B | file://:0:0:0:0 | ConvertToNonVirtualBase: (A *)... | Call to pure virtual function during destruction | -| test.cpp:25:13:25:13 | call to f | test.cpp:21:3:21:3 | InitializeParameter: C | test.cpp:25:7:25:10 | ConvertToNonVirtualBase: (A *)... | Call to pure virtual function during construction | -| test.cpp:35:6:35:6 | call to f | test.cpp:7:3:7:3 | InitializeParameter: B | test.cpp:35:3:35:3 | ConvertToNonVirtualBase: (A *)... | Call to pure virtual function during construction | -| test.cpp:35:6:35:6 | call to f | test.cpp:21:3:21:3 | InitializeParameter: C | test.cpp:35:3:35:3 | ConvertToNonVirtualBase: (A *)... | Call to pure virtual function during construction | +| test.cpp:12:7:12:7 | call to f | test.cpp:31:3:31:3 | this | test.cpp:12:5:12:5 | (A)... | Call to pure virtual function during construction | +| test.cpp:16:5:16:5 | call to f | test.cpp:15:3:15:4 | this | file://:0:0:0:0 | (A *)... | Call to pure virtual function during destruction | +| test.cpp:25:13:25:13 | call to f | test.cpp:21:3:21:3 | this | test.cpp:25:7:25:10 | (A *)... | Call to pure virtual function during construction | +| test.cpp:35:6:35:6 | call to f | test.cpp:7:3:7:3 | this | test.cpp:35:3:35:3 | (A *)... | Call to pure virtual function during construction | +| test.cpp:35:6:35:6 | call to f | test.cpp:21:3:21:3 | this | test.cpp:35:3:35:3 | (A *)... | Call to pure virtual function during construction | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected index 8f9d91fc1ad..6b8a59793a3 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected @@ -100,6 +100,12 @@ edges | test.cpp:190:10:190:13 | Unary | test.cpp:190:10:190:13 | (reference dereference) | | test.cpp:190:10:190:13 | Unary | test.cpp:190:10:190:13 | (reference to) | | test.cpp:190:10:190:13 | pRef | test.cpp:190:10:190:13 | Unary | +| test.cpp:225:14:225:15 | px | test.cpp:226:10:226:11 | Load | +| test.cpp:226:10:226:11 | Load | test.cpp:226:10:226:11 | px | +| test.cpp:226:10:226:11 | px | test.cpp:226:10:226:11 | StoreValue | +| test.cpp:231:16:231:17 | & ... | test.cpp:225:14:225:15 | px | +| test.cpp:231:17:231:17 | Unary | test.cpp:231:16:231:17 | & ... | +| test.cpp:231:17:231:17 | x | test.cpp:231:17:231:17 | Unary | nodes | test.cpp:17:9:17:11 | & ... | semmle.label | & ... | | test.cpp:17:9:17:11 | StoreValue | semmle.label | StoreValue | @@ -215,6 +221,13 @@ nodes | test.cpp:190:10:190:13 | Unary | semmle.label | Unary | | test.cpp:190:10:190:13 | Unary | semmle.label | Unary | | test.cpp:190:10:190:13 | pRef | semmle.label | pRef | +| test.cpp:225:14:225:15 | px | semmle.label | px | +| test.cpp:226:10:226:11 | Load | semmle.label | Load | +| test.cpp:226:10:226:11 | StoreValue | semmle.label | StoreValue | +| test.cpp:226:10:226:11 | px | semmle.label | px | +| test.cpp:231:16:231:17 | & ... | semmle.label | & ... | +| test.cpp:231:17:231:17 | Unary | semmle.label | Unary | +| test.cpp:231:17:231:17 | x | semmle.label | x | #select | test.cpp:17:9:17:11 | StoreValue | test.cpp:17:10:17:11 | mc | test.cpp:17:9:17:11 | StoreValue | May return stack-allocated memory from $@. | test.cpp:17:10:17:11 | mc | mc | | test.cpp:25:9:25:11 | StoreValue | test.cpp:23:18:23:19 | mc | test.cpp:25:9:25:11 | StoreValue | May return stack-allocated memory from $@. | test.cpp:23:18:23:19 | mc | mc | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp index a1726169654..487a4e77285 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp @@ -1,4 +1,4 @@ - +// semmle-extractor-options: -std=c++14 class MyClass { public: @@ -220,4 +220,13 @@ auto make_read_port() void* get_sp() { int p; return (void*)&p; // GOOD: The function name makes it sound like the programmer intended to get the value of the stack pointer. +} + +int* id(int* px) { + return px; // GOOD +} + +void f() { + int x; + int* px = id(&x); // GOOD } \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected index 2d0ddba329a..80d09858338 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected @@ -1,24 +1,92 @@ -| test.cpp:15:16:15:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:9:7:9:7 | x | x | test.cpp:10:3:10:13 | Store: ... = ... | here | -| test.cpp:58:16:58:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:51:36:51:36 | y | y | test.cpp:52:3:52:13 | Store: ... = ... | here | -| test.cpp:73:16:73:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:62:7:62:7 | x | x | test.cpp:68:3:68:13 | Store: ... = ... | here | -| test.cpp:98:15:98:15 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:92:8:92:8 | s | s | test.cpp:93:3:93:15 | Store: ... = ... | here | -| test.cpp:111:16:111:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:102:7:102:7 | x | x | test.cpp:106:3:106:14 | Store: ... = ... | here | -| test.cpp:161:16:161:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:136:3:136:12 | Store: ... = ... | here | -| test.cpp:162:16:162:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:137:3:137:16 | Store: ... = ... | here | -| test.cpp:164:16:164:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | -| test.cpp:165:16:165:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | -| test.cpp:166:17:166:18 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:140:3:140:16 | Store: ... = ... | here | -| test.cpp:167:16:167:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:141:3:141:15 | Store: ... = ... | here | -| test.cpp:168:17:168:18 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | -| test.cpp:170:16:170:17 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:144:3:144:12 | Store: ... = ... | here | -| test.cpp:171:17:171:18 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:145:3:145:16 | Store: ... = ... | here | -| test.cpp:172:18:172:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:146:3:146:15 | Store: ... = ... | here | -| test.cpp:173:18:173:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:147:3:147:19 | Store: ... = ... | here | -| test.cpp:174:18:174:19 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | -| test.cpp:175:16:175:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:148:3:148:18 | Store: ... = ... | here | -| test.cpp:177:14:177:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:151:3:151:15 | Store: ... = ... | here | -| test.cpp:178:14:178:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:152:3:152:19 | Store: ... = ... | here | -| test.cpp:179:14:179:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:153:3:153:18 | Store: ... = ... | here | -| test.cpp:180:14:180:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:154:3:154:22 | Store: ... = ... | here | -| test.cpp:181:13:181:20 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:155:3:155:21 | Store: ... = ... | here | -| test.cpp:182:14:182:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:156:3:156:25 | Store: ... = ... | here | +edges +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:14:3:14:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:19:3:19:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:28:3:28:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:28:3:28:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:37:3:37:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:37:3:37:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:210:3:210:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:210:3:210:9 | Call: call to escape1 | +| test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:210:3:210:9 | Call: call to escape1 | +| test.cpp:14:3:14:9 | Call: call to escape1 | test.cpp:15:16:15:16 | Load: p | +| test.cpp:23:5:23:11 | EnterFunction: deref_p | test.cpp:24:16:24:16 | Load: p | +| test.cpp:28:3:28:9 | Call: call to escape1 | test.cpp:23:5:23:11 | EnterFunction: deref_p | +| test.cpp:28:3:28:9 | Call: call to escape1 | test.cpp:24:16:24:16 | Load: p | +| test.cpp:37:3:37:9 | Call: call to escape1 | test.cpp:32:5:32:11 | EnterFunction: deref_i | +| test.cpp:52:3:52:13 | Store: ... = ... | test.cpp:57:3:57:27 | Call: call to store_address_of_argument | +| test.cpp:57:3:57:27 | Call: call to store_address_of_argument | test.cpp:58:16:58:16 | Load: p | +| test.cpp:68:3:68:13 | Store: ... = ... | test.cpp:72:3:72:39 | Call: call to address_escapes_through_pointer_arith | +| test.cpp:68:3:68:13 | Store: ... = ... | test.cpp:78:3:78:39 | Call: call to address_escapes_through_pointer_arith | +| test.cpp:68:3:68:13 | Store: ... = ... | test.cpp:86:5:86:41 | Call: call to address_escapes_through_pointer_arith | +| test.cpp:72:3:72:39 | Call: call to address_escapes_through_pointer_arith | test.cpp:73:16:73:16 | Load: p | +| test.cpp:78:3:78:39 | Call: call to address_escapes_through_pointer_arith | test.cpp:80:16:80:16 | Load: p | +| test.cpp:93:3:93:15 | Store: ... = ... | test.cpp:97:3:97:23 | Call: call to field_address_escapes | +| test.cpp:97:3:97:23 | Call: call to field_address_escapes | test.cpp:98:15:98:15 | Load: p | +| test.cpp:106:3:106:14 | Store: ... = ... | test.cpp:110:3:110:26 | Call: call to escape_through_reference | +| test.cpp:110:3:110:26 | Call: call to escape_through_reference | test.cpp:111:16:111:16 | Load: p | +| test.cpp:136:3:136:12 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:137:3:137:16 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:139:3:139:12 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:140:3:140:16 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:141:3:141:15 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:142:3:142:19 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:144:3:144:12 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:145:3:145:16 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:146:3:146:15 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:147:3:147:19 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:148:3:148:18 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:149:3:149:22 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:151:3:151:15 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:152:3:152:19 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:153:3:153:18 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:154:3:154:22 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:155:3:155:21 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:156:3:156:25 | Store: ... = ... | test.cpp:160:3:160:23 | Call: call to escape_through_arrays | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:161:16:161:17 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:162:16:162:17 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:164:16:164:17 | Load: p2 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:165:16:165:17 | Load: p2 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:166:17:166:18 | Load: p2 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:167:16:167:17 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:168:17:168:18 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:170:16:170:17 | Load: p3 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:171:17:171:18 | Load: p3 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:172:18:172:19 | Load: p2 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:173:18:173:19 | Load: p2 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:174:18:174:19 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:175:16:175:17 | Load: p1 | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:177:14:177:21 | Load: access to array | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:178:14:178:21 | Load: access to array | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:179:14:179:21 | Load: access to array | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:180:14:180:19 | Load: * ... | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:181:13:181:20 | Load: access to array | +| test.cpp:160:3:160:23 | Call: call to escape_through_arrays | test.cpp:182:14:182:19 | Load: * ... | +| test.cpp:201:5:201:17 | EnterFunction: maybe_deref_p | test.cpp:201:5:201:17 | VariableAddress: maybe_deref_p | +| test.cpp:210:3:210:9 | Call: call to escape1 | test.cpp:201:5:201:17 | EnterFunction: maybe_deref_p | +| test.cpp:210:3:210:9 | Call: call to escape1 | test.cpp:201:5:201:17 | VariableAddress: maybe_deref_p | +#select +| test.cpp:15:16:15:16 | Load: p | test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:15:16:15:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:9:7:9:7 | x | x | test.cpp:10:3:10:13 | Store: ... = ... | here | +| test.cpp:24:16:24:16 | Load: p | test.cpp:10:3:10:13 | Store: ... = ... | test.cpp:24:16:24:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:9:7:9:7 | x | x | test.cpp:10:3:10:13 | Store: ... = ... | here | +| test.cpp:58:16:58:16 | Load: p | test.cpp:52:3:52:13 | Store: ... = ... | test.cpp:58:16:58:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:51:36:51:36 | y | y | test.cpp:52:3:52:13 | Store: ... = ... | here | +| test.cpp:73:16:73:16 | Load: p | test.cpp:68:3:68:13 | Store: ... = ... | test.cpp:73:16:73:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:62:7:62:7 | x | x | test.cpp:68:3:68:13 | Store: ... = ... | here | +| test.cpp:98:15:98:15 | Load: p | test.cpp:93:3:93:15 | Store: ... = ... | test.cpp:98:15:98:15 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:92:8:92:8 | s | s | test.cpp:93:3:93:15 | Store: ... = ... | here | +| test.cpp:111:16:111:16 | Load: p | test.cpp:106:3:106:14 | Store: ... = ... | test.cpp:111:16:111:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:102:7:102:7 | x | x | test.cpp:106:3:106:14 | Store: ... = ... | here | +| test.cpp:161:16:161:17 | Load: p1 | test.cpp:136:3:136:12 | Store: ... = ... | test.cpp:161:16:161:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:136:3:136:12 | Store: ... = ... | here | +| test.cpp:162:16:162:17 | Load: p1 | test.cpp:137:3:137:16 | Store: ... = ... | test.cpp:162:16:162:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:137:3:137:16 | Store: ... = ... | here | +| test.cpp:164:16:164:17 | Load: p2 | test.cpp:139:3:139:12 | Store: ... = ... | test.cpp:164:16:164:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | +| test.cpp:165:16:165:17 | Load: p2 | test.cpp:139:3:139:12 | Store: ... = ... | test.cpp:165:16:165:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | +| test.cpp:166:17:166:18 | Load: p2 | test.cpp:140:3:140:16 | Store: ... = ... | test.cpp:166:17:166:18 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:140:3:140:16 | Store: ... = ... | here | +| test.cpp:167:16:167:17 | Load: p1 | test.cpp:141:3:141:15 | Store: ... = ... | test.cpp:167:16:167:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:141:3:141:15 | Store: ... = ... | here | +| test.cpp:168:17:168:18 | Load: p1 | test.cpp:142:3:142:19 | Store: ... = ... | test.cpp:168:17:168:18 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | +| test.cpp:170:16:170:17 | Load: p3 | test.cpp:144:3:144:12 | Store: ... = ... | test.cpp:170:16:170:17 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:144:3:144:12 | Store: ... = ... | here | +| test.cpp:171:17:171:18 | Load: p3 | test.cpp:145:3:145:16 | Store: ... = ... | test.cpp:171:17:171:18 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:145:3:145:16 | Store: ... = ... | here | +| test.cpp:172:18:172:19 | Load: p2 | test.cpp:146:3:146:15 | Store: ... = ... | test.cpp:172:18:172:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:146:3:146:15 | Store: ... = ... | here | +| test.cpp:173:18:173:19 | Load: p2 | test.cpp:147:3:147:19 | Store: ... = ... | test.cpp:173:18:173:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:147:3:147:19 | Store: ... = ... | here | +| test.cpp:174:18:174:19 | Load: p1 | test.cpp:142:3:142:19 | Store: ... = ... | test.cpp:174:18:174:19 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | +| test.cpp:175:16:175:17 | Load: p1 | test.cpp:148:3:148:18 | Store: ... = ... | test.cpp:175:16:175:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:148:3:148:18 | Store: ... = ... | here | +| test.cpp:177:14:177:21 | Load: access to array | test.cpp:151:3:151:15 | Store: ... = ... | test.cpp:177:14:177:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:151:3:151:15 | Store: ... = ... | here | +| test.cpp:178:14:178:21 | Load: access to array | test.cpp:152:3:152:19 | Store: ... = ... | test.cpp:178:14:178:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:152:3:152:19 | Store: ... = ... | here | +| test.cpp:179:14:179:21 | Load: access to array | test.cpp:153:3:153:18 | Store: ... = ... | test.cpp:179:14:179:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:153:3:153:18 | Store: ... = ... | here | +| test.cpp:180:14:180:19 | Load: * ... | test.cpp:154:3:154:22 | Store: ... = ... | test.cpp:180:14:180:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:154:3:154:22 | Store: ... = ... | here | +| test.cpp:181:13:181:20 | Load: access to array | test.cpp:155:3:155:21 | Store: ... = ... | test.cpp:181:13:181:20 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:155:3:155:21 | Store: ... = ... | here | +| test.cpp:182:14:182:19 | Load: * ... | test.cpp:156:3:156:25 | Store: ... = ... | test.cpp:182:14:182:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:156:3:156:25 | Store: ... = ... | here | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp index 5076b3e6f4d..3e8a7e90b84 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp @@ -21,12 +21,12 @@ int simple_field_good() { } int deref_p() { - return *s101.p; + return *s101.p; // BAD } int field_indirect_bad() { escape1(); - return deref_p(); // BAD [NOT DETECTED] + return deref_p(); } int deref_i() { @@ -197,3 +197,16 @@ void test_not_escape_through_array() { int x21 = s1.a2[0][1]; // GOOD int* x22 = s1.a3[5][2]; // GOOD } + +int maybe_deref_p(bool b) { + if(b) { + return *s101.p; // GOOD + } else { + return 0; + } +} + +int field_indirect_maybe_bad(bool b) { + escape1(); + return maybe_deref_p(b); +} \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-078/SAMATE/ExecTainted/ExecTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-078/SAMATE/ExecTainted/ExecTainted.expected index 8875333fbeb..ace360f1563 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-078/SAMATE/ExecTainted/ExecTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-078/SAMATE/ExecTainted/ExecTainted.expected @@ -3,7 +3,6 @@ edges | tests.cpp:33:34:33:39 | call to getenv | tests.cpp:38:39:38:49 | environment indirection | | tests.cpp:38:25:38:36 | strncat output argument | tests.cpp:26:15:26:23 | ReturnValue | | tests.cpp:38:39:38:49 | environment indirection | tests.cpp:38:25:38:36 | strncat output argument | -| tests.cpp:38:39:38:49 | environment indirection | tests.cpp:38:25:38:36 | strncat output argument | | tests.cpp:51:12:51:20 | call to badSource | tests.cpp:53:16:53:19 | data indirection | nodes | tests.cpp:26:15:26:23 | ReturnValue | semmle.label | ReturnValue | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected index 4b1b5a61ace..ff668d3b833 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected @@ -2,39 +2,77 @@ edges | test.cpp:16:20:16:23 | argv | test.cpp:22:45:22:52 | userName indirection | | test.cpp:22:13:22:20 | sprintf output argument | test.cpp:23:12:23:19 | command1 indirection | | test.cpp:22:45:22:52 | userName indirection | test.cpp:22:13:22:20 | sprintf output argument | -| test.cpp:22:45:22:52 | userName indirection | test.cpp:22:13:22:20 | sprintf output argument | | test.cpp:47:21:47:26 | call to getenv | test.cpp:50:35:50:43 | envCflags indirection | | test.cpp:50:11:50:17 | sprintf output argument | test.cpp:51:10:51:16 | command indirection | | test.cpp:50:35:50:43 | envCflags indirection | test.cpp:50:11:50:17 | sprintf output argument | -| test.cpp:50:35:50:43 | envCflags indirection | test.cpp:50:11:50:17 | sprintf output argument | | test.cpp:62:9:62:16 | fread output argument | test.cpp:64:20:64:27 | filename indirection | | test.cpp:64:11:64:17 | strncat output argument | test.cpp:65:10:65:16 | command indirection | | test.cpp:64:20:64:27 | filename indirection | test.cpp:64:11:64:17 | strncat output argument | -| test.cpp:64:20:64:27 | filename indirection | test.cpp:64:11:64:17 | strncat output argument | | test.cpp:82:9:82:16 | fread output argument | test.cpp:84:20:84:27 | filename indirection | | test.cpp:84:11:84:17 | strncat output argument | test.cpp:85:32:85:38 | command indirection | | test.cpp:84:20:84:27 | filename indirection | test.cpp:84:11:84:17 | strncat output argument | -| test.cpp:84:20:84:27 | filename indirection | test.cpp:84:11:84:17 | strncat output argument | | test.cpp:91:9:91:16 | fread output argument | test.cpp:93:17:93:24 | filename indirection | | test.cpp:93:11:93:14 | strncat output argument | test.cpp:94:45:94:48 | path indirection | | test.cpp:93:17:93:24 | filename indirection | test.cpp:93:11:93:14 | strncat output argument | -| test.cpp:93:17:93:24 | filename indirection | test.cpp:93:11:93:14 | strncat output argument | | test.cpp:106:20:106:25 | call to getenv | test.cpp:107:33:107:36 | path indirection | | test.cpp:107:31:107:31 | call to operator+ | test.cpp:108:18:108:22 | call to c_str indirection | | test.cpp:107:33:107:36 | path indirection | test.cpp:107:31:107:31 | call to operator+ | -| test.cpp:107:33:107:36 | path indirection | test.cpp:107:31:107:31 | call to operator+ | | test.cpp:113:20:113:25 | call to getenv | test.cpp:114:19:114:22 | path indirection | | test.cpp:114:17:114:17 | Call | test.cpp:114:25:114:29 | call to c_str indirection | | test.cpp:114:19:114:22 | path indirection | test.cpp:114:17:114:17 | Call | -| test.cpp:114:19:114:22 | path indirection | test.cpp:114:17:114:17 | Call | | test.cpp:119:20:119:25 | call to getenv | test.cpp:120:19:120:22 | path indirection | | test.cpp:120:17:120:17 | Call | test.cpp:120:10:120:30 | call to data indirection | | test.cpp:120:19:120:22 | path indirection | test.cpp:120:17:120:17 | Call | -| test.cpp:120:19:120:22 | path indirection | test.cpp:120:17:120:17 | Call | | test.cpp:140:9:140:11 | fread output argument | test.cpp:142:31:142:33 | str indirection | | test.cpp:142:11:142:17 | sprintf output argument | test.cpp:143:10:143:16 | command indirection | | test.cpp:142:31:142:33 | str indirection | test.cpp:142:11:142:17 | sprintf output argument | -| test.cpp:142:31:142:33 | str indirection | test.cpp:142:11:142:17 | sprintf output argument | +| test.cpp:174:9:174:16 | fread output argument | test.cpp:177:20:177:27 | filename indirection | +| test.cpp:174:9:174:16 | fread output argument | test.cpp:178:22:178:26 | flags indirection | +| test.cpp:174:9:174:16 | fread output argument | test.cpp:180:22:180:29 | filename indirection | +| test.cpp:177:13:177:17 | strncat output argument | test.cpp:183:32:183:38 | command indirection | +| test.cpp:177:20:177:27 | filename indirection | test.cpp:177:13:177:17 | strncat output argument | +| test.cpp:178:13:178:19 | strncat output argument | test.cpp:183:32:183:38 | command indirection | +| test.cpp:178:22:178:26 | flags indirection | test.cpp:178:13:178:19 | strncat output argument | +| test.cpp:180:13:180:19 | strncat output argument | test.cpp:183:32:183:38 | command indirection | +| test.cpp:180:22:180:29 | filename indirection | test.cpp:180:13:180:19 | strncat output argument | +| test.cpp:186:47:186:54 | *filename | test.cpp:187:18:187:25 | filename indirection | +| test.cpp:186:47:186:54 | *filename | test.cpp:188:20:188:24 | flags indirection | +| test.cpp:186:47:186:54 | filename | test.cpp:187:18:187:25 | filename indirection | +| test.cpp:186:47:186:54 | filename | test.cpp:188:20:188:24 | flags indirection | +| test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:187:18:187:25 | filename indirection | test.cpp:187:11:187:15 | strncat output argument | +| test.cpp:187:18:187:25 | filename indirection | test.cpp:187:11:187:15 | strncat output argument | +| test.cpp:188:11:188:17 | command [post update] | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:188:11:188:17 | command [post update] | +| test.cpp:188:20:188:24 | flags indirection | test.cpp:188:11:188:17 | strncat output argument | +| test.cpp:188:20:188:24 | flags indirection | test.cpp:188:11:188:17 | strncat output argument | +| test.cpp:194:9:194:16 | fread output argument | test.cpp:196:26:196:33 | filename | +| test.cpp:194:9:194:16 | fread output argument | test.cpp:196:26:196:33 | filename indirection | +| test.cpp:196:10:196:16 | command [post update] | test.cpp:198:32:198:38 | command indirection | +| test.cpp:196:10:196:16 | command [post update] | test.cpp:198:32:198:38 | command indirection | +| test.cpp:196:26:196:33 | filename | test.cpp:186:47:186:54 | filename | +| test.cpp:196:26:196:33 | filename | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:186:47:186:54 | *filename | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:218:9:218:16 | fread output argument | test.cpp:220:19:220:26 | filename indirection | +| test.cpp:218:9:218:16 | fread output argument | test.cpp:220:19:220:26 | filename indirection | +| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | command indirection | +| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | command indirection | +| test.cpp:220:19:220:26 | filename indirection | test.cpp:220:10:220:16 | strncat output argument | +| test.cpp:220:19:220:26 | filename indirection | test.cpp:220:10:220:16 | strncat output argument | +| test.cpp:220:19:220:26 | filename indirection | test.cpp:220:10:220:16 | strncat output argument | +| test.cpp:220:19:220:26 | filename indirection | test.cpp:220:10:220:16 | strncat output argument | nodes | test.cpp:16:20:16:23 | argv | semmle.label | argv | | test.cpp:22:13:22:20 | sprintf output argument | semmle.label | sprintf output argument | @@ -72,7 +110,56 @@ nodes | test.cpp:142:11:142:17 | sprintf output argument | semmle.label | sprintf output argument | | test.cpp:142:31:142:33 | str indirection | semmle.label | str indirection | | test.cpp:143:10:143:16 | command indirection | semmle.label | command indirection | +| test.cpp:174:9:174:16 | fread output argument | semmle.label | fread output argument | +| test.cpp:177:13:177:17 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:177:20:177:27 | filename indirection | semmle.label | filename indirection | +| test.cpp:178:13:178:19 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:178:22:178:26 | flags indirection | semmle.label | flags indirection | +| test.cpp:180:13:180:19 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:180:22:180:29 | filename indirection | semmle.label | filename indirection | +| test.cpp:183:32:183:38 | command indirection | semmle.label | command indirection | +| test.cpp:183:32:183:38 | command indirection | semmle.label | command indirection | +| test.cpp:183:32:183:38 | command indirection | semmle.label | command indirection | +| test.cpp:186:47:186:54 | *filename | semmle.label | *filename | +| test.cpp:186:47:186:54 | filename | semmle.label | filename | +| test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:187:18:187:25 | filename indirection | semmle.label | filename indirection | +| test.cpp:187:18:187:25 | filename indirection | semmle.label | filename indirection | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | command [post update] | semmle.label | command [post update] | +| test.cpp:188:11:188:17 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:188:11:188:17 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:188:20:188:24 | flags indirection | semmle.label | flags indirection | +| test.cpp:188:20:188:24 | flags indirection | semmle.label | flags indirection | +| test.cpp:194:9:194:16 | fread output argument | semmle.label | fread output argument | +| test.cpp:196:10:196:16 | command [post update] | semmle.label | command [post update] | +| test.cpp:196:10:196:16 | command [post update] | semmle.label | command [post update] | +| test.cpp:196:26:196:33 | filename | semmle.label | filename | +| test.cpp:196:26:196:33 | filename indirection | semmle.label | filename indirection | +| test.cpp:198:32:198:38 | command indirection | semmle.label | command indirection | +| test.cpp:198:32:198:38 | command indirection | semmle.label | command indirection | +| test.cpp:218:9:218:16 | fread output argument | semmle.label | fread output argument | +| test.cpp:220:10:220:16 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:220:10:220:16 | strncat output argument | semmle.label | strncat output argument | +| test.cpp:220:19:220:26 | filename indirection | semmle.label | filename indirection | +| test.cpp:220:19:220:26 | filename indirection | semmle.label | filename indirection | +| test.cpp:222:32:222:38 | command indirection | semmle.label | command indirection | subpaths +| test.cpp:196:26:196:33 | filename | test.cpp:186:47:186:54 | filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename | test.cpp:186:47:186:54 | filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename | test.cpp:186:47:186:54 | filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename | test.cpp:186:47:186:54 | filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | +| test.cpp:196:26:196:33 | filename indirection | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | command [post update] | test.cpp:196:10:196:16 | command [post update] | #select | test.cpp:23:12:23:19 | command1 | test.cpp:16:20:16:23 | argv | test.cpp:23:12:23:19 | command1 indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to system(string) | test.cpp:16:20:16:23 | argv | user input (a command-line argument) | test.cpp:22:13:22:20 | sprintf output argument | sprintf output argument | | test.cpp:51:10:51:16 | command | test.cpp:47:21:47:26 | call to getenv | test.cpp:51:10:51:16 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to system(string) | test.cpp:47:21:47:26 | call to getenv | user input (an environment variable) | test.cpp:50:11:50:17 | sprintf output argument | sprintf output argument | @@ -83,3 +170,10 @@ subpaths | test.cpp:114:25:114:29 | call to c_str | test.cpp:113:20:113:25 | call to getenv | test.cpp:114:25:114:29 | call to c_str indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to system(string) | test.cpp:113:20:113:25 | call to getenv | user input (an environment variable) | test.cpp:114:17:114:17 | Call | Call | | test.cpp:120:25:120:28 | call to data | test.cpp:119:20:119:25 | call to getenv | test.cpp:120:10:120:30 | call to data indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to system(string) | test.cpp:119:20:119:25 | call to getenv | user input (an environment variable) | test.cpp:120:17:120:17 | Call | Call | | test.cpp:143:10:143:16 | command | test.cpp:140:9:140:11 | fread output argument | test.cpp:143:10:143:16 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to system(string) | test.cpp:140:9:140:11 | fread output argument | user input (String read by fread) | test.cpp:142:11:142:17 | sprintf output argument | sprintf output argument | +| test.cpp:183:32:183:38 | command | test.cpp:174:9:174:16 | fread output argument | test.cpp:183:32:183:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:174:9:174:16 | fread output argument | user input (String read by fread) | test.cpp:177:13:177:17 | strncat output argument | strncat output argument | +| test.cpp:183:32:183:38 | command | test.cpp:174:9:174:16 | fread output argument | test.cpp:183:32:183:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:174:9:174:16 | fread output argument | user input (String read by fread) | test.cpp:178:13:178:19 | strncat output argument | strncat output argument | +| test.cpp:183:32:183:38 | command | test.cpp:174:9:174:16 | fread output argument | test.cpp:183:32:183:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:174:9:174:16 | fread output argument | user input (String read by fread) | test.cpp:180:13:180:19 | strncat output argument | strncat output argument | +| test.cpp:198:32:198:38 | command | test.cpp:194:9:194:16 | fread output argument | test.cpp:198:32:198:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:194:9:194:16 | fread output argument | user input (String read by fread) | test.cpp:187:11:187:15 | strncat output argument | strncat output argument | +| test.cpp:198:32:198:38 | command | test.cpp:194:9:194:16 | fread output argument | test.cpp:198:32:198:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:194:9:194:16 | fread output argument | user input (String read by fread) | test.cpp:188:11:188:17 | strncat output argument | strncat output argument | +| test.cpp:222:32:222:38 | command | test.cpp:218:9:218:16 | fread output argument | test.cpp:222:32:222:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:218:9:218:16 | fread output argument | user input (String read by fread) | test.cpp:220:10:220:16 | strncat output argument | strncat output argument | +| test.cpp:222:32:222:38 | command | test.cpp:218:9:218:16 | fread output argument | test.cpp:222:32:222:38 | command indirection | This argument to an OS command is derived from $@, dangerously concatenated into $@, and then passed to execl | test.cpp:218:9:218:16 | fread output argument | user input (String read by fread) | test.cpp:220:10:220:16 | strncat output argument | strncat output argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/test.cpp index 8407ffb68da..720ad7708bc 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/test.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/test.cpp @@ -168,7 +168,58 @@ void test15(FILE *f) { system(command); // GOOD: the user string was converted to an integer and back } +void test16(FILE *f, bool use_flags) { + // BAD: the user string is injected directly into a command + char command[1000] = "mv ", flags[1000] = "-R", filename[1000]; + fread(filename, 1, 1000, f); -// TODO: test for call context sensitivity at concatenation site + if (use_flags) { + strncat(flags, filename, 1000); + strncat(command, flags, 1000); + } else { + strncat(command, filename, 1000); + } + + execl("/bin/sh", "sh", "-c", command); +} + +void concat(char *command, char *flags, char *filename) { + strncat(flags, filename, 1000); + strncat(command, flags, 1000); +} + +void test17(FILE *f) { + // BAD: the user string is injected directly into a command + char command[1000] = "mv ", flags[1000] = "-R", filename[1000]; + fread(filename, 1, 1000, f); + + concat(command, flags, filename); + + execl("/bin/sh", "sh", "-c", command); +} + +void test18() { + // GOOD + char command[1000] = "ls ", flags[1000] = "-l", filename[1000] = "."; + + concat(command, flags, filename); + + execl("/bin/sh", "sh", "-c", command); +} + +#define CONCAT(COMMAND, FILENAME) \ + strncat(COMMAND, FILENAME, 1000); \ + strncat(COMMAND, " ", 1000); \ + strncat(COMMAND, FILENAME, 1000); + +void test19(FILE *f) { + // BAD: the user string is injected directly into a command + char command[1000] = "mv ", filename[1000]; + fread(filename, 1, 1000, f); + + CONCAT(command, filename) + + execl("/bin/sh", "sh", "-c", command); +} // open question: do we want to report certain sources even when they're the start of the string? diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverflowDestination.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverflowDestination.expected index e69de29bb2d..e217064d1df 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverflowDestination.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverflowDestination.expected @@ -0,0 +1,4 @@ +edges +nodes +subpaths +#select diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected index 7f79034b954..2a9b25cb541 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected @@ -1,4 +1,43 @@ -| overflowdestination.cpp:30:2:30:8 | call to strncpy | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | -| overflowdestination.cpp:46:2:46:7 | call to memcpy | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | -| overflowdestination.cpp:53:2:53:7 | call to memcpy | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | -| overflowdestination.cpp:64:2:64:7 | call to memcpy | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | +edges +| overflowdestination.cpp:27:9:27:12 | argv | overflowdestination.cpp:30:17:30:20 | (const char *)... | +| overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | (const void *)... | +| overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | ReturnIndirection | +| overflowdestination.cpp:50:52:50:54 | src | overflowdestination.cpp:53:15:53:17 | (const void *)... | +| overflowdestination.cpp:57:52:57:54 | *src | overflowdestination.cpp:64:16:64:19 | (const void *)... | +| overflowdestination.cpp:57:52:57:54 | src | overflowdestination.cpp:64:16:64:19 | (const void *)... | +| overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:75:30:75:32 | src | +| overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:75:30:75:32 | src indirection | +| overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:76:30:76:32 | src | +| overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:76:30:76:32 | src indirection | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | overflowdestination.cpp:76:30:76:32 | src | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | overflowdestination.cpp:76:30:76:32 | src indirection | +| overflowdestination.cpp:75:30:75:32 | src | overflowdestination.cpp:50:52:50:54 | src | +| overflowdestination.cpp:75:30:75:32 | src indirection | overflowdestination.cpp:50:52:50:54 | *src | +| overflowdestination.cpp:75:30:75:32 | src indirection | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | +| overflowdestination.cpp:76:30:76:32 | src | overflowdestination.cpp:57:52:57:54 | src | +| overflowdestination.cpp:76:30:76:32 | src indirection | overflowdestination.cpp:57:52:57:54 | *src | +nodes +| overflowdestination.cpp:27:9:27:12 | argv | semmle.label | argv | +| overflowdestination.cpp:30:17:30:20 | (const char *)... | semmle.label | (const char *)... | +| overflowdestination.cpp:43:8:43:10 | fgets output argument | semmle.label | fgets output argument | +| overflowdestination.cpp:46:15:46:17 | (const void *)... | semmle.label | (const void *)... | +| overflowdestination.cpp:50:52:50:54 | *src | semmle.label | *src | +| overflowdestination.cpp:50:52:50:54 | ReturnIndirection | semmle.label | ReturnIndirection | +| overflowdestination.cpp:50:52:50:54 | src | semmle.label | src | +| overflowdestination.cpp:53:15:53:17 | (const void *)... | semmle.label | (const void *)... | +| overflowdestination.cpp:57:52:57:54 | *src | semmle.label | *src | +| overflowdestination.cpp:57:52:57:54 | src | semmle.label | src | +| overflowdestination.cpp:64:16:64:19 | (const void *)... | semmle.label | (const void *)... | +| overflowdestination.cpp:73:8:73:10 | fgets output argument | semmle.label | fgets output argument | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | semmle.label | overflowdest_test2 output argument | +| overflowdestination.cpp:75:30:75:32 | src | semmle.label | src | +| overflowdestination.cpp:75:30:75:32 | src indirection | semmle.label | src indirection | +| overflowdestination.cpp:76:30:76:32 | src | semmle.label | src | +| overflowdestination.cpp:76:30:76:32 | src indirection | semmle.label | src indirection | +subpaths +| overflowdestination.cpp:75:30:75:32 | src indirection | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | ReturnIndirection | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | +#select +| overflowdestination.cpp:30:2:30:8 | call to strncpy | overflowdestination.cpp:27:9:27:12 | argv | overflowdestination.cpp:30:17:30:20 | (const char *)... | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | +| overflowdestination.cpp:46:2:46:7 | call to memcpy | overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | (const void *)... | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | +| overflowdestination.cpp:53:2:53:7 | call to memcpy | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:53:15:53:17 | (const void *)... | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | +| overflowdestination.cpp:64:2:64:7 | call to memcpy | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:64:16:64:19 | (const void *)... | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-129/SAMATE/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-129/SAMATE/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected index 008ff07b800..5f8be65d740 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-129/SAMATE/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-129/SAMATE/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected @@ -1 +1,8 @@ -| CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:52:20:52:23 | data | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:30:19:30:29 | inputBuffer | User-provided value | +edges +| CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:30:19:30:29 | fgets output argument | CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:52:20:52:23 | data | +nodes +| CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:30:19:30:29 | fgets output argument | semmle.label | fgets output argument | +| CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:52:20:52:23 | data | semmle.label | data | +subpaths +#select +| CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:52:20:52:23 | data | CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:30:19:30:29 | fgets output argument | CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:52:20:52:23 | data | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | CWE122_Heap_Based_Buffer_Overflow__c_CWE129_fgets_01.c:30:19:30:29 | fgets output argument | String read by fgets | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-129/semmle/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-129/semmle/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected index 8efbc165c86..97aa43e7bd1 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-129/semmle/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-129/semmle/ImproperArrayIndexValidation/ImproperArrayIndexValidation.expected @@ -1,3 +1,26 @@ -| test1.c:18:16:18:16 | i | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | User-provided value | -| test1.c:33:11:33:11 | i | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | User-provided value | -| test1.c:53:15:53:15 | j | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | User-provided value | +edges +| test1.c:8:16:8:19 | argv | test1.c:9:9:9:9 | i | +| test1.c:8:16:8:19 | argv | test1.c:11:9:11:9 | i | +| test1.c:8:16:8:19 | argv | test1.c:13:9:13:9 | i | +| test1.c:9:9:9:9 | i | test1.c:16:16:16:16 | i | +| test1.c:11:9:11:9 | i | test1.c:32:16:32:16 | i | +| test1.c:13:9:13:9 | i | test1.c:48:16:48:16 | i | +| test1.c:16:16:16:16 | i | test1.c:18:16:18:16 | i | +| test1.c:32:16:32:16 | i | test1.c:33:11:33:11 | i | +| test1.c:48:16:48:16 | i | test1.c:53:15:53:15 | j | +nodes +| test1.c:8:16:8:19 | argv | semmle.label | argv | +| test1.c:9:9:9:9 | i | semmle.label | i | +| test1.c:11:9:11:9 | i | semmle.label | i | +| test1.c:13:9:13:9 | i | semmle.label | i | +| test1.c:16:16:16:16 | i | semmle.label | i | +| test1.c:18:16:18:16 | i | semmle.label | i | +| test1.c:32:16:32:16 | i | semmle.label | i | +| test1.c:33:11:33:11 | i | semmle.label | i | +| test1.c:48:16:48:16 | i | semmle.label | i | +| test1.c:53:15:53:15 | j | semmle.label | j | +subpaths +#select +| test1.c:18:16:18:16 | i | test1.c:8:16:8:19 | argv | test1.c:18:16:18:16 | i | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | a command-line argument | +| test1.c:33:11:33:11 | i | test1.c:8:16:8:19 | argv | test1.c:33:11:33:11 | i | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | a command-line argument | +| test1.c:53:15:53:15 | j | test1.c:8:16:8:19 | argv | test1.c:53:15:53:15 | j | $@ flows to here and is used in an array indexing expression, potentially causing an invalid access. | test1.c:8:16:8:19 | argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize/TaintedAllocationSize.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize/TaintedAllocationSize.expected index 2bee2123b7c..aa131cca152 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize/TaintedAllocationSize.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize/TaintedAllocationSize.expected @@ -1,62 +1,20 @@ edges -| test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | (size_t)... | -| test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | (size_t)... | -| test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | -| test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | -| test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | | test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | | test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | -| test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | -| test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | -| test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | | test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | -| test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | -| test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | -| test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | -| test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | (size_t)... | -| test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | (size_t)... | -| test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | | test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | | test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | -| test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | -| test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | -| test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | | test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | | test.cpp:124:18:124:23 | call to getenv | test.cpp:128:24:128:41 | ... * ... | -| test.cpp:124:18:124:23 | call to getenv | test.cpp:128:24:128:41 | ... * ... | -| test.cpp:124:18:124:31 | (const char *)... | test.cpp:128:24:128:41 | ... * ... | -| test.cpp:124:18:124:31 | (const char *)... | test.cpp:128:24:128:41 | ... * ... | | test.cpp:133:19:133:24 | call to getenv | test.cpp:135:10:135:27 | ... * ... | -| test.cpp:133:19:133:24 | call to getenv | test.cpp:135:10:135:27 | ... * ... | -| test.cpp:133:19:133:32 | (const char *)... | test.cpp:135:10:135:27 | ... * ... | -| test.cpp:133:19:133:32 | (const char *)... | test.cpp:135:10:135:27 | ... * ... | | test.cpp:148:20:148:25 | call to getenv | test.cpp:152:11:152:28 | ... * ... | -| test.cpp:148:20:148:25 | call to getenv | test.cpp:152:11:152:28 | ... * ... | -| test.cpp:148:20:148:33 | (const char *)... | test.cpp:152:11:152:28 | ... * ... | -| test.cpp:148:20:148:33 | (const char *)... | test.cpp:152:11:152:28 | ... * ... | -| test.cpp:209:8:209:23 | ReturnValue | test.cpp:241:9:241:24 | call to get_tainted_size | | test.cpp:209:8:209:23 | ReturnValue | test.cpp:241:9:241:24 | call to get_tainted_size | | test.cpp:211:14:211:19 | call to getenv | test.cpp:209:8:209:23 | ReturnValue | -| test.cpp:211:14:211:27 | (const char *)... | test.cpp:209:8:209:23 | ReturnValue | -| test.cpp:224:23:224:23 | s | test.cpp:225:21:225:21 | s | | test.cpp:224:23:224:23 | s | test.cpp:225:21:225:21 | s | | test.cpp:230:21:230:21 | s | test.cpp:231:21:231:21 | s | -| test.cpp:230:21:230:21 | s | test.cpp:231:21:231:21 | s | -| test.cpp:237:24:237:29 | call to getenv | test.cpp:239:9:239:18 | (size_t)... | -| test.cpp:237:24:237:29 | call to getenv | test.cpp:239:9:239:18 | local_size | | test.cpp:237:24:237:29 | call to getenv | test.cpp:239:9:239:18 | local_size | | test.cpp:237:24:237:29 | call to getenv | test.cpp:245:11:245:20 | local_size | | test.cpp:237:24:237:29 | call to getenv | test.cpp:247:10:247:19 | local_size | -| test.cpp:237:24:237:37 | (const char *)... | test.cpp:239:9:239:18 | (size_t)... | -| test.cpp:237:24:237:37 | (const char *)... | test.cpp:239:9:239:18 | local_size | -| test.cpp:237:24:237:37 | (const char *)... | test.cpp:239:9:239:18 | local_size | -| test.cpp:237:24:237:37 | (const char *)... | test.cpp:245:11:245:20 | local_size | -| test.cpp:237:24:237:37 | (const char *)... | test.cpp:247:10:247:19 | local_size | | test.cpp:245:11:245:20 | local_size | test.cpp:224:23:224:23 | s | | test.cpp:247:10:247:19 | local_size | test.cpp:230:21:230:21 | s | | test.cpp:251:2:251:9 | (reference dereference) [post update] | test.cpp:289:17:289:20 | size [post update] | @@ -64,112 +22,57 @@ edges | test.cpp:251:18:251:23 | call to getenv | test.cpp:251:2:251:9 | (reference dereference) [post update] | | test.cpp:251:18:251:23 | call to getenv | test.cpp:289:17:289:20 | size [post update] | | test.cpp:251:18:251:23 | call to getenv | test.cpp:305:18:305:21 | size [post update] | -| test.cpp:251:18:251:31 | (const char *)... | test.cpp:251:2:251:9 | (reference dereference) [post update] | -| test.cpp:251:18:251:31 | (const char *)... | test.cpp:289:17:289:20 | size [post update] | -| test.cpp:251:18:251:31 | (const char *)... | test.cpp:305:18:305:21 | size [post update] | | test.cpp:259:20:259:25 | call to getenv | test.cpp:263:11:263:29 | ... * ... | -| test.cpp:259:20:259:25 | call to getenv | test.cpp:263:11:263:29 | ... * ... | -| test.cpp:259:20:259:33 | (const char *)... | test.cpp:263:11:263:29 | ... * ... | -| test.cpp:259:20:259:33 | (const char *)... | test.cpp:263:11:263:29 | ... * ... | -| test.cpp:289:17:289:20 | size [post update] | test.cpp:291:11:291:28 | ... * ... | | test.cpp:289:17:289:20 | size [post update] | test.cpp:291:11:291:28 | ... * ... | | test.cpp:305:18:305:21 | size [post update] | test.cpp:308:10:308:27 | ... * ... | -| test.cpp:305:18:305:21 | size [post update] | test.cpp:308:10:308:27 | ... * ... | -subpaths nodes | test.cpp:40:21:40:24 | argv | semmle.label | argv | -| test.cpp:40:21:40:24 | argv | semmle.label | argv | -| test.cpp:43:38:43:44 | (size_t)... | semmle.label | (size_t)... | -| test.cpp:43:38:43:44 | (size_t)... | semmle.label | (size_t)... | -| test.cpp:43:38:43:44 | tainted | semmle.label | tainted | -| test.cpp:43:38:43:44 | tainted | semmle.label | tainted | | test.cpp:43:38:43:44 | tainted | semmle.label | tainted | | test.cpp:44:38:44:63 | ... * ... | semmle.label | ... * ... | -| test.cpp:44:38:44:63 | ... * ... | semmle.label | ... * ... | -| test.cpp:44:38:44:63 | ... * ... | semmle.label | ... * ... | | test.cpp:46:38:46:63 | ... + ... | semmle.label | ... + ... | -| test.cpp:46:38:46:63 | ... + ... | semmle.label | ... + ... | -| test.cpp:46:38:46:63 | ... + ... | semmle.label | ... + ... | -| test.cpp:49:32:49:35 | (size_t)... | semmle.label | (size_t)... | -| test.cpp:49:32:49:35 | (size_t)... | semmle.label | (size_t)... | -| test.cpp:49:32:49:35 | size | semmle.label | size | -| test.cpp:49:32:49:35 | size | semmle.label | size | | test.cpp:49:32:49:35 | size | semmle.label | size | | test.cpp:50:26:50:29 | size | semmle.label | size | -| test.cpp:50:26:50:29 | size | semmle.label | size | -| test.cpp:50:26:50:29 | size | semmle.label | size | -| test.cpp:53:35:53:60 | ... * ... | semmle.label | ... * ... | -| test.cpp:53:35:53:60 | ... * ... | semmle.label | ... * ... | | test.cpp:53:35:53:60 | ... * ... | semmle.label | ... * ... | | test.cpp:124:18:124:23 | call to getenv | semmle.label | call to getenv | -| test.cpp:124:18:124:31 | (const char *)... | semmle.label | (const char *)... | -| test.cpp:128:24:128:41 | ... * ... | semmle.label | ... * ... | -| test.cpp:128:24:128:41 | ... * ... | semmle.label | ... * ... | | test.cpp:128:24:128:41 | ... * ... | semmle.label | ... * ... | | test.cpp:133:19:133:24 | call to getenv | semmle.label | call to getenv | -| test.cpp:133:19:133:32 | (const char *)... | semmle.label | (const char *)... | -| test.cpp:135:10:135:27 | ... * ... | semmle.label | ... * ... | -| test.cpp:135:10:135:27 | ... * ... | semmle.label | ... * ... | | test.cpp:135:10:135:27 | ... * ... | semmle.label | ... * ... | | test.cpp:148:20:148:25 | call to getenv | semmle.label | call to getenv | -| test.cpp:148:20:148:33 | (const char *)... | semmle.label | (const char *)... | -| test.cpp:152:11:152:28 | ... * ... | semmle.label | ... * ... | -| test.cpp:152:11:152:28 | ... * ... | semmle.label | ... * ... | | test.cpp:152:11:152:28 | ... * ... | semmle.label | ... * ... | | test.cpp:209:8:209:23 | ReturnValue | semmle.label | ReturnValue | | test.cpp:211:14:211:19 | call to getenv | semmle.label | call to getenv | -| test.cpp:211:14:211:27 | (const char *)... | semmle.label | (const char *)... | | test.cpp:224:23:224:23 | s | semmle.label | s | | test.cpp:225:21:225:21 | s | semmle.label | s | -| test.cpp:225:21:225:21 | s | semmle.label | s | -| test.cpp:225:21:225:21 | s | semmle.label | s | | test.cpp:230:21:230:21 | s | semmle.label | s | | test.cpp:231:21:231:21 | s | semmle.label | s | -| test.cpp:231:21:231:21 | s | semmle.label | s | -| test.cpp:231:21:231:21 | s | semmle.label | s | | test.cpp:237:24:237:29 | call to getenv | semmle.label | call to getenv | -| test.cpp:237:24:237:37 | (const char *)... | semmle.label | (const char *)... | -| test.cpp:239:9:239:18 | (size_t)... | semmle.label | (size_t)... | -| test.cpp:239:9:239:18 | (size_t)... | semmle.label | (size_t)... | | test.cpp:239:9:239:18 | local_size | semmle.label | local_size | -| test.cpp:239:9:239:18 | local_size | semmle.label | local_size | -| test.cpp:239:9:239:18 | local_size | semmle.label | local_size | -| test.cpp:241:9:241:24 | call to get_tainted_size | semmle.label | call to get_tainted_size | -| test.cpp:241:9:241:24 | call to get_tainted_size | semmle.label | call to get_tainted_size | | test.cpp:241:9:241:24 | call to get_tainted_size | semmle.label | call to get_tainted_size | | test.cpp:245:11:245:20 | local_size | semmle.label | local_size | | test.cpp:247:10:247:19 | local_size | semmle.label | local_size | | test.cpp:251:2:251:9 | (reference dereference) [post update] | semmle.label | (reference dereference) [post update] | -| test.cpp:251:2:251:9 | out_size [post update] | semmle.label | out_size [post update] | | test.cpp:251:18:251:23 | call to getenv | semmle.label | call to getenv | -| test.cpp:251:18:251:31 | (const char *)... | semmle.label | (const char *)... | | test.cpp:259:20:259:25 | call to getenv | semmle.label | call to getenv | -| test.cpp:259:20:259:33 | (const char *)... | semmle.label | (const char *)... | -| test.cpp:263:11:263:29 | ... * ... | semmle.label | ... * ... | -| test.cpp:263:11:263:29 | ... * ... | semmle.label | ... * ... | | test.cpp:263:11:263:29 | ... * ... | semmle.label | ... * ... | | test.cpp:289:17:289:20 | size [post update] | semmle.label | size [post update] | | test.cpp:291:11:291:28 | ... * ... | semmle.label | ... * ... | -| test.cpp:291:11:291:28 | ... * ... | semmle.label | ... * ... | -| test.cpp:291:11:291:28 | ... * ... | semmle.label | ... * ... | | test.cpp:305:18:305:21 | size [post update] | semmle.label | size [post update] | | test.cpp:308:10:308:27 | ... * ... | semmle.label | ... * ... | -| test.cpp:308:10:308:27 | ... * ... | semmle.label | ... * ... | -| test.cpp:308:10:308:27 | ... * ... | semmle.label | ... * ... | +subpaths #select -| test.cpp:43:31:43:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:44:31:44:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:46:31:46:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:49:25:49:30 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:50:17:50:30 | new[] | test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:53:21:53:27 | call to realloc | test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (argv) | -| test.cpp:128:17:128:22 | call to malloc | test.cpp:124:18:124:23 | call to getenv | test.cpp:128:24:128:41 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:124:18:124:23 | call to getenv | user input (getenv) | -| test.cpp:135:3:135:8 | call to malloc | test.cpp:133:19:133:24 | call to getenv | test.cpp:135:10:135:27 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:133:19:133:24 | call to getenv | user input (getenv) | -| test.cpp:152:4:152:9 | call to malloc | test.cpp:148:20:148:25 | call to getenv | test.cpp:152:11:152:28 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:148:20:148:25 | call to getenv | user input (getenv) | -| test.cpp:225:14:225:19 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:225:21:225:21 | s | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (getenv) | -| test.cpp:231:14:231:19 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:231:21:231:21 | s | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (getenv) | -| test.cpp:239:2:239:7 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:239:9:239:18 | local_size | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (getenv) | -| test.cpp:241:2:241:7 | call to malloc | test.cpp:211:14:211:19 | call to getenv | test.cpp:241:9:241:24 | call to get_tainted_size | This allocation size is derived from $@ and might overflow | test.cpp:211:14:211:19 | call to getenv | user input (getenv) | -| test.cpp:263:4:263:9 | call to malloc | test.cpp:259:20:259:25 | call to getenv | test.cpp:263:11:263:29 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:259:20:259:25 | call to getenv | user input (getenv) | -| test.cpp:291:4:291:9 | call to malloc | test.cpp:251:18:251:23 | call to getenv | test.cpp:291:11:291:28 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:251:18:251:23 | call to getenv | user input (getenv) | -| test.cpp:308:3:308:8 | call to malloc | test.cpp:251:18:251:23 | call to getenv | test.cpp:308:10:308:27 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:251:18:251:23 | call to getenv | user input (getenv) | +| test.cpp:43:31:43:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:43:38:43:44 | tainted | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:44:31:44:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:44:38:44:63 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:46:31:46:36 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:46:38:46:63 | ... + ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:49:25:49:30 | call to malloc | test.cpp:40:21:40:24 | argv | test.cpp:49:32:49:35 | size | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:50:17:50:30 | new[] | test.cpp:40:21:40:24 | argv | test.cpp:50:26:50:29 | size | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:53:21:53:27 | call to realloc | test.cpp:40:21:40:24 | argv | test.cpp:53:35:53:60 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:40:21:40:24 | argv | user input (a command-line argument) | +| test.cpp:128:17:128:22 | call to malloc | test.cpp:124:18:124:23 | call to getenv | test.cpp:128:24:128:41 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:124:18:124:23 | call to getenv | user input (an environment variable) | +| test.cpp:135:3:135:8 | call to malloc | test.cpp:133:19:133:24 | call to getenv | test.cpp:135:10:135:27 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:133:19:133:24 | call to getenv | user input (an environment variable) | +| test.cpp:152:4:152:9 | call to malloc | test.cpp:148:20:148:25 | call to getenv | test.cpp:152:11:152:28 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:148:20:148:25 | call to getenv | user input (an environment variable) | +| test.cpp:225:14:225:19 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:225:21:225:21 | s | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (an environment variable) | +| test.cpp:231:14:231:19 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:231:21:231:21 | s | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (an environment variable) | +| test.cpp:239:2:239:7 | call to malloc | test.cpp:237:24:237:29 | call to getenv | test.cpp:239:9:239:18 | local_size | This allocation size is derived from $@ and might overflow | test.cpp:237:24:237:29 | call to getenv | user input (an environment variable) | +| test.cpp:241:2:241:7 | call to malloc | test.cpp:211:14:211:19 | call to getenv | test.cpp:241:9:241:24 | call to get_tainted_size | This allocation size is derived from $@ and might overflow | test.cpp:211:14:211:19 | call to getenv | user input (an environment variable) | +| test.cpp:263:4:263:9 | call to malloc | test.cpp:259:20:259:25 | call to getenv | test.cpp:263:11:263:29 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:259:20:259:25 | call to getenv | user input (an environment variable) | +| test.cpp:291:4:291:9 | call to malloc | test.cpp:251:18:251:23 | call to getenv | test.cpp:291:11:291:28 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:251:18:251:23 | call to getenv | user input (an environment variable) | +| test.cpp:308:3:308:8 | call to malloc | test.cpp:251:18:251:23 | call to getenv | test.cpp:308:10:308:27 | ... * ... | This allocation size is derived from $@ and might overflow | test.cpp:251:18:251:23 | call to getenv | user input (an environment variable) | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected index c668b166058..5fc5f82768e 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected @@ -7,6 +7,7 @@ edges nodes | test2.cpp:43:36:43:43 | password | semmle.label | password | | test2.cpp:44:37:44:45 | thepasswd | semmle.label | thepasswd | +| test2.cpp:45:38:45:47 | accountkey | semmle.label | accountkey | | test2.cpp:50:41:50:53 | passwd_config | semmle.label | passwd_config | | test2.cpp:52:40:52:58 | * ... | semmle.label | * ... | | test2.cpp:52:44:52:57 | password_tries | semmle.label | password_tries | @@ -29,6 +30,7 @@ subpaths #select | test2.cpp:43:2:43:8 | call to fprintf | test2.cpp:43:36:43:43 | password | test2.cpp:43:36:43:43 | password | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:43:36:43:43 | password | this source. | | test2.cpp:44:2:44:8 | call to fprintf | test2.cpp:44:37:44:45 | thepasswd | test2.cpp:44:37:44:45 | thepasswd | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:44:37:44:45 | thepasswd | this source. | +| test2.cpp:45:2:45:8 | call to fprintf | test2.cpp:45:38:45:47 | accountkey | test2.cpp:45:38:45:47 | accountkey | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:45:38:45:47 | accountkey | this source. | | test2.cpp:50:2:50:8 | call to fprintf | test2.cpp:50:41:50:53 | passwd_config | test2.cpp:50:41:50:53 | passwd_config | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:50:41:50:53 | passwd_config | this source. | | test2.cpp:54:2:54:8 | call to fprintf | test2.cpp:54:41:54:52 | widepassword | test2.cpp:54:41:54:52 | widepassword | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:54:41:54:52 | widepassword | this source. | | test2.cpp:55:2:55:8 | call to fprintf | test2.cpp:55:40:55:51 | widepassword | test2.cpp:55:40:55:51 | widepassword | This write into file 'log' may contain unencrypted data from $@ | test2.cpp:55:40:55:51 | widepassword | this source. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextTransmission.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextTransmission.expected index a63099bb875..1f169ec05d7 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextTransmission.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextTransmission.expected @@ -92,6 +92,12 @@ edges | test3.cpp:398:18:398:25 | password | test3.cpp:400:33:400:40 | password | | test3.cpp:421:21:421:28 | password | test3.cpp:421:3:421:17 | call to decrypt_inplace | | test3.cpp:429:7:429:14 | password | test3.cpp:431:8:431:15 | password | +| test3.cpp:526:44:526:54 | my_latitude | test3.cpp:527:15:527:20 | buffer | +| test3.cpp:532:45:532:58 | home_longitude | test3.cpp:533:15:533:20 | buffer | +| test3.cpp:551:47:551:58 | salaryString | test3.cpp:552:15:552:20 | buffer | +| test3.cpp:556:19:556:30 | salaryString | test3.cpp:559:15:559:20 | buffer | +| test3.cpp:571:8:571:21 | call to get_home_phone | test3.cpp:572:14:572:16 | str | +| test3.cpp:577:8:577:23 | call to get_home_address | test3.cpp:578:14:578:16 | str | | test.cpp:41:23:41:43 | cleartext password! | test.cpp:48:21:48:27 | call to encrypt | | test.cpp:41:23:41:43 | cleartext password! | test.cpp:48:29:48:39 | thePassword | | test.cpp:66:23:66:43 | cleartext password! | test.cpp:76:21:76:27 | call to encrypt | @@ -221,6 +227,30 @@ nodes | test3.cpp:421:21:421:28 | password | semmle.label | password | | test3.cpp:429:7:429:14 | password | semmle.label | password | | test3.cpp:431:8:431:15 | password | semmle.label | password | +| test3.cpp:507:18:507:39 | social_security_number | semmle.label | social_security_number | +| test3.cpp:508:18:508:33 | socialSecurityNo | semmle.label | socialSecurityNo | +| test3.cpp:509:18:509:29 | homePostCode | semmle.label | homePostCode | +| test3.cpp:510:18:510:28 | my_zip_code | semmle.label | my_zip_code | +| test3.cpp:511:18:511:26 | telephone | semmle.label | telephone | +| test3.cpp:512:18:512:36 | mobile_phone_number | semmle.label | mobile_phone_number | +| test3.cpp:513:18:513:22 | email | semmle.label | email | +| test3.cpp:514:18:514:38 | my_credit_card_number | semmle.label | my_credit_card_number | +| test3.cpp:515:18:515:35 | my_bank_account_no | semmle.label | my_bank_account_no | +| test3.cpp:516:18:516:29 | employerName | semmle.label | employerName | +| test3.cpp:517:18:517:29 | medical_info | semmle.label | medical_info | +| test3.cpp:518:18:518:28 | license_key | semmle.label | license_key | +| test3.cpp:526:44:526:54 | my_latitude | semmle.label | my_latitude | +| test3.cpp:527:15:527:20 | buffer | semmle.label | buffer | +| test3.cpp:532:45:532:58 | home_longitude | semmle.label | home_longitude | +| test3.cpp:533:15:533:20 | buffer | semmle.label | buffer | +| test3.cpp:551:47:551:58 | salaryString | semmle.label | salaryString | +| test3.cpp:552:15:552:20 | buffer | semmle.label | buffer | +| test3.cpp:556:19:556:30 | salaryString | semmle.label | salaryString | +| test3.cpp:559:15:559:20 | buffer | semmle.label | buffer | +| test3.cpp:571:8:571:21 | call to get_home_phone | semmle.label | call to get_home_phone | +| test3.cpp:572:14:572:16 | str | semmle.label | str | +| test3.cpp:577:8:577:23 | call to get_home_address | semmle.label | call to get_home_address | +| test3.cpp:578:14:578:16 | str | semmle.label | str | | test.cpp:41:23:41:43 | cleartext password! | semmle.label | cleartext password! | | test.cpp:48:21:48:27 | call to encrypt | semmle.label | call to encrypt | | test.cpp:48:29:48:39 | thePassword | semmle.label | thePassword | @@ -254,3 +284,21 @@ subpaths | test3.cpp:414:3:414:6 | call to recv | test3.cpp:414:17:414:24 | password | test3.cpp:414:17:414:24 | password | This operation receives into 'password', which may put unencrypted sensitive data into $@ | test3.cpp:414:17:414:24 | password | password | | test3.cpp:420:3:420:6 | call to recv | test3.cpp:420:17:420:24 | password | test3.cpp:420:17:420:24 | password | This operation receives into 'password', which may put unencrypted sensitive data into $@ | test3.cpp:420:17:420:24 | password | password | | test3.cpp:431:2:431:6 | call to fgets | test3.cpp:429:7:429:14 | password | test3.cpp:431:8:431:15 | password | This operation receives into 'password', which may put unencrypted sensitive data into $@ | test3.cpp:429:7:429:14 | password | password | +| test3.cpp:507:2:507:5 | call to send | test3.cpp:507:18:507:39 | social_security_number | test3.cpp:507:18:507:39 | social_security_number | This operation transmits 'social_security_number', which may contain unencrypted sensitive data from $@ | test3.cpp:507:18:507:39 | social_security_number | social_security_number | +| test3.cpp:508:2:508:5 | call to send | test3.cpp:508:18:508:33 | socialSecurityNo | test3.cpp:508:18:508:33 | socialSecurityNo | This operation transmits 'socialSecurityNo', which may contain unencrypted sensitive data from $@ | test3.cpp:508:18:508:33 | socialSecurityNo | socialSecurityNo | +| test3.cpp:509:2:509:5 | call to send | test3.cpp:509:18:509:29 | homePostCode | test3.cpp:509:18:509:29 | homePostCode | This operation transmits 'homePostCode', which may contain unencrypted sensitive data from $@ | test3.cpp:509:18:509:29 | homePostCode | homePostCode | +| test3.cpp:510:2:510:5 | call to send | test3.cpp:510:18:510:28 | my_zip_code | test3.cpp:510:18:510:28 | my_zip_code | This operation transmits 'my_zip_code', which may contain unencrypted sensitive data from $@ | test3.cpp:510:18:510:28 | my_zip_code | my_zip_code | +| test3.cpp:511:2:511:5 | call to send | test3.cpp:511:18:511:26 | telephone | test3.cpp:511:18:511:26 | telephone | This operation transmits 'telephone', which may contain unencrypted sensitive data from $@ | test3.cpp:511:18:511:26 | telephone | telephone | +| test3.cpp:512:2:512:5 | call to send | test3.cpp:512:18:512:36 | mobile_phone_number | test3.cpp:512:18:512:36 | mobile_phone_number | This operation transmits 'mobile_phone_number', which may contain unencrypted sensitive data from $@ | test3.cpp:512:18:512:36 | mobile_phone_number | mobile_phone_number | +| test3.cpp:513:2:513:5 | call to send | test3.cpp:513:18:513:22 | email | test3.cpp:513:18:513:22 | email | This operation transmits 'email', which may contain unencrypted sensitive data from $@ | test3.cpp:513:18:513:22 | email | email | +| test3.cpp:514:2:514:5 | call to send | test3.cpp:514:18:514:38 | my_credit_card_number | test3.cpp:514:18:514:38 | my_credit_card_number | This operation transmits 'my_credit_card_number', which may contain unencrypted sensitive data from $@ | test3.cpp:514:18:514:38 | my_credit_card_number | my_credit_card_number | +| test3.cpp:515:2:515:5 | call to send | test3.cpp:515:18:515:35 | my_bank_account_no | test3.cpp:515:18:515:35 | my_bank_account_no | This operation transmits 'my_bank_account_no', which may contain unencrypted sensitive data from $@ | test3.cpp:515:18:515:35 | my_bank_account_no | my_bank_account_no | +| test3.cpp:516:2:516:5 | call to send | test3.cpp:516:18:516:29 | employerName | test3.cpp:516:18:516:29 | employerName | This operation transmits 'employerName', which may contain unencrypted sensitive data from $@ | test3.cpp:516:18:516:29 | employerName | employerName | +| test3.cpp:517:2:517:5 | call to send | test3.cpp:517:18:517:29 | medical_info | test3.cpp:517:18:517:29 | medical_info | This operation transmits 'medical_info', which may contain unencrypted sensitive data from $@ | test3.cpp:517:18:517:29 | medical_info | medical_info | +| test3.cpp:518:2:518:5 | call to send | test3.cpp:518:18:518:28 | license_key | test3.cpp:518:18:518:28 | license_key | This operation transmits 'license_key', which may contain unencrypted sensitive data from $@ | test3.cpp:518:18:518:28 | license_key | license_key | +| test3.cpp:527:3:527:6 | call to send | test3.cpp:526:44:526:54 | my_latitude | test3.cpp:527:15:527:20 | buffer | This operation transmits 'buffer', which may contain unencrypted sensitive data from $@ | test3.cpp:526:44:526:54 | my_latitude | my_latitude | +| test3.cpp:533:3:533:6 | call to send | test3.cpp:532:45:532:58 | home_longitude | test3.cpp:533:15:533:20 | buffer | This operation transmits 'buffer', which may contain unencrypted sensitive data from $@ | test3.cpp:532:45:532:58 | home_longitude | home_longitude | +| test3.cpp:552:3:552:6 | call to send | test3.cpp:551:47:551:58 | salaryString | test3.cpp:552:15:552:20 | buffer | This operation transmits 'buffer', which may contain unencrypted sensitive data from $@ | test3.cpp:551:47:551:58 | salaryString | salaryString | +| test3.cpp:559:3:559:6 | call to send | test3.cpp:556:19:556:30 | salaryString | test3.cpp:559:15:559:20 | buffer | This operation transmits 'buffer', which may contain unencrypted sensitive data from $@ | test3.cpp:556:19:556:30 | salaryString | salaryString | +| test3.cpp:572:2:572:5 | call to send | test3.cpp:571:8:571:21 | call to get_home_phone | test3.cpp:572:14:572:16 | str | This operation transmits 'str', which may contain unencrypted sensitive data from $@ | test3.cpp:571:8:571:21 | call to get_home_phone | call to get_home_phone | +| test3.cpp:578:2:578:5 | call to send | test3.cpp:577:8:577:23 | call to get_home_address | test3.cpp:578:14:578:16 | str | This operation transmits 'str', which may contain unencrypted sensitive data from $@ | test3.cpp:577:8:577:23 | call to get_home_address | call to get_home_address | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp index 7736ed1b665..0220b8d09eb 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp @@ -42,7 +42,7 @@ void tests(FILE *log, myStruct &s) { fprintf(log, "password = %s\n", s.password); // BAD fprintf(log, "thepasswd = %s\n", s.thepasswd); // BAD - fprintf(log, "accountkey = %s\n", s.accountkey); // DUBIOUS [NOT REPORTED] + fprintf(log, "accountkey = %s\n", s.accountkey); // BAD fprintf(log, "password_hash = %s\n", s.password_hash); // GOOD fprintf(log, "encrypted_passwd = %s\n", s.encrypted_passwd); // GOOD fprintf(log, "password_file = %s\n", s.password_file); // GOOD @@ -109,4 +109,4 @@ void test_gets() gets(password); // BAD } -} \ No newline at end of file +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp index f54d2a09e8d..70630bbb4c4 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp @@ -5,7 +5,7 @@ typedef unsigned long size_t; int stdout_fileno = STDOUT_FILENO; size_t strlen(const char *s); - +int snprintf(char *s, size_t n, const char *format, ...); void send(int fd, const void *buf, size_t bufLen, int d); void recv(int fd, void *buf, size_t bufLen, int d); void read(int fd, void *buf, size_t bufLen); @@ -474,3 +474,106 @@ void test_tty() recv(f, password, 256, val()); // GOOD: from terminal or stdin } } + +// --- + +struct person_info +{ + // sensitive + char *social_security_number; + char *socialSecurityNo; + char *homePostCode; + char *my_zip_code; + char *telephone; + char *mobile_phone_number; + char *email; + char *my_credit_card_number; + char *my_bank_account_no; + char *employerName; + char medical_info[8 * 1024]; + char *license_key; + double my_latitude; + double home_longitude; + int newSalary; + char *salaryString; + // not sensitive + char *license_key_hash; + char *my_zip_file; +}; + +void tests2(person_info *pi) +{ + // direct cases + send(val(), pi->social_security_number, strlen(pi->social_security_number), val()); // BAD + send(val(), pi->socialSecurityNo, strlen(pi->socialSecurityNo), val()); // BAD + send(val(), pi->homePostCode, strlen(pi->homePostCode), val()); // BAD + send(val(), pi->my_zip_code, strlen(pi->my_zip_code), val()); // BAD + send(val(), pi->telephone, strlen(pi->telephone), val()); // BAD + send(val(), pi->mobile_phone_number, strlen(pi->mobile_phone_number), val()); // BAD + send(val(), pi->email, strlen(pi->email), val()); // BAD + send(val(), pi->my_credit_card_number, strlen(pi->my_credit_card_number), val()); // BAD + send(val(), pi->my_bank_account_no, strlen(pi->my_bank_account_no), val()); // BAD + send(val(), pi->employerName, strlen(pi->employerName), val()); // BAD + send(val(), pi->medical_info, strlen(pi->medical_info), val()); // BAD + send(val(), pi->license_key, strlen(pi->license_key), val()); // BAD + send(val(), pi->license_key_hash, strlen(pi->license_key_hash), val()); // GOOD + send(val(), pi->my_zip_file, strlen(pi->my_zip_file), val()); // GOOD + + // indirect cases + { + char buffer[1024]; + + snprintf(buffer, 1024, "lat = %f\n", pi->my_latitude); + send(val(), buffer, strlen(buffer), val()); // BAD + } + { + char buffer[1024]; + + snprintf(buffer, 1024, "long = %f\n", pi->home_longitude); + send(val(), buffer, strlen(buffer), val()); // BAD + } + { + char buffer[1024]; + + snprintf(buffer, 1024, "salary = %i\n", pi->newSalary); + send(val(), buffer, strlen(buffer), val()); // BAD [NOT DETECTED] + } + { + char buffer[1024]; + int sal = pi->newSalary; + + snprintf(buffer, 1024, "salary = %i\n", sal); + send(val(), buffer, strlen(buffer), val()); // BAD [NOT DETECTED] + } + { + char buffer[1024]; + + snprintf(buffer, 1024, "salary = %s\n", pi->salaryString); + send(val(), buffer, strlen(buffer), val()); // BAD + } + { + char buffer[1024]; + char *sal = pi->salaryString; + + snprintf(buffer, 1024, "salary = %s\n", sal); + send(val(), buffer, strlen(buffer), val()); // BAD + } +} + +const char *get_home_phone(); +const char *get_home(); +const char *get_home_address(); + +void tests3() +{ + const char *str; + + str = get_home_phone(); + send(val(), str, strlen(str), val()); // BAD + + str = get_home(); + send(val(), str, strlen(str), val()); // GOOD (probably not personal info) + + str = get_home_address(); + send(val(), str, strlen(str), val()); // BAD +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.expected new file mode 100644 index 00000000000..ca20f65bec7 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.expected @@ -0,0 +1,10 @@ +edges +nodes +| test.cpp:34:45:34:48 | 1024 | semmle.label | 1024 | +| test.cpp:35:49:35:52 | 1024 | semmle.label | 1024 | +| test.cpp:37:43:37:46 | 1024 | semmle.label | 1024 | +subpaths +#select +| test.cpp:34:5:34:38 | call to EVP_PKEY_CTX_set_dsa_paramgen_bits | test.cpp:34:45:34:48 | 1024 | test.cpp:34:45:34:48 | 1024 | The key size $@ is less than the recommended key size of 2048 bits. | test.cpp:34:45:34:48 | 1024 | 1024 | +| test.cpp:35:5:35:42 | call to EVP_PKEY_CTX_set_dh_paramgen_prime_len | test.cpp:35:49:35:52 | 1024 | test.cpp:35:49:35:52 | 1024 | The key size $@ is less than the recommended key size of 2048 bits. | test.cpp:35:49:35:52 | 1024 | 1024 | +| test.cpp:37:5:37:36 | call to EVP_PKEY_CTX_set_rsa_keygen_bits | test.cpp:37:43:37:46 | 1024 | test.cpp:37:43:37:46 | 1024 | The key size $@ is less than the recommended key size of 2048 bits. | test.cpp:37:43:37:46 | 1024 | 1024 | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.qlref new file mode 100644 index 00000000000..e869f87150a --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-326/InsufficientKeySize.qlref @@ -0,0 +1 @@ +Security/CWE/CWE-326/InsufficientKeySize.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-326/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-326/test.cpp new file mode 100644 index 00000000000..18780fc05c0 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-326/test.cpp @@ -0,0 +1,38 @@ + + +typedef int EVP_CIPHER; +typedef int EVP_MD; + +const EVP_CIPHER *EVP_aes_128_ctr(); +const EVP_CIPHER *EVP_aes_192_ctr(); +const EVP_CIPHER *EVP_aes_256_ctr(); + +const EVP_MD *EVP_sha224(); +const EVP_MD *EVP_sha256(); +const EVP_MD *EVP_sha384(); +const EVP_MD *EVP_sha512(); + + +class EVP_PKEY_CTX; + + // int is a curve ID rather than a bit width +int EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX*, int); + +int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX*, int); +int EVP_PKEY_CTX_set_dh_paramgen_prime_len(EVP_PKEY_CTX*, int); + +// RSA sets bits per-key rather than with parameters +int EVP_PKEY_CTX_set_rsa_keygen_bits(EVP_PKEY_CTX*, int); + +void test1(EVP_PKEY_CTX *ctx) { + EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, 2048); + EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, 2048); + // RSA sets bits per-key rather than with parameters + EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048); + + // low key sizes + EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, 1024); + EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, 1024); + // RSA sets bits per-key rather than with parameters + EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 1024); +} \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected index ffd6f77205e..e217064d1df 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected @@ -1 +1,4 @@ -| tests.c:70:9:70:15 | call to fprintf | This operation exposes system data from $@. | tests.c:54:13:54:22 | call to LogonUserA | call to LogonUserA | +edges +nodes +subpaths +#select diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected deleted file mode 100644 index fe7e5b34c77..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected +++ /dev/null @@ -1,7 +0,0 @@ -| tests.c:29:9:29:14 | call to printf | tests.c:29:16:29:21 | %s\n | -| tests.c:29:9:29:14 | call to printf | tests.c:29:24:29:27 | line | -| tests.c:43:13:43:21 | call to printLine | tests.c:43:23:43:38 | fgets() failed | -| tests.c:62:13:62:21 | call to printLine | tests.c:62:23:62:52 | User logged in successfully. | -| tests.c:67:13:67:21 | call to printLine | tests.c:67:23:67:40 | Unable to login. | -| tests.c:70:9:70:15 | call to fprintf | tests.c:70:25:70:67 | User attempted access with password: %s\n | -| tests.c:70:9:70:15 | call to fprintf | tests.c:70:70:70:77 | password | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql deleted file mode 100644 index d9e67a944e9..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql +++ /dev/null @@ -1,4 +0,0 @@ -import semmle.code.cpp.security.OutputWrite - -from OutputWrite ow -select ow, ow.getASource() diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.expected new file mode 100644 index 00000000000..baffc0303d3 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.expected @@ -0,0 +1,8 @@ +edges +| tests.c:57:21:57:28 | password | tests.c:70:70:70:77 | array to pointer conversion | +nodes +| tests.c:57:21:57:28 | password | semmle.label | password | +| tests.c:70:70:70:77 | array to pointer conversion | semmle.label | array to pointer conversion | +subpaths +#select +| tests.c:70:70:70:77 | array to pointer conversion | tests.c:57:21:57:28 | password | tests.c:70:70:70:77 | array to pointer conversion | This operation potentially exposes sensitive system data from $@. | tests.c:57:21:57:28 | password | password | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.qlref new file mode 100644 index 00000000000..4f7305ce697 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/PotentiallyExposedSystemData.qlref @@ -0,0 +1 @@ +Security/CWE/CWE-497/PotentiallyExposedSystemData.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected index 52ba5d9a63e..80b195bd0bd 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected @@ -1,2 +1,80 @@ -| tests2.cpp:27:12:27:12 | call to operator<< | This operation exposes system data from $@. | tests2.cpp:27:15:27:20 | call to getenv | call to getenv | -| tests2.cpp:28:25:28:25 | call to operator<< | This operation exposes system data from $@. | tests2.cpp:28:28:28:33 | call to getenv | call to getenv | +edges +| tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:26 | (const char *)... | +| tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:26 | (const char *)... | +| tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:30 | (const char *)... | +| tests2.cpp:66:13:66:18 | call to getenv | tests2.cpp:66:13:66:34 | (const char *)... | +| tests2.cpp:78:18:78:38 | call to mysql_get_client_info | tests2.cpp:81:14:81:19 | (const char *)... | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | +| tests2.cpp:91:42:91:45 | str1 | tests2.cpp:93:14:93:17 | str1 | +| tests2.cpp:101:8:101:15 | call to getpwuid | tests2.cpp:102:14:102:15 | pw | +| tests2.cpp:109:3:109:4 | c1 [post update] [ptr] | tests2.cpp:111:14:111:15 | c1 [read] [ptr] | +| tests2.cpp:109:6:109:8 | ptr [post update] | tests2.cpp:109:3:109:4 | c1 [post update] [ptr] | +| tests2.cpp:109:12:109:17 | call to getenv | tests2.cpp:109:6:109:8 | ptr [post update] | +| tests2.cpp:111:14:111:15 | c1 [read] [ptr] | tests2.cpp:111:14:111:19 | (const char *)... | +| tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:39:19:39:22 | (const void *)... | +| tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:39:19:39:22 | path | +| tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:43:20:43:23 | (const void *)... | +| tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:43:20:43:23 | path | +| tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:76:19:76:22 | (const void *)... | +| tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:76:19:76:22 | path | +| tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:80:20:80:23 | (const void *)... | +| tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:80:20:80:23 | path | +| tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | (const void *)... | +| tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | pathbuf | +nodes +| tests2.cpp:63:13:63:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:63:13:63:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:63:13:63:26 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:64:13:64:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:64:13:64:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:64:13:64:26 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:65:13:65:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:65:13:65:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:65:13:65:30 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:66:13:66:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:66:13:66:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:66:13:66:34 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:78:18:78:38 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:81:14:81:19 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:91:42:91:45 | str1 | semmle.label | str1 | +| tests2.cpp:93:14:93:17 | str1 | semmle.label | str1 | +| tests2.cpp:101:8:101:15 | call to getpwuid | semmle.label | call to getpwuid | +| tests2.cpp:102:14:102:15 | pw | semmle.label | pw | +| tests2.cpp:109:3:109:4 | c1 [post update] [ptr] | semmle.label | c1 [post update] [ptr] | +| tests2.cpp:109:6:109:8 | ptr [post update] | semmle.label | ptr [post update] | +| tests2.cpp:109:12:109:17 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:111:14:111:15 | c1 [read] [ptr] | semmle.label | c1 [read] [ptr] | +| tests2.cpp:111:14:111:19 | (const char *)... | semmle.label | (const char *)... | +| tests_sockets.cpp:26:15:26:20 | call to getenv | semmle.label | call to getenv | +| tests_sockets.cpp:39:19:39:22 | (const void *)... | semmle.label | (const void *)... | +| tests_sockets.cpp:39:19:39:22 | path | semmle.label | path | +| tests_sockets.cpp:43:20:43:23 | (const void *)... | semmle.label | (const void *)... | +| tests_sockets.cpp:43:20:43:23 | path | semmle.label | path | +| tests_sockets.cpp:63:15:63:20 | call to getenv | semmle.label | call to getenv | +| tests_sockets.cpp:76:19:76:22 | (const void *)... | semmle.label | (const void *)... | +| tests_sockets.cpp:76:19:76:22 | path | semmle.label | path | +| tests_sockets.cpp:80:20:80:23 | (const void *)... | semmle.label | (const void *)... | +| tests_sockets.cpp:80:20:80:23 | path | semmle.label | path | +| tests_sysconf.cpp:36:21:36:27 | confstr output argument | semmle.label | confstr output argument | +| tests_sysconf.cpp:39:19:39:25 | (const void *)... | semmle.label | (const void *)... | +| tests_sysconf.cpp:39:19:39:25 | pathbuf | semmle.label | pathbuf | +subpaths +#select +| tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:63:13:63:18 | call to getenv | call to getenv | +| tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:64:13:64:18 | call to getenv | call to getenv | +| tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:65:13:65:18 | call to getenv | call to getenv | +| tests2.cpp:66:13:66:18 | call to getenv | tests2.cpp:66:13:66:18 | call to getenv | tests2.cpp:66:13:66:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:66:13:66:18 | call to getenv | call to getenv | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:80:14:80:34 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:81:14:81:19 | (const char *)... | tests2.cpp:78:18:78:38 | call to mysql_get_client_info | tests2.cpp:81:14:81:19 | (const char *)... | This operation exposes system data from $@. | tests2.cpp:78:18:78:38 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:93:14:93:17 | str1 | tests2.cpp:91:42:91:45 | str1 | tests2.cpp:93:14:93:17 | str1 | This operation exposes system data from $@. | tests2.cpp:91:42:91:45 | str1 | str1 | +| tests2.cpp:102:14:102:15 | pw | tests2.cpp:101:8:101:15 | call to getpwuid | tests2.cpp:102:14:102:15 | pw | This operation exposes system data from $@. | tests2.cpp:101:8:101:15 | call to getpwuid | call to getpwuid | +| tests2.cpp:111:14:111:19 | (const char *)... | tests2.cpp:109:12:109:17 | call to getenv | tests2.cpp:111:14:111:19 | (const char *)... | This operation exposes system data from $@. | tests2.cpp:109:12:109:17 | call to getenv | call to getenv | +| tests_sockets.cpp:39:19:39:22 | path | tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:39:19:39:22 | path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | call to getenv | call to getenv | +| tests_sockets.cpp:43:20:43:23 | path | tests_sockets.cpp:26:15:26:20 | call to getenv | tests_sockets.cpp:43:20:43:23 | path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | call to getenv | call to getenv | +| tests_sockets.cpp:76:19:76:22 | path | tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:76:19:76:22 | path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | call to getenv | call to getenv | +| tests_sockets.cpp:80:20:80:23 | path | tests_sockets.cpp:63:15:63:20 | call to getenv | tests_sockets.cpp:80:20:80:23 | path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | call to getenv | call to getenv | +| tests_sysconf.cpp:39:19:39:25 | pathbuf | tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | pathbuf | This operation exposes system data from $@. | tests_sysconf.cpp:36:21:36:27 | confstr output argument | confstr output argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected deleted file mode 100644 index 931cbd95a72..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected +++ /dev/null @@ -1,5 +0,0 @@ -| tests2.cpp:27:12:27:12 | call to operator<< | tests2.cpp:27:15:27:20 | call to getenv | -| tests2.cpp:28:12:28:12 | call to operator<< | tests2.cpp:28:15:28:23 | PATH = | -| tests2.cpp:28:25:28:25 | call to operator<< | tests2.cpp:28:28:28:33 | call to getenv | -| tests2.cpp:28:43:28:43 | call to operator<< | tests2.cpp:28:46:28:48 | . | -| tests2.cpp:29:12:29:12 | call to operator<< | tests2.cpp:29:15:29:28 | PATHPATHPATH | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql deleted file mode 100644 index d9e67a944e9..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql +++ /dev/null @@ -1,4 +0,0 @@ -import semmle.code.cpp.security.OutputWrite - -from OutputWrite ow -select ow, ow.getASource() diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.expected new file mode 100644 index 00000000000..62fe44dcc23 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.expected @@ -0,0 +1,109 @@ +edges +| tests.cpp:48:15:48:20 | call to getenv | tests.cpp:48:15:48:36 | (const char *)... | +| tests.cpp:49:15:49:20 | call to getenv | tests.cpp:49:15:49:36 | (const char *)... | +| tests.cpp:50:15:50:20 | call to getenv | tests.cpp:50:15:50:36 | (const char *)... | +| tests.cpp:57:18:57:23 | call to getenv | tests.cpp:57:18:57:39 | (const char_type *)... | +| tests.cpp:58:41:58:46 | call to getenv | tests.cpp:58:41:58:62 | (const char_type *)... | +| tests.cpp:59:43:59:48 | call to getenv | tests.cpp:59:43:59:64 | (const char *)... | +| tests.cpp:86:29:86:31 | *msg | tests.cpp:88:15:88:17 | msg | +| tests.cpp:86:29:86:31 | msg | tests.cpp:88:15:88:17 | msg | +| tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:34 | (const char *)... | +| tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:34 | call to getenv | +| tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:34 | call to getenv indirection | +| tests.cpp:97:13:97:34 | call to getenv | tests.cpp:86:29:86:31 | msg | +| tests.cpp:97:13:97:34 | call to getenv indirection | tests.cpp:86:29:86:31 | *msg | +| tests.cpp:107:30:107:32 | *msg | tests.cpp:111:15:111:17 | tmp | +| tests.cpp:107:30:107:32 | msg | tests.cpp:111:15:111:17 | tmp | +| tests.cpp:114:30:114:32 | *msg | tests.cpp:119:7:119:12 | (const char *)... | +| tests.cpp:114:30:114:32 | msg | tests.cpp:119:7:119:12 | (const char *)... | +| tests.cpp:122:30:122:32 | *msg | tests.cpp:124:15:124:17 | msg | +| tests.cpp:122:30:122:32 | msg | tests.cpp:124:15:124:17 | msg | +| tests.cpp:131:14:131:19 | call to getenv | tests.cpp:131:14:131:35 | call to getenv | +| tests.cpp:131:14:131:19 | call to getenv | tests.cpp:131:14:131:35 | call to getenv indirection | +| tests.cpp:131:14:131:35 | call to getenv | tests.cpp:107:30:107:32 | msg | +| tests.cpp:131:14:131:35 | call to getenv indirection | tests.cpp:107:30:107:32 | *msg | +| tests.cpp:132:14:132:19 | call to getenv | tests.cpp:132:14:132:35 | call to getenv | +| tests.cpp:132:14:132:19 | call to getenv | tests.cpp:132:14:132:35 | call to getenv indirection | +| tests.cpp:132:14:132:35 | call to getenv | tests.cpp:114:30:114:32 | msg | +| tests.cpp:132:14:132:35 | call to getenv indirection | tests.cpp:114:30:114:32 | *msg | +| tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:35 | (const char *)... | +| tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:35 | call to getenv | +| tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:35 | call to getenv indirection | +| tests.cpp:133:14:133:35 | call to getenv | tests.cpp:122:30:122:32 | msg | +| tests.cpp:133:14:133:35 | call to getenv indirection | tests.cpp:122:30:122:32 | *msg | +| tests_passwd.cpp:16:8:16:15 | call to getpwnam | tests_passwd.cpp:18:29:18:31 | pwd | +| tests_passwd.cpp:16:8:16:15 | call to getpwnam | tests_passwd.cpp:19:26:19:28 | pwd | +nodes +| tests.cpp:48:15:48:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:48:15:48:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:48:15:48:36 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:49:15:49:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:49:15:49:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:49:15:49:36 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:50:15:50:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:50:15:50:20 | call to getenv | semmle.label | call to getenv | +| tests.cpp:50:15:50:36 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:57:18:57:23 | call to getenv | semmle.label | call to getenv | +| tests.cpp:57:18:57:23 | call to getenv | semmle.label | call to getenv | +| tests.cpp:57:18:57:39 | (const char_type *)... | semmle.label | (const char_type *)... | +| tests.cpp:58:41:58:46 | call to getenv | semmle.label | call to getenv | +| tests.cpp:58:41:58:46 | call to getenv | semmle.label | call to getenv | +| tests.cpp:58:41:58:62 | (const char_type *)... | semmle.label | (const char_type *)... | +| tests.cpp:59:43:59:48 | call to getenv | semmle.label | call to getenv | +| tests.cpp:59:43:59:48 | call to getenv | semmle.label | call to getenv | +| tests.cpp:59:43:59:64 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:86:29:86:31 | *msg | semmle.label | *msg | +| tests.cpp:86:29:86:31 | msg | semmle.label | msg | +| tests.cpp:88:15:88:17 | msg | semmle.label | msg | +| tests.cpp:97:13:97:18 | call to getenv | semmle.label | call to getenv | +| tests.cpp:97:13:97:18 | call to getenv | semmle.label | call to getenv | +| tests.cpp:97:13:97:34 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:97:13:97:34 | call to getenv | semmle.label | call to getenv | +| tests.cpp:97:13:97:34 | call to getenv indirection | semmle.label | call to getenv indirection | +| tests.cpp:107:30:107:32 | *msg | semmle.label | *msg | +| tests.cpp:107:30:107:32 | msg | semmle.label | msg | +| tests.cpp:111:15:111:17 | tmp | semmle.label | tmp | +| tests.cpp:114:30:114:32 | *msg | semmle.label | *msg | +| tests.cpp:114:30:114:32 | msg | semmle.label | msg | +| tests.cpp:119:7:119:12 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:122:30:122:32 | *msg | semmle.label | *msg | +| tests.cpp:122:30:122:32 | msg | semmle.label | msg | +| tests.cpp:124:15:124:17 | msg | semmle.label | msg | +| tests.cpp:131:14:131:19 | call to getenv | semmle.label | call to getenv | +| tests.cpp:131:14:131:35 | call to getenv | semmle.label | call to getenv | +| tests.cpp:131:14:131:35 | call to getenv indirection | semmle.label | call to getenv indirection | +| tests.cpp:132:14:132:19 | call to getenv | semmle.label | call to getenv | +| tests.cpp:132:14:132:35 | call to getenv | semmle.label | call to getenv | +| tests.cpp:132:14:132:35 | call to getenv indirection | semmle.label | call to getenv indirection | +| tests.cpp:133:14:133:19 | call to getenv | semmle.label | call to getenv | +| tests.cpp:133:14:133:19 | call to getenv | semmle.label | call to getenv | +| tests.cpp:133:14:133:35 | (const char *)... | semmle.label | (const char *)... | +| tests.cpp:133:14:133:35 | call to getenv | semmle.label | call to getenv | +| tests.cpp:133:14:133:35 | call to getenv indirection | semmle.label | call to getenv indirection | +| tests_passwd.cpp:16:8:16:15 | call to getpwnam | semmle.label | call to getpwnam | +| tests_passwd.cpp:18:29:18:31 | pwd | semmle.label | pwd | +| tests_passwd.cpp:19:26:19:28 | pwd | semmle.label | pwd | +subpaths +#select +| tests.cpp:48:15:48:20 | call to getenv | tests.cpp:48:15:48:20 | call to getenv | tests.cpp:48:15:48:20 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:48:15:48:20 | call to getenv | call to getenv | +| tests.cpp:48:15:48:36 | (const char *)... | tests.cpp:48:15:48:20 | call to getenv | tests.cpp:48:15:48:36 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:48:15:48:20 | call to getenv | call to getenv | +| tests.cpp:49:15:49:20 | call to getenv | tests.cpp:49:15:49:20 | call to getenv | tests.cpp:49:15:49:20 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:49:15:49:20 | call to getenv | call to getenv | +| tests.cpp:49:15:49:36 | (const char *)... | tests.cpp:49:15:49:20 | call to getenv | tests.cpp:49:15:49:36 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:49:15:49:20 | call to getenv | call to getenv | +| tests.cpp:50:15:50:20 | call to getenv | tests.cpp:50:15:50:20 | call to getenv | tests.cpp:50:15:50:20 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:50:15:50:20 | call to getenv | call to getenv | +| tests.cpp:50:15:50:36 | (const char *)... | tests.cpp:50:15:50:20 | call to getenv | tests.cpp:50:15:50:36 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:50:15:50:20 | call to getenv | call to getenv | +| tests.cpp:57:18:57:23 | call to getenv | tests.cpp:57:18:57:23 | call to getenv | tests.cpp:57:18:57:23 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:57:18:57:23 | call to getenv | call to getenv | +| tests.cpp:57:18:57:39 | (const char_type *)... | tests.cpp:57:18:57:23 | call to getenv | tests.cpp:57:18:57:39 | (const char_type *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:57:18:57:23 | call to getenv | call to getenv | +| tests.cpp:58:41:58:46 | call to getenv | tests.cpp:58:41:58:46 | call to getenv | tests.cpp:58:41:58:46 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:58:41:58:46 | call to getenv | call to getenv | +| tests.cpp:58:41:58:62 | (const char_type *)... | tests.cpp:58:41:58:46 | call to getenv | tests.cpp:58:41:58:62 | (const char_type *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:58:41:58:46 | call to getenv | call to getenv | +| tests.cpp:59:43:59:48 | call to getenv | tests.cpp:59:43:59:48 | call to getenv | tests.cpp:59:43:59:48 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:59:43:59:48 | call to getenv | call to getenv | +| tests.cpp:59:43:59:64 | (const char *)... | tests.cpp:59:43:59:48 | call to getenv | tests.cpp:59:43:59:64 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:59:43:59:48 | call to getenv | call to getenv | +| tests.cpp:88:15:88:17 | msg | tests.cpp:97:13:97:18 | call to getenv | tests.cpp:88:15:88:17 | msg | This operation potentially exposes sensitive system data from $@. | tests.cpp:97:13:97:18 | call to getenv | call to getenv | +| tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:18 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:97:13:97:18 | call to getenv | call to getenv | +| tests.cpp:97:13:97:34 | (const char *)... | tests.cpp:97:13:97:18 | call to getenv | tests.cpp:97:13:97:34 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:97:13:97:18 | call to getenv | call to getenv | +| tests.cpp:111:15:111:17 | tmp | tests.cpp:131:14:131:19 | call to getenv | tests.cpp:111:15:111:17 | tmp | This operation potentially exposes sensitive system data from $@. | tests.cpp:131:14:131:19 | call to getenv | call to getenv | +| tests.cpp:119:7:119:12 | (const char *)... | tests.cpp:132:14:132:19 | call to getenv | tests.cpp:119:7:119:12 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:132:14:132:19 | call to getenv | call to getenv | +| tests.cpp:124:15:124:17 | msg | tests.cpp:133:14:133:19 | call to getenv | tests.cpp:124:15:124:17 | msg | This operation potentially exposes sensitive system data from $@. | tests.cpp:133:14:133:19 | call to getenv | call to getenv | +| tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:19 | call to getenv | This operation potentially exposes sensitive system data from $@. | tests.cpp:133:14:133:19 | call to getenv | call to getenv | +| tests.cpp:133:14:133:35 | (const char *)... | tests.cpp:133:14:133:19 | call to getenv | tests.cpp:133:14:133:35 | (const char *)... | This operation potentially exposes sensitive system data from $@. | tests.cpp:133:14:133:19 | call to getenv | call to getenv | +| tests_passwd.cpp:18:29:18:31 | pwd | tests_passwd.cpp:16:8:16:15 | call to getpwnam | tests_passwd.cpp:18:29:18:31 | pwd | This operation potentially exposes sensitive system data from $@. | tests_passwd.cpp:16:8:16:15 | call to getpwnam | call to getpwnam | +| tests_passwd.cpp:19:26:19:28 | pwd | tests_passwd.cpp:16:8:16:15 | call to getpwnam | tests_passwd.cpp:19:26:19:28 | pwd | This operation potentially exposes sensitive system data from $@. | tests_passwd.cpp:16:8:16:15 | call to getpwnam | call to getpwnam | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.qlref new file mode 100644 index 00000000000..4f7305ce697 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/PotentiallyExposedSystemData.qlref @@ -0,0 +1 @@ +Security/CWE/CWE-497/PotentiallyExposedSystemData.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.cpp new file mode 100644 index 00000000000..e61fc582fc3 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.cpp @@ -0,0 +1,134 @@ +// test cases for rule CWE-497 + +// library functions etc + +#include "tests.h" + + +typedef struct {} FILE; +FILE *stdout; + +int puts(const char *s); +int printf(const char *format, ...); +int sprintf(char *s, const char *format, ...); +int snprintf(char *s, size_t n, const char *format, ...); +size_t strlen(const char *s); +char *getenv(const char *name); + +extern std::ostream someotherostream; + + + + + + + + + + + + + + + + + + + + + +#define NULL (0) + +// test cases + +void test1() +{ + std::ostream cout_copy = std::cout; + + std::cout << getenv("SECRET_TOKEN"); // BAD: outputs SECRET_TOKEN environment variable + std::cerr << getenv("SECRET_TOKEN"); // BAD: outputs SECRET_TOKEN environment variable + std::clog << getenv("SECRET_TOKEN"); // BAD: outputs SECRET_TOKEN environment variable + someotherostream << getenv("SECRET_TOKEN"); // GOOD: not output + cout_copy << getenv("SECRET_TOKEN"); // BAD: outputs SECRET_TOKEN environment variable [NOT DETECTED] + + std::cout << getenv("USERPROFILE"); // BAD: outputs PATH environment variable [NOT DETECTED] + std::cout << getenv("PATH"); // BAD: outputs PATH environment variable [NOT DETECTED] + + std::cout.write(getenv("SECRET_TOKEN"), strlen(getenv("SECRET_TOKEN"))); // BAD: outputs SECRET_TOKEN environment variable + (std::cout << "SECRET_TOKEN = ").write(getenv("SECRET_TOKEN"), strlen(getenv("SECRET_TOKEN"))); // BAD: outputs SECRET_TOKEN environment variable + std::cout.write("SECRET_TOKEN = ", 7) << getenv("SECRET_TOKEN"); // BAD: outputs SECRET_TOKEN environment variable +} + +char *global_token = getenv("SECRET_TOKEN"); +char *global_other = "Hello, world!"; + +void test2(bool cond) +{ + char *maybe; + + maybe = cond ? global_token : global_other; + + printf("token = '%s'\n", global_token); // BAD: outputs SECRET_TOKEN environment variable [NOT DETECTED] + printf("other = '%s'\n", global_other); + printf("maybe = '%s'\n", maybe); // BAD: may output SECRET_TOKEN environment variable [NOT DETECTED] +} + +void test3() +{ + char *path_string = getenv("PATH"); + char buf[4096]; + + // ... + snprintf(buf, 4096, "invalid path '%s'\n", path_string); + puts(buf); // BAD: outputs PATH environment variable [NOT DETECTED] +} + +void myOutputFn(const char *msg) +{ + printf("%s", msg); +} + +void myOtherFn(const char *msg) +{ +} + +void test4() +{ + myOutputFn(getenv("SECRET_TOKEN")); // BAD: outputs the SECRET_TOKEN environment variable + myOtherFn(getenv("SECRET_TOKEN")); // GOOD: does not output anything. +} + +void myOutputFn2(const char *msg) +{ + msg = ""; + printf("%s", msg); +} + +void myOutputFn3(const char *msg) +{ + const char *tmp = msg; + + printf("%s", tmp); +} + +void myOutputFn4(const char *msg) +{ + char buffer[4096]; + + sprintf(buffer, "log: %s\n", msg); + puts(buffer); +} + +void myOutputFn5(const char *msg) +{ + printf("%s", msg); + msg = ""; +} + +void test5() +{ + myOutputFn2(getenv("SECRET_TOKEN")); // GOOD: myOutputFn2 doesn't actually output the parameter + myOutputFn3(getenv("SECRET_TOKEN")); // BAD: outputs the SECRET_TOKEN environment variable + myOutputFn4(getenv("SECRET_TOKEN")); // BAD: outputs the SECRET_TOKEN environment variable + myOutputFn5(getenv("SECRET_TOKEN")); // BAD: outputs the SECRET_TOKEN environment variable +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.h b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.h new file mode 100644 index 00000000000..d997a2778fc --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests.h @@ -0,0 +1,25 @@ + +typedef unsigned long size_t; + +namespace std +{ + typedef size_t streamsize; + + template struct char_traits; + + template > + class basic_ostream /*: virtual public basic_ios - not needed for this test */ { + public: + typedef charT char_type; + basic_ostream& write(const char_type* s, streamsize n); + + basic_ostream& operator<<(int n); + }; + template basic_ostream& operator<<(basic_ostream&, const charT*); + + typedef basic_ostream ostream; + + extern ostream cout; + extern ostream cerr; + extern ostream clog; +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp index fac56c325a4..763f1ecfafc 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp @@ -2,29 +2,113 @@ // library functions etc +#include "tests.h" + char *getenv(const char *name); +char *strcpy(char *s1, const char *s2); -namespace std + + + + + + + + + + + + + + +int socket(int p1, int p2, int p3); +void send(int sock, const char *buffer, int p3, int p4); + +const char *mysql_get_client_info(); +void mysql_real_connect(int p1, int p2, int p3, const char *password, int p5, int p6, int p7, int p8); + +struct container { - template struct char_traits; + char *ptr; +}; - template > - class basic_ostream /*: virtual public basic_ios - not needed for this test */ { - public: - }; +struct passwd +{ + // ... - template basic_ostream& operator<<(basic_ostream&, const charT*); + char *pw_passwd; - typedef basic_ostream ostream; + // ... +}; - extern ostream cout; -} +passwd *getpwuid(int uid); + +int val(); // test cases +const char *global1 = mysql_get_client_info(); +const char *global2 = "abc"; + void test1() { - std::cout << getenv("HOME"); // BAD: outputs HOME environment variable - std::cout << "PATH = " << getenv("PATH") << "."; // BAD: outputs PATH environment variable + int sock = socket(val(), val(), val()); + + // tests for a strict implementation of CWE-497 + std::cout << getenv("HOME"); // BAD: outputs HOME environment variable [NOT DETECTED] + std::cout << "PATH = " << getenv("PATH") << "."; // BAD: outputs PATH environment variable [NOT DETECTED] std::cout << "PATHPATHPATH"; // GOOD: not system data + + // tests for a more pragmatic implementation of CWE-497 + send(sock, getenv("HOME"), val(), val()); // BAD + send(sock, getenv("PATH"), val(), val()); // BAD + send(sock, getenv("USERNAME"), val(), val()); // BAD + send(sock, getenv("APP_PASSWORD"), val(), val()); // BAD + send(sock, getenv("HARMLESS"), val(), val()); // GOOD: harmless information + send(sock, "HOME", val(), val()); // GOOD: not system data + send(sock, "PATH", val(), val()); // GOOD: not system data + send(sock, "USERNAME", val(), val()); // GOOD: not system data + send(sock, "APP_PASSWORD", val(), val()); // GOOD: not system data + send(sock, "HARMLESS", val(), val()); // GOOD: not system data + + // tests for `mysql_get_client_info`, including via a global + { + char buffer[256]; + + strcpy(buffer, mysql_get_client_info()); + + send(sock, mysql_get_client_info(), val(), val()); // BAD + send(sock, buffer, val(), val()); // BAD + send(sock, global1, val(), val()); // BAD [NOT DETECTED] + send(sock, global2, val(), val()); // GOOD: not system data + } + + // tests for `mysql_real_connect` + { + const char *str1 = "123456"; + const char *str2 = "abcdef"; + + mysql_real_connect(sock, val(), val(), str1, val(), val(), val(), val()); + + send(sock, str1, val(), val()); // BAD + send(sock, str2, val(), val()); // GOOD: not system data + } + + // tests for `getpwuid` + { + passwd *pw; + + pw = getpwuid(val()); + send(sock, pw->pw_passwd, val(), val()); // BAD + } + + // tests for containers + { + container c1, c2; + + c1.ptr = getenv("MY_SECRET_TOKEN"); + c2.ptr = ""; + send(sock, c1.ptr, val(), val()); // BAD + send(sock, c2.ptr, val(), val()); // GOOD: not system data + } } diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_passwd.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_passwd.cpp new file mode 100644 index 00000000000..6de8ed84d06 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_passwd.cpp @@ -0,0 +1,21 @@ + +int printf(const char *format, ...); + +struct passwd { + char *pw_passwd; + char *pw_dir; + // ... +}; + +struct passwd *getpwnam(const char *name); + +void test6(char *username) +{ + passwd *pwd; + + pwd = getpwnam(username); + + printf("pw_passwd = %s\n", pwd->pw_passwd); // BAD + printf("pw_dir = %s\n", pwd->pw_dir); // BAD + printf("sizeof(passwd) = %i\n", sizeof(passwd)); // GOOD +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp new file mode 100644 index 00000000000..e7e8d9fe89f --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp @@ -0,0 +1,84 @@ + +typedef unsigned long size_t; + +size_t strlen(const char *s); +char *getenv(const char *name); + +#define AF_INET (2) +#define SOCK_STREAM (1) + +struct sockaddr { + int sa_family; + + // ... +}; + +int socket(int domain, int type, int protocol); +int connect(int socket, const struct sockaddr *address, size_t address_len); +size_t send(int socket, const void *buffer, size_t length, int flags); +int write(int handle, const void *buffer, size_t length); + +void test_sockets1() +{ + int sockfd; + sockaddr addr_remote; + char *msg = "Hello, world!"; + char *path = getenv("PATH"); + + // create socket + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) return; + + // connect socket to a remote address + addr_remote.sa_family = AF_INET; + // ... + if (connect(sockfd, &addr_remote, sizeof(addr_remote)) != 0) return; + + // send something using 'send' + if (send(sockfd, msg, strlen(msg) + 1, 0) < 0) return; // GOOD + if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // BAD + + // send something using 'write' + if (write(sockfd, msg, strlen(msg) + 1) < 0) return; // GOOD + if (write(sockfd, path, strlen(path) + 1) < 0) return; // BAD + + // clean up + // ... +} + +int mksocket() +{ + int fd; + + fd = socket(AF_INET, SOCK_STREAM, 0); + + return fd; +} + +void test_sockets2() +{ + int sockfd; + sockaddr addr_remote; + char *msg = "Hello, world!"; + char *path = getenv("PATH"); + + // create socket + sockfd = mksocket(); + if (sockfd < 0) return; + + // connect socket to a remote address + addr_remote.sa_family = AF_INET; + // ... + if (connect(sockfd, &addr_remote, sizeof(addr_remote)) != 0) return; + + // send something using 'send' + if (send(sockfd, msg, strlen(msg) + 1, 0) < 0) return; // GOOD + if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // BAD + + // send something using 'write' + if (write(sockfd, msg, strlen(msg) + 1) < 0) return; // GOOD + if (write(sockfd, path, strlen(path) + 1) < 0) return; // BAD + + // clean up + // ... +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp new file mode 100644 index 00000000000..0c0cbcc68d3 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp @@ -0,0 +1,41 @@ + +typedef unsigned long size_t; +typedef signed long ssize_t; +void *malloc(size_t size); +#define NULL (0) + +int printf(const char *format, ...); +size_t strlen(const char *s); + +int get_fd(); +int write(int handle, const void *buffer, size_t length); + +long sysconf(int name); +#define _SC_CHILD_MAX (2) + +size_t confstr(int name, char *buffer, size_t length); +#define _CS_PATH (1) + +void test_sc_1() +{ + int value = sysconf(_SC_CHILD_MAX); + + printf("_SC_CHILD_MAX = %i\n", _SC_CHILD_MAX); // GOOD + printf("_SC_CHILD_MAX = %i\n", value); // BAD [NOT DETECTED] +} + +void test_sc_2() +{ + char *pathbuf; + size_t n; + + n = confstr(_CS_PATH, NULL, (size_t)0); + pathbuf = (char *)malloc(n); + if (pathbuf != NULL) + { + confstr(_CS_PATH, pathbuf, n); + + printf("path: %s", pathbuf); // BAD [NOT DETECTED] + write(get_fd(), pathbuf, strlen(pathbuf)); // BAD + } +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected new file mode 100644 index 00000000000..a4db6155e31 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected @@ -0,0 +1,133 @@ +edges +| tests2.cpp:20:17:20:31 | SAXParser output argument | tests2.cpp:22:2:22:2 | p | +| tests2.cpp:33:17:33:31 | SAXParser output argument | tests2.cpp:37:2:37:2 | p | +| tests3.cpp:23:21:23:53 | call to createXMLReader | tests3.cpp:25:2:25:2 | p | +| tests3.cpp:60:21:60:53 | call to createXMLReader | tests3.cpp:63:2:63:2 | p | +| tests3.cpp:67:21:67:53 | call to createXMLReader | tests3.cpp:70:2:70:2 | p | +| tests5.cpp:27:25:27:38 | call to createLSParser | tests5.cpp:29:2:29:2 | p | +| tests5.cpp:40:25:40:38 | call to createLSParser | tests5.cpp:43:2:43:2 | p | +| tests5.cpp:55:25:55:38 | call to createLSParser | tests5.cpp:59:2:59:2 | p | +| tests5.cpp:81:25:81:38 | call to createLSParser | tests5.cpp:83:2:83:2 | p | +| tests5.cpp:81:25:81:38 | call to createLSParser | tests5.cpp:83:2:83:2 | p | +| tests5.cpp:83:2:83:2 | p | tests5.cpp:85:2:85:2 | p | +| tests5.cpp:85:2:85:2 | p | tests5.cpp:86:2:86:2 | p | +| tests5.cpp:86:2:86:2 | p | tests5.cpp:88:2:88:2 | p | +| tests5.cpp:88:2:88:2 | p | tests5.cpp:89:2:89:2 | p | +| tests.cpp:15:23:15:43 | XercesDOMParser output argument | tests.cpp:17:2:17:2 | p | +| tests.cpp:28:23:28:43 | XercesDOMParser output argument | tests.cpp:31:2:31:2 | p | +| tests.cpp:35:19:35:19 | VariableAddress [post update] | tests.cpp:37:2:37:2 | p | +| tests.cpp:35:23:35:43 | XercesDOMParser output argument | tests.cpp:35:19:35:19 | VariableAddress [post update] | +| tests.cpp:37:2:37:2 | p | tests.cpp:38:2:38:2 | p | +| tests.cpp:38:2:38:2 | p | tests.cpp:39:2:39:2 | p | +| tests.cpp:51:19:51:19 | VariableAddress [post update] | tests.cpp:53:2:53:2 | p | +| tests.cpp:51:23:51:43 | XercesDOMParser output argument | tests.cpp:51:19:51:19 | VariableAddress [post update] | +| tests.cpp:53:2:53:2 | p | tests.cpp:54:2:54:2 | p | +| tests.cpp:54:2:54:2 | p | tests.cpp:55:2:55:2 | p | +| tests.cpp:55:2:55:2 | p | tests.cpp:56:2:56:2 | p | +| tests.cpp:55:2:55:2 | p | tests.cpp:56:2:56:2 | p | +| tests.cpp:56:2:56:2 | p | tests.cpp:57:2:57:2 | p | +| tests.cpp:57:2:57:2 | p | tests.cpp:58:2:58:2 | p | +| tests.cpp:58:2:58:2 | p | tests.cpp:59:2:59:2 | p | +| tests.cpp:59:2:59:2 | p | tests.cpp:60:2:60:2 | p | +| tests.cpp:66:23:66:43 | XercesDOMParser output argument | tests.cpp:69:2:69:2 | p | +| tests.cpp:73:23:73:43 | XercesDOMParser output argument | tests.cpp:80:2:80:2 | p | +| tests.cpp:85:24:85:44 | XercesDOMParser output argument | tests.cpp:88:3:88:3 | q | +| tests.cpp:100:24:100:44 | XercesDOMParser output argument | tests.cpp:104:3:104:3 | q | +| tests.cpp:112:39:112:39 | p | tests.cpp:113:2:113:2 | p | +| tests.cpp:116:39:116:39 | p | tests.cpp:117:2:117:2 | p | +| tests.cpp:122:23:122:43 | XercesDOMParser output argument | tests.cpp:126:18:126:18 | q | +| tests.cpp:122:23:122:43 | XercesDOMParser output argument | tests.cpp:128:18:128:18 | q | +| tests.cpp:126:18:126:18 | q | tests.cpp:112:39:112:39 | p | +| tests.cpp:128:18:128:18 | q | tests.cpp:116:39:116:39 | p | +nodes +| tests2.cpp:20:17:20:31 | SAXParser output argument | semmle.label | SAXParser output argument | +| tests2.cpp:22:2:22:2 | p | semmle.label | p | +| tests2.cpp:33:17:33:31 | SAXParser output argument | semmle.label | SAXParser output argument | +| tests2.cpp:37:2:37:2 | p | semmle.label | p | +| tests3.cpp:23:21:23:53 | call to createXMLReader | semmle.label | call to createXMLReader | +| tests3.cpp:25:2:25:2 | p | semmle.label | p | +| tests3.cpp:60:21:60:53 | call to createXMLReader | semmle.label | call to createXMLReader | +| tests3.cpp:63:2:63:2 | p | semmle.label | p | +| tests3.cpp:67:21:67:53 | call to createXMLReader | semmle.label | call to createXMLReader | +| tests3.cpp:70:2:70:2 | p | semmle.label | p | +| tests4.cpp:26:34:26:48 | (int)... | semmle.label | (int)... | +| tests4.cpp:36:34:36:50 | (int)... | semmle.label | (int)... | +| tests4.cpp:46:34:46:68 | ... \| ... | semmle.label | ... \| ... | +| tests4.cpp:77:34:77:38 | flags | semmle.label | flags | +| tests4.cpp:130:39:130:55 | (int)... | semmle.label | (int)... | +| tests5.cpp:27:25:27:38 | call to createLSParser | semmle.label | call to createLSParser | +| tests5.cpp:29:2:29:2 | p | semmle.label | p | +| tests5.cpp:40:25:40:38 | call to createLSParser | semmle.label | call to createLSParser | +| tests5.cpp:43:2:43:2 | p | semmle.label | p | +| tests5.cpp:55:25:55:38 | call to createLSParser | semmle.label | call to createLSParser | +| tests5.cpp:59:2:59:2 | p | semmle.label | p | +| tests5.cpp:81:25:81:38 | call to createLSParser | semmle.label | call to createLSParser | +| tests5.cpp:83:2:83:2 | p | semmle.label | p | +| tests5.cpp:83:2:83:2 | p | semmle.label | p | +| tests5.cpp:85:2:85:2 | p | semmle.label | p | +| tests5.cpp:86:2:86:2 | p | semmle.label | p | +| tests5.cpp:88:2:88:2 | p | semmle.label | p | +| tests5.cpp:89:2:89:2 | p | semmle.label | p | +| tests.cpp:15:23:15:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:17:2:17:2 | p | semmle.label | p | +| tests.cpp:28:23:28:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:31:2:31:2 | p | semmle.label | p | +| tests.cpp:35:19:35:19 | VariableAddress [post update] | semmle.label | VariableAddress [post update] | +| tests.cpp:35:23:35:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:37:2:37:2 | p | semmle.label | p | +| tests.cpp:38:2:38:2 | p | semmle.label | p | +| tests.cpp:39:2:39:2 | p | semmle.label | p | +| tests.cpp:51:19:51:19 | VariableAddress [post update] | semmle.label | VariableAddress [post update] | +| tests.cpp:51:23:51:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:53:2:53:2 | p | semmle.label | p | +| tests.cpp:54:2:54:2 | p | semmle.label | p | +| tests.cpp:55:2:55:2 | p | semmle.label | p | +| tests.cpp:56:2:56:2 | p | semmle.label | p | +| tests.cpp:56:2:56:2 | p | semmle.label | p | +| tests.cpp:57:2:57:2 | p | semmle.label | p | +| tests.cpp:58:2:58:2 | p | semmle.label | p | +| tests.cpp:59:2:59:2 | p | semmle.label | p | +| tests.cpp:60:2:60:2 | p | semmle.label | p | +| tests.cpp:66:23:66:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:69:2:69:2 | p | semmle.label | p | +| tests.cpp:73:23:73:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:80:2:80:2 | p | semmle.label | p | +| tests.cpp:85:24:85:44 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:88:3:88:3 | q | semmle.label | q | +| tests.cpp:100:24:100:44 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:104:3:104:3 | q | semmle.label | q | +| tests.cpp:112:39:112:39 | p | semmle.label | p | +| tests.cpp:113:2:113:2 | p | semmle.label | p | +| tests.cpp:116:39:116:39 | p | semmle.label | p | +| tests.cpp:117:2:117:2 | p | semmle.label | p | +| tests.cpp:122:23:122:43 | XercesDOMParser output argument | semmle.label | XercesDOMParser output argument | +| tests.cpp:126:18:126:18 | q | semmle.label | q | +| tests.cpp:128:18:128:18 | q | semmle.label | q | +subpaths +#select +| tests2.cpp:22:2:22:2 | p | tests2.cpp:20:17:20:31 | SAXParser output argument | tests2.cpp:22:2:22:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:20:17:20:31 | SAXParser output argument | XML parser | +| tests2.cpp:37:2:37:2 | p | tests2.cpp:33:17:33:31 | SAXParser output argument | tests2.cpp:37:2:37:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:33:17:33:31 | SAXParser output argument | XML parser | +| tests3.cpp:25:2:25:2 | p | tests3.cpp:23:21:23:53 | call to createXMLReader | tests3.cpp:25:2:25:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests3.cpp:23:21:23:53 | call to createXMLReader | XML parser | +| tests3.cpp:63:2:63:2 | p | tests3.cpp:60:21:60:53 | call to createXMLReader | tests3.cpp:63:2:63:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests3.cpp:60:21:60:53 | call to createXMLReader | XML parser | +| tests3.cpp:70:2:70:2 | p | tests3.cpp:67:21:67:53 | call to createXMLReader | tests3.cpp:70:2:70:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests3.cpp:67:21:67:53 | call to createXMLReader | XML parser | +| tests4.cpp:26:34:26:48 | (int)... | tests4.cpp:26:34:26:48 | (int)... | tests4.cpp:26:34:26:48 | (int)... | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests4.cpp:26:34:26:48 | (int)... | XML parser | +| tests4.cpp:36:34:36:50 | (int)... | tests4.cpp:36:34:36:50 | (int)... | tests4.cpp:36:34:36:50 | (int)... | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests4.cpp:36:34:36:50 | (int)... | XML parser | +| tests4.cpp:46:34:46:68 | ... \| ... | tests4.cpp:46:34:46:68 | ... \| ... | tests4.cpp:46:34:46:68 | ... \| ... | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests4.cpp:46:34:46:68 | ... \| ... | XML parser | +| tests4.cpp:77:34:77:38 | flags | tests4.cpp:77:34:77:38 | flags | tests4.cpp:77:34:77:38 | flags | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests4.cpp:77:34:77:38 | flags | XML parser | +| tests4.cpp:130:39:130:55 | (int)... | tests4.cpp:130:39:130:55 | (int)... | tests4.cpp:130:39:130:55 | (int)... | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests4.cpp:130:39:130:55 | (int)... | XML parser | +| tests5.cpp:29:2:29:2 | p | tests5.cpp:27:25:27:38 | call to createLSParser | tests5.cpp:29:2:29:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests5.cpp:27:25:27:38 | call to createLSParser | XML parser | +| tests5.cpp:43:2:43:2 | p | tests5.cpp:40:25:40:38 | call to createLSParser | tests5.cpp:43:2:43:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests5.cpp:40:25:40:38 | call to createLSParser | XML parser | +| tests5.cpp:59:2:59:2 | p | tests5.cpp:55:25:55:38 | call to createLSParser | tests5.cpp:59:2:59:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests5.cpp:55:25:55:38 | call to createLSParser | XML parser | +| tests5.cpp:83:2:83:2 | p | tests5.cpp:81:25:81:38 | call to createLSParser | tests5.cpp:83:2:83:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests5.cpp:81:25:81:38 | call to createLSParser | XML parser | +| tests5.cpp:89:2:89:2 | p | tests5.cpp:81:25:81:38 | call to createLSParser | tests5.cpp:89:2:89:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests5.cpp:81:25:81:38 | call to createLSParser | XML parser | +| tests.cpp:17:2:17:2 | p | tests.cpp:15:23:15:43 | XercesDOMParser output argument | tests.cpp:17:2:17:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:15:23:15:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:31:2:31:2 | p | tests.cpp:28:23:28:43 | XercesDOMParser output argument | tests.cpp:31:2:31:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:28:23:28:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:39:2:39:2 | p | tests.cpp:35:23:35:43 | XercesDOMParser output argument | tests.cpp:39:2:39:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:35:23:35:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:56:2:56:2 | p | tests.cpp:51:23:51:43 | XercesDOMParser output argument | tests.cpp:56:2:56:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:51:23:51:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:60:2:60:2 | p | tests.cpp:51:23:51:43 | XercesDOMParser output argument | tests.cpp:60:2:60:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:51:23:51:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:69:2:69:2 | p | tests.cpp:66:23:66:43 | XercesDOMParser output argument | tests.cpp:69:2:69:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:66:23:66:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:80:2:80:2 | p | tests.cpp:73:23:73:43 | XercesDOMParser output argument | tests.cpp:80:2:80:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:73:23:73:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:88:3:88:3 | q | tests.cpp:85:24:85:44 | XercesDOMParser output argument | tests.cpp:88:3:88:3 | q | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:85:24:85:44 | XercesDOMParser output argument | XML parser | +| tests.cpp:104:3:104:3 | q | tests.cpp:100:24:100:44 | XercesDOMParser output argument | tests.cpp:104:3:104:3 | q | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:100:24:100:44 | XercesDOMParser output argument | XML parser | +| tests.cpp:113:2:113:2 | p | tests.cpp:122:23:122:43 | XercesDOMParser output argument | tests.cpp:113:2:113:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:122:23:122:43 | XercesDOMParser output argument | XML parser | +| tests.cpp:117:2:117:2 | p | tests.cpp:122:23:122:43 | XercesDOMParser output argument | tests.cpp:117:2:117:2 | p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests.cpp:122:23:122:43 | XercesDOMParser output argument | XML parser | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.qlref new file mode 100644 index 00000000000..866f8697caf --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.qlref @@ -0,0 +1 @@ +Security/CWE/CWE-611/XXE.ql diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.cpp new file mode 100644 index 00000000000..51ae57f54d9 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.cpp @@ -0,0 +1,129 @@ +// test cases for rule CWE-611 (XercesDOMParser) + +#include "tests.h" + +// --- + +class XercesDOMParser: public AbstractDOMParser { +public: + XercesDOMParser(); +}; + +// --- + +void test1(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->parse(data); // BAD (parser not correctly configured) +} + +void test2(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(true); + p->parse(data); // GOOD +} + +void test3(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(false); + p->parse(data); // BAD (parser not correctly configured) +} + +void test4(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(true); + p->setCreateEntityReferenceNodes(false); + p->parse(data); // BAD (parser not correctly configured) +} + +void test5(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(true); + p->setCreateEntityReferenceNodes(true); + p->parse(data); // GOOD +} + +void test6(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(true); + p->parse(data); // GOOD + p->setDisableDefaultEntityResolution(false); + p->parse(data); // BAD (parser not correctly configured) + p->setDisableDefaultEntityResolution(true); + p->parse(data); // GOOD + p->setCreateEntityReferenceNodes(false); + p->parse(data); // BAD (parser not correctly configured) + p->setCreateEntityReferenceNodes(true); + p->parse(data); // GOOD +} + +void test7(InputSource &data, bool cond) { + XercesDOMParser *p = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(cond); + p->parse(data); // BAD (parser may not be correctly configured) +} + +void test8(InputSource &data, bool cond) { + XercesDOMParser *p = new XercesDOMParser(); + + if (cond) + { + p->setDisableDefaultEntityResolution(true); + } + + p->parse(data); // BAD (parser may not be correctly configured) +} + +void test9(InputSource &data) { + { + XercesDOMParser *p = new XercesDOMParser(); + XercesDOMParser &q = *p; + + q.parse(data); // BAD (parser not correctly configured) + } + + { + XercesDOMParser *p = new XercesDOMParser(); + XercesDOMParser &q = *p; + + q.setDisableDefaultEntityResolution(true); + q.parse(data); // GOOD + } + + { + XercesDOMParser *p = new XercesDOMParser(); + XercesDOMParser &q = *p; + + p->setDisableDefaultEntityResolution(true); + q.parse(data); // GOOD [FALSE POSITIVE] + } +} + +void test10_doParseA(XercesDOMParser *p, InputSource &data) { + p->parse(data); // GOOD +} + +void test10_doParseB(XercesDOMParser *p, InputSource &data) { + p->parse(data); // BAD (parser not correctly configured) +} + +void test10_doParseC(XercesDOMParser *p, InputSource &data) { + p->parse(data); // BAD (parser may not be correctly configured) +} + +void test10(InputSource &data) { + XercesDOMParser *p = new XercesDOMParser(); + XercesDOMParser *q = new XercesDOMParser(); + + p->setDisableDefaultEntityResolution(true); + test10_doParseA(p, data); + test10_doParseB(q, data); + test10_doParseC(p, data); + test10_doParseC(q, data); +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.h b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.h new file mode 100644 index 00000000000..7d745382174 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests.h @@ -0,0 +1,26 @@ +// library/common functions for rule CWE-611 + +#define NULL (0) + +class SecurityManager; +class InputSource; + +class AbstractDOMParser { +public: + AbstractDOMParser(); + + void setDisableDefaultEntityResolution(bool); // default is false + void setCreateEntityReferenceNodes(bool); // default is true + void setSecurityManager(SecurityManager *const manager); + void parse(const InputSource &data); +}; + +typedef unsigned int XMLCh; + +class XMLUni +{ +public: + static const XMLCh fgXercesDisableDefaultEntityResolution[]; + static const XMLCh fgXercesHarmlessOption[]; +}; + diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests2.cpp new file mode 100644 index 00000000000..147be557844 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests2.cpp @@ -0,0 +1,46 @@ +// test cases for rule CWE-611 (SAXParser) + +#include "tests.h" + +// --- + +class SAXParser +{ +public: + SAXParser(); + + void setDisableDefaultEntityResolution(bool); // default is false + void setSecurityManager(SecurityManager *const manager); + void parse(const InputSource &data); +}; + +// --- + +void test2_1(InputSource &data) { + SAXParser *p = new SAXParser(); + + p->parse(data); // BAD (parser not correctly configured) +} + +void test2_2(InputSource &data) { + SAXParser *p = new SAXParser(); + + p->setDisableDefaultEntityResolution(true); + p->parse(data); // GOOD +} + +void test2_3(InputSource &data) { + SAXParser *p = new SAXParser(); + bool v = false; + + p->setDisableDefaultEntityResolution(v); + p->parse(data); // BAD (parser not correctly configured) +} + +void test2_4(InputSource &data) { + SAXParser *p = new SAXParser(); + bool v = true; + + p->setDisableDefaultEntityResolution(v); + p->parse(data); // GOOD +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests3.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests3.cpp new file mode 100644 index 00000000000..15e518daf13 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests3.cpp @@ -0,0 +1,82 @@ +// test cases for rule CWE-611 (SAX2XMLReader) + +#include "tests.h" + +// --- + +class SAX2XMLReader +{ +public: + void setFeature(const XMLCh *feature, bool value); + void parse(const InputSource &data); +}; + +class XMLReaderFactory +{ +public: + static SAX2XMLReader *createXMLReader(); +}; + +// --- + +void test3_1(InputSource &data) { + SAX2XMLReader *p = XMLReaderFactory::createXMLReader(); + + p->parse(data); // BAD (parser not correctly configured) [NOT DETECTED] +} + +void test3_2(InputSource &data) { + SAX2XMLReader *p = XMLReaderFactory::createXMLReader(); + + p->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p->parse(data); // GOOD +} + +SAX2XMLReader *p_3_3 = XMLReaderFactory::createXMLReader(); + +void test3_3(InputSource &data) { + p_3_3->parse(data); // BAD (parser not correctly configured) [NOT DETECTED] +} + +SAX2XMLReader *p_3_4 = XMLReaderFactory::createXMLReader(); + +void test3_4(InputSource &data) { + p_3_4->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p_3_4->parse(data); // GOOD +} + +SAX2XMLReader *p_3_5 = XMLReaderFactory::createXMLReader(); + +void test3_5_init() { + p_3_5->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true); +} + +void test3_5(InputSource &data) { + test3_5_init(); + p_3_5->parse(data); // GOOD +} + +void test3_6(InputSource &data) { + SAX2XMLReader *p = XMLReaderFactory::createXMLReader(); + + p->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, false); + p->parse(data); // BAD (parser not correctly configured) +} + +void test3_7(InputSource &data) { + SAX2XMLReader *p = XMLReaderFactory::createXMLReader(); + + p->setFeature(XMLUni::fgXercesHarmlessOption, true); + p->parse(data); // BAD (parser not correctly configured) +} + +void test3_8(InputSource &data) { + SAX2XMLReader *p = XMLReaderFactory::createXMLReader(); + const XMLCh *feature = XMLUni::fgXercesDisableDefaultEntityResolution; + + p->setFeature(feature, true); + p->parse(data); // GOOD +} + + + diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests4.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests4.cpp new file mode 100644 index 00000000000..642c1866629 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests4.cpp @@ -0,0 +1,135 @@ +// test cases for rule CWE-611 (libxml2) + +#include "tests.h" + +// --- + +enum xmlParserOption +{ + XML_PARSE_NOENT = 2, + XML_PARSE_DTDLOAD = 4, + XML_PARSE_OPTION_HARMLESS = 8 +}; + +class xmlDoc; + +xmlDoc *xmlReadFile(const char *fileName, const char *encoding, int flags); +xmlDoc *xmlReadMemory(const char *ptr, int sz, const char *url, const char *encoding, int flags); + +void xmlFreeDoc(xmlDoc *ptr); + +// --- + +void test4_1(const char *fileName) { + xmlDoc *p; + + p = xmlReadFile(fileName, NULL, XML_PARSE_NOENT); // BAD (parser not correctly configured) + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_2(const char *fileName) { + xmlDoc *p; + + p = xmlReadFile(fileName, NULL, XML_PARSE_DTDLOAD); // BAD (parser not correctly configured) + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_3(const char *fileName) { + xmlDoc *p; + + p = xmlReadFile(fileName, NULL, XML_PARSE_NOENT | XML_PARSE_DTDLOAD); // BAD (parser not correctly configured) + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_4(const char *fileName) { + xmlDoc *p; + + p = xmlReadFile(fileName, NULL, 0); // GOOD + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_5(const char *fileName) { + xmlDoc *p; + + p = xmlReadFile(fileName, NULL, XML_PARSE_OPTION_HARMLESS); // GOOD + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_6(const char *fileName) { + xmlDoc *p; + int flags = XML_PARSE_NOENT; + + p = xmlReadFile(fileName, NULL, flags); // BAD (parser not correctly configured) + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_7(const char *fileName) { + xmlDoc *p; + int flags = 0; + + p = xmlReadFile(fileName, NULL, flags); // GOOD + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_8(const char *fileName) { + xmlDoc *p; + int flags = XML_PARSE_OPTION_HARMLESS; + + p = xmlReadFile(fileName, NULL, flags | XML_PARSE_NOENT); // BAD (parser not correctly configured) [NOT DETECTED] + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_9(const char *fileName) { + xmlDoc *p; + int flags = XML_PARSE_NOENT; + + p = xmlReadFile(fileName, NULL, flags | XML_PARSE_OPTION_HARMLESS); // BAD (parser not correctly configured) [NOT DETECTED] + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_10(const char *ptr, int sz) { + xmlDoc *p; + + p = xmlReadMemory(ptr, sz, "", NULL, 0); // GOOD + if (p != NULL) + { + xmlFreeDoc(p); + } +} + +void test4_11(const char *ptr, int sz) { + xmlDoc *p; + + p = xmlReadMemory(ptr, sz, "", NULL, XML_PARSE_DTDLOAD); // BAD (parser not correctly configured) + if (p != NULL) + { + xmlFreeDoc(p); + } +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests5.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests5.cpp new file mode 100644 index 00000000000..99027c9bd93 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/tests5.cpp @@ -0,0 +1,103 @@ +// test cases for rule CWE-611 (createLSParser) + +#include "tests.h" + +// --- + +class DOMConfiguration { +public: + void setParameter(const XMLCh *parameter, bool value); +}; + +class DOMLSParser { +public: + DOMConfiguration *getDomConfig(); + + void parse(const InputSource &data); +}; + +class DOMImplementationLS { +public: + DOMLSParser *createLSParser(); +}; + +// --- + +void test5_1(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + + p->parse(data); // BAD (parser not correctly configured) +} + +void test5_2(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + + p->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p->parse(data); // GOOD +} + +void test5_3(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + + p->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, false); + p->parse(data); // BAD (parser not correctly configured) +} + +void test5_4(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + DOMConfiguration *cfg = p->getDomConfig(); + + cfg->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p->parse(data); // GOOD +} + +void test5_5(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + DOMConfiguration *cfg = p->getDomConfig(); + + cfg->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, false); + p->parse(data); // BAD (parser not correctly configured) +} + +DOMImplementationLS *g_impl; +DOMLSParser *g_p1, *g_p2; +InputSource *g_data; + +void test5_6_init() { + g_p1 = g_impl->createLSParser(); + g_p1->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + + g_p2 = g_impl->createLSParser(); +} + +void test5_6() { + test5_6_init(); + + g_p1->parse(*g_data); // GOOD + g_p2->parse(*g_data); // BAD (parser not correctly configured) [NOT DETECTED] +} + +void test5_7(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + + p->parse(data); // BAD (parser not correctly configured) + + p->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p->parse(data); // GOOD + + p->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, false); + p->parse(data); // BAD (parser not correctly configured) +} + +void test5_8(DOMImplementationLS *impl, InputSource &data) { + DOMLSParser *p = impl->createLSParser(); + DOMConfiguration *cfg = p->getDomConfig(); + + p->parse(data); // BAD (parser not correctly configured) [NOT DETECTED] + + cfg->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + p->parse(data); // GOOD + + cfg->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, false); + p->parse(data); // BAD (parser not correctly configured) [NOT DETECTED] +} diff --git a/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.c b/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.c index 82c860c6e9b..e77dc8c5586 100644 --- a/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.c +++ b/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.c @@ -1,4 +1,4 @@ - +// semmle-extractor-options: -std=c11 int f1(void) { int x = 1; return 2; @@ -99,3 +99,14 @@ int f14() { __asm__("rdtsc"); // GOOD } + +_Noreturn void f15(); + +int f16() { + f15(); // GOOD +} + +int f17() { + if (__builtin_expect(1, 0)) + __builtin_unreachable(); // GOOD +} diff --git a/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.cpp b/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.cpp index 875c9ec4f75..c68ad23805c 100644 --- a/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.cpp +++ b/cpp/ql/test/query-tests/jsf/4.13 Functions/AV Rule 114/test.cpp @@ -1,4 +1,4 @@ - +// semmle-extractor-options: -std=c++11 class MyValue { public: MyValue(int _val) : val(_val) {}; @@ -164,3 +164,9 @@ int g19(int x) return x; // GOOD } + +[[noreturn]] void g20(); + +int g21() { + g20(); // GOOD +} diff --git a/cpp/ql/test/successor-tests/break_labels/cfg.expected b/cpp/ql/test/successor-tests/break_labels/cfg.expected index 570ed1bf345..2bf6ed1d363 100644 --- a/cpp/ql/test/successor-tests/break_labels/cfg.expected +++ b/cpp/ql/test/successor-tests/break_labels/cfg.expected @@ -1,138 +1,142 @@ -| f | false | 54 | 54 | f\ntest.c:2:5:2:5 | -| f | false | 65 | 65 | 0\ntest.c:3:17:3:18 | -| f | false | 66 | 66 | initializer for result\ntest.c:3:17:3:18 | -| f | false | 69 | 69 | declaration\ntest.c:3:5:3:19 | -| f | false | 71 | 71 | i\ntest.c:4:9:4:9 | -| f | false | 75 | 75 | 0\ntest.c:4:14:4:14 | -| f | false | 76 | 76 | ... != ...\ntest.c:4:9:4:14 | -| f | false | 78 | 78 | result\ntest.c:5:9:5:14 | -| f | false | 80 | 80 | ... ++\ntest.c:5:9:5:16 | -| f | false | 82 | 82 | ExprStmt\ntest.c:5:9:5:17 | -| f | false | 84 | 84 | i\ntest.c:6:16:6:16 | -| f | false | 88 | 88 | 10\ntest.c:6:20:6:21 | -| f | false | 89 | 89 | ... < ...\ntest.c:6:16:6:21 | -| f | false | 91 | 91 | i\ntest.c:7:17:7:17 | -| f | false | 93 | 93 | ... ++\ntest.c:7:17:7:19 | -| f | false | 97 | 97 | 5\ntest.c:7:24:7:24 | -| f | false | 98 | 98 | ... == ...\ntest.c:7:17:7:24 | -| f | false | 100 | 100 | result\ntest.c:8:17:8:22 | -| f | false | 104 | 104 | 7\ntest.c:8:26:8:26 | -| f | false | 105 | 105 | ... = ...\ntest.c:8:17:8:26 | -| f | false | 107 | 107 | ExprStmt\ntest.c:8:17:8:27 | -| f | false | 109 | 109 | break;\ntest.c:9:17:9:22 | -| f | false | 111 | 111 | { ... }\ntest.c:7:27:10:13 | -| f | false | 113 | 113 | if (...) ... \ntest.c:7:13:10:13 | -| f | false | 115 | 115 | { ... }\ntest.c:6:24:11:9 | -| f | false | 117 | 117 | while (...) ...\ntest.c:6:9:11:9 | -| f | false | 119 | 119 | label ...:\ntest.c:11:9:11:9 | -| f | false | 121 | 121 | { ... }\ntest.c:4:17:12:5 | -| f | false | 123 | 123 | if (...) ... \ntest.c:4:5:12:5 | -| f | false | 125 | 125 | result\ntest.c:13:12:13:17 | -| f | false | 127 | 127 | return ...\ntest.c:13:5:13:18 | -| f | false | 129 | 129 | { ... }\ntest.c:2:14:14:1 | -| f | true | 65 | 123 | | -| f | true | 66 | 65 | | -| f | true | 69 | 66 | | -| f | true | 71 | 75 | | -| f | true | 75 | 76 | | -| f | true | 76 | 121 | T | -| f | true | 76 | 127 | F | -| f | true | 78 | 80 | | -| f | true | 80 | 117 | | -| f | true | 82 | 78 | | -| f | true | 84 | 88 | | -| f | true | 88 | 89 | | -| f | true | 89 | 115 | T | -| f | true | 89 | 119 | F | -| f | true | 91 | 93 | | -| f | true | 93 | 97 | | -| f | true | 97 | 98 | | -| f | true | 98 | 84 | F | -| f | true | 98 | 111 | T | -| f | true | 100 | 105 | | -| f | true | 104 | 100 | | -| f | true | 105 | 109 | | -| f | true | 107 | 104 | | -| f | true | 109 | 119 | | -| f | true | 111 | 107 | | -| f | true | 113 | 91 | | -| f | true | 115 | 113 | | -| f | true | 117 | 84 | | -| f | true | 119 | 127 | | -| f | true | 121 | 82 | | -| f | true | 123 | 71 | | -| f | true | 125 | 54 | | -| f | true | 127 | 125 | | -| f | true | 129 | 69 | | -| f_for | false | 131 | 131 | f_for\ntest.c:16:6:16:10 | -| f_for | false | 142 | 142 | 0\ntest.c:18:12:18:13 | -| f_for | false | 143 | 143 | initializer for x\ntest.c:18:12:18:13 | -| f_for | false | 146 | 146 | declaration\ntest.c:17:5:17:10 | -| f_for | false | 148 | 148 | declaration\ntest.c:18:5:18:14 | -| f_for | false | 150 | 150 | i\ntest.c:20:16:20:16 | -| f_for | false | 154 | 154 | 10\ntest.c:20:20:20:21 | -| f_for | false | 155 | 155 | ... < ...\ntest.c:20:16:20:21 | -| f_for | false | 157 | 157 | i\ntest.c:21:13:21:13 | -| f_for | false | 161 | 161 | 5\ntest.c:21:18:21:18 | -| f_for | false | 162 | 162 | ... == ...\ntest.c:21:13:21:18 | -| f_for | false | 164 | 164 | continue;\ntest.c:22:13:22:21 | -| f_for | false | 166 | 166 | { ... }\ntest.c:21:21:23:9 | -| f_for | false | 168 | 168 | if (...) ... \ntest.c:21:9:23:9 | -| f_for | false | 170 | 170 | i\ntest.c:24:13:24:13 | -| f_for | false | 174 | 174 | 7\ntest.c:24:18:24:18 | -| f_for | false | 175 | 175 | ... == ...\ntest.c:24:13:24:18 | -| f_for | false | 177 | 177 | break;\ntest.c:25:13:25:18 | -| f_for | false | 179 | 179 | { ... }\ntest.c:24:21:26:9 | -| f_for | false | 181 | 181 | if (...) ... \ntest.c:24:9:26:9 | -| f_for | false | 183 | 183 | x\ntest.c:27:9:27:9 | -| f_for | false | 185 | 185 | ... ++\ntest.c:27:9:27:11 | -| f_for | false | 187 | 187 | ExprStmt\ntest.c:27:9:27:12 | -| f_for | false | 189 | 189 | label ...:\ntest.c:20:5:20:5 | -| f_for | false | 191 | 191 | { ... }\ntest.c:20:29:28:5 | -| f_for | false | 193 | 193 | i\ntest.c:20:9:20:9 | -| f_for | false | 197 | 197 | 0\ntest.c:20:13:20:13 | -| f_for | false | 198 | 198 | ... = ...\ntest.c:20:9:20:13 | -| f_for | false | 200 | 200 | ExprStmt\ntest.c:20:9:20:14 | -| f_for | false | 202 | 202 | i\ntest.c:20:24:20:24 | -| f_for | false | 204 | 204 | ... ++\ntest.c:20:24:20:26 | -| f_for | false | 206 | 206 | for(...;...;...) ...\ntest.c:20:5:28:5 | -| f_for | false | 208 | 208 | label ...:\ntest.c:28:5:28:5 | -| f_for | false | 210 | 210 | return ...\ntest.c:29:1:29:1 | -| f_for | false | 212 | 212 | { ... }\ntest.c:16:18:29:1 | -| f_for | true | 142 | 206 | | -| f_for | true | 143 | 142 | | -| f_for | true | 146 | 148 | | -| f_for | true | 148 | 143 | | -| f_for | true | 150 | 154 | | -| f_for | true | 154 | 155 | | -| f_for | true | 155 | 191 | T | -| f_for | true | 155 | 208 | F | -| f_for | true | 157 | 161 | | -| f_for | true | 161 | 162 | | -| f_for | true | 162 | 166 | T | -| f_for | true | 162 | 181 | F | -| f_for | true | 164 | 189 | | -| f_for | true | 166 | 164 | | -| f_for | true | 168 | 157 | | -| f_for | true | 170 | 174 | | -| f_for | true | 174 | 175 | | -| f_for | true | 175 | 179 | T | -| f_for | true | 175 | 187 | F | -| f_for | true | 177 | 208 | | -| f_for | true | 179 | 177 | | -| f_for | true | 181 | 170 | | -| f_for | true | 183 | 185 | | -| f_for | true | 185 | 189 | | -| f_for | true | 187 | 183 | | -| f_for | true | 189 | 202 | | -| f_for | true | 191 | 168 | | -| f_for | true | 193 | 198 | | -| f_for | true | 197 | 193 | | -| f_for | true | 198 | 150 | | -| f_for | true | 200 | 197 | | -| f_for | true | 202 | 204 | | -| f_for | true | 204 | 150 | | -| f_for | true | 206 | 200 | | -| f_for | true | 208 | 210 | | -| f_for | true | 210 | 131 | | -| f_for | true | 212 | 146 | | +| f | false | 205 | 205 | f\ntest.c:2:5:2:5 | +| f | false | 213 | 213 | declaration\ntest.c:3:5:3:19 | +| f | false | 218 | 218 | 0\ntest.c:3:17:3:18 | +| f | false | 219 | 219 | initializer for result\ntest.c:3:17:3:18 | +| f | false | 222 | 222 | if (...) ... \ntest.c:4:5:12:5 | +| f | false | 224 | 224 | i\ntest.c:4:9:4:9 | +| f | false | 228 | 228 | 0\ntest.c:4:14:4:14 | +| f | false | 229 | 229 | ... != ...\ntest.c:4:9:4:14 | +| f | false | 231 | 231 | ExprStmt\ntest.c:5:9:5:17 | +| f | false | 233 | 233 | result\ntest.c:5:9:5:14 | +| f | false | 235 | 235 | ... ++\ntest.c:5:9:5:16 | +| f | false | 237 | 237 | while (...) ...\ntest.c:6:9:11:9 | +| f | false | 239 | 239 | i\ntest.c:6:16:6:16 | +| f | false | 243 | 243 | 10\ntest.c:6:20:6:21 | +| f | false | 244 | 244 | ... < ...\ntest.c:6:16:6:21 | +| f | false | 246 | 246 | if (...) ... \ntest.c:7:13:10:13 | +| f | false | 248 | 248 | i\ntest.c:7:17:7:17 | +| f | false | 250 | 250 | ... ++\ntest.c:7:17:7:19 | +| f | false | 254 | 254 | 5\ntest.c:7:24:7:24 | +| f | false | 255 | 255 | ... == ...\ntest.c:7:17:7:24 | +| f | false | 257 | 257 | ExprStmt\ntest.c:8:17:8:27 | +| f | false | 259 | 259 | result\ntest.c:8:17:8:22 | +| f | false | 263 | 263 | 7\ntest.c:8:26:8:26 | +| f | false | 264 | 264 | ... = ...\ntest.c:8:17:8:26 | +| f | false | 266 | 266 | break;\ntest.c:9:17:9:22 | +| f | false | 268 | 268 | { ... }\ntest.c:7:27:10:13 | +| f | false | 270 | 270 | { ... }\ntest.c:6:24:11:9 | +| f | false | 272 | 272 | label ...:\ntest.c:11:9:11:9 | +| f | false | 274 | 274 | { ... }\ntest.c:6:9:6:9 | +| f | false | 276 | 276 | { ... }\ntest.c:4:17:12:5 | +| f | false | 278 | 278 | return ...\ntest.c:13:5:13:18 | +| f | false | 280 | 280 | result\ntest.c:13:12:13:17 | +| f | false | 282 | 282 | { ... }\ntest.c:2:14:14:1 | +| f | true | 213 | 219 | | +| f | true | 218 | 222 | | +| f | true | 219 | 218 | | +| f | true | 222 | 224 | | +| f | true | 224 | 228 | | +| f | true | 228 | 229 | | +| f | true | 229 | 276 | T | +| f | true | 229 | 278 | F | +| f | true | 231 | 233 | | +| f | true | 233 | 235 | | +| f | true | 235 | 274 | | +| f | true | 237 | 239 | | +| f | true | 239 | 243 | | +| f | true | 243 | 244 | | +| f | true | 244 | 270 | T | +| f | true | 244 | 272 | F | +| f | true | 246 | 248 | | +| f | true | 248 | 250 | | +| f | true | 250 | 254 | | +| f | true | 254 | 255 | | +| f | true | 255 | 239 | F | +| f | true | 255 | 268 | T | +| f | true | 257 | 263 | | +| f | true | 259 | 264 | | +| f | true | 263 | 259 | | +| f | true | 264 | 266 | | +| f | true | 266 | 272 | | +| f | true | 268 | 257 | | +| f | true | 270 | 246 | | +| f | true | 272 | 278 | | +| f | true | 274 | 237 | | +| f | true | 276 | 231 | | +| f | true | 278 | 280 | | +| f | true | 280 | 205 | | +| f | true | 282 | 213 | | +| f_for | false | 121 | 121 | f_for\ntest.c:16:6:16:10 | +| f_for | false | 126 | 126 | declaration\ntest.c:17:5:17:10 | +| f_for | false | 131 | 131 | declaration\ntest.c:18:5:18:14 | +| f_for | false | 136 | 136 | 0\ntest.c:18:12:18:13 | +| f_for | false | 137 | 137 | initializer for x\ntest.c:18:12:18:13 | +| f_for | false | 140 | 140 | for(...;...;...) ...\ntest.c:20:5:28:5 | +| f_for | false | 142 | 142 | i\ntest.c:20:16:20:16 | +| f_for | false | 146 | 146 | 10\ntest.c:20:20:20:21 | +| f_for | false | 147 | 147 | ... < ...\ntest.c:20:16:20:21 | +| f_for | false | 149 | 149 | if (...) ... \ntest.c:21:9:23:9 | +| f_for | false | 151 | 151 | i\ntest.c:21:13:21:13 | +| f_for | false | 155 | 155 | 5\ntest.c:21:18:21:18 | +| f_for | false | 156 | 156 | ... == ...\ntest.c:21:13:21:18 | +| f_for | false | 158 | 158 | continue;\ntest.c:22:13:22:21 | +| f_for | false | 160 | 160 | { ... }\ntest.c:21:21:23:9 | +| f_for | false | 162 | 162 | if (...) ... \ntest.c:24:9:26:9 | +| f_for | false | 164 | 164 | i\ntest.c:24:13:24:13 | +| f_for | false | 168 | 168 | 7\ntest.c:24:18:24:18 | +| f_for | false | 169 | 169 | ... == ...\ntest.c:24:13:24:18 | +| f_for | false | 171 | 171 | break;\ntest.c:25:13:25:18 | +| f_for | false | 173 | 173 | { ... }\ntest.c:24:21:26:9 | +| f_for | false | 175 | 175 | ExprStmt\ntest.c:27:9:27:12 | +| f_for | false | 177 | 177 | x\ntest.c:27:9:27:9 | +| f_for | false | 179 | 179 | ... ++\ntest.c:27:9:27:11 | +| f_for | false | 181 | 181 | label ...:\ntest.c:20:5:20:5 | +| f_for | false | 183 | 183 | { ... }\ntest.c:20:29:28:5 | +| f_for | false | 185 | 185 | ExprStmt\ntest.c:20:9:20:14 | +| f_for | false | 187 | 187 | i\ntest.c:20:9:20:9 | +| f_for | false | 191 | 191 | 0\ntest.c:20:13:20:13 | +| f_for | false | 192 | 192 | ... = ...\ntest.c:20:9:20:13 | +| f_for | false | 194 | 194 | i\ntest.c:20:24:20:24 | +| f_for | false | 196 | 196 | ... ++\ntest.c:20:24:20:26 | +| f_for | false | 198 | 198 | label ...:\ntest.c:28:5:28:5 | +| f_for | false | 200 | 200 | { ... }\ntest.c:20:5:20:5 | +| f_for | false | 201 | 201 | return ...\ntest.c:29:1:29:1 | +| f_for | false | 203 | 203 | { ... }\ntest.c:16:18:29:1 | +| f_for | true | 126 | 131 | | +| f_for | true | 131 | 137 | | +| f_for | true | 136 | 200 | | +| f_for | true | 137 | 136 | | +| f_for | true | 140 | 185 | | +| f_for | true | 142 | 146 | | +| f_for | true | 146 | 147 | | +| f_for | true | 147 | 183 | T | +| f_for | true | 147 | 198 | F | +| f_for | true | 149 | 151 | | +| f_for | true | 151 | 155 | | +| f_for | true | 155 | 156 | | +| f_for | true | 156 | 160 | T | +| f_for | true | 156 | 162 | F | +| f_for | true | 158 | 181 | | +| f_for | true | 160 | 158 | | +| f_for | true | 162 | 164 | | +| f_for | true | 164 | 168 | | +| f_for | true | 168 | 169 | | +| f_for | true | 169 | 173 | T | +| f_for | true | 169 | 175 | F | +| f_for | true | 171 | 198 | | +| f_for | true | 173 | 171 | | +| f_for | true | 175 | 177 | | +| f_for | true | 177 | 179 | | +| f_for | true | 179 | 181 | | +| f_for | true | 181 | 194 | | +| f_for | true | 183 | 149 | | +| f_for | true | 185 | 191 | | +| f_for | true | 187 | 192 | | +| f_for | true | 191 | 187 | | +| f_for | true | 192 | 142 | | +| f_for | true | 194 | 196 | | +| f_for | true | 196 | 142 | | +| f_for | true | 198 | 201 | | +| f_for | true | 200 | 140 | | +| f_for | true | 201 | 121 | | +| f_for | true | 203 | 126 | | diff --git a/cpp/ql/test/successor-tests/dostmt/dostmt07.expected b/cpp/ql/test/successor-tests/dostmt/dostmt07.expected index ee9601c673d..10f04304a7e 100644 --- a/cpp/ql/test/successor-tests/dostmt/dostmt07.expected +++ b/cpp/ql/test/successor-tests/dostmt/dostmt07.expected @@ -1,4 +1,5 @@ -| 0 | dostmt.c:8:22:14:1 | { ... } | 1 | dostmt.c:9:3:12:13 | do (...) ... | +| 0 | dostmt.c:8:22:14:1 | { ... } | 1 | dostmt.c:9:3:9:3 | { ... } | +| 1 | dostmt.c:9:3:9:3 | { ... } | 1 | dostmt.c:9:3:12:13 | do (...) ... | | 1 | dostmt.c:9:3:12:13 | do (...) ... | 1 | dostmt.c:9:6:12:3 | { ... } | | 1 | dostmt.c:9:6:12:3 | { ... } | 2 | dostmt.c:10:5:10:7 | label ...: | | 2 | dostmt.c:10:5:10:7 | label ...: | 2 | dostmt.c:10:8:10:8 | ; | diff --git a/cpp/ql/test/successor-tests/dostmt/dostmt08.expected b/cpp/ql/test/successor-tests/dostmt/dostmt08.expected index 5991a930edf..cbdc8438a55 100644 --- a/cpp/ql/test/successor-tests/dostmt/dostmt08.expected +++ b/cpp/ql/test/successor-tests/dostmt/dostmt08.expected @@ -1,4 +1,5 @@ -| 0 | dostmt.c:16:22:23:1 | { ... } | 1 | dostmt.c:17:3:21:13 | do (...) ... | +| 0 | dostmt.c:16:22:23:1 | { ... } | 1 | dostmt.c:17:3:17:3 | { ... } | +| 1 | dostmt.c:17:3:17:3 | { ... } | 1 | dostmt.c:17:3:21:13 | do (...) ... | | 1 | dostmt.c:17:3:21:13 | do (...) ... | 1 | dostmt.c:17:6:21:3 | { ... } | | 1 | dostmt.c:17:6:21:3 | { ... } | 2 | dostmt.c:18:5:18:7 | label ...: | | 2 | dostmt.c:18:5:18:7 | label ...: | 2 | dostmt.c:18:8:18:8 | ; | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt08.expected b/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt08.expected index 7c07a22c811..2dd0bcfbdc5 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt08.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt08.expected @@ -1,12 +1,12 @@ | 0 | ifelsestmt.c:11:23:17:1 | { ... } | 1 | ifelsestmt.c:12:3:15:8 | if (...) ... | | 1 | ifelsestmt.c:12:3:15:8 | if (...) ... | 1 | ifelsestmt.c:12:6:12:6 | 0 | -| 1 | ifelsestmt.c:12:6:12:6 | 0 | -1 | file://:0:0:0:0 | { ... } | +| 1 | ifelsestmt.c:12:6:12:6 | 0 | 4 | ifelsestmt.c:15:5:15:5 | { ... } | +| 2 | ifelsestmt.c:13:5:13:5 | { ... } | 2 | ifelsestmt.c:13:5:13:7 | label ...: | | 2 | ifelsestmt.c:13:5:13:7 | label ...: | 2 | ifelsestmt.c:13:8:13:8 | ; | | 2 | ifelsestmt.c:13:8:13:8 | ; | 5 | ifelsestmt.c:16:3:16:5 | label ...: | +| 4 | ifelsestmt.c:15:5:15:5 | { ... } | 4 | ifelsestmt.c:15:5:15:7 | label ...: | | 4 | ifelsestmt.c:15:5:15:7 | label ...: | 4 | ifelsestmt.c:15:8:15:8 | ; | | 4 | ifelsestmt.c:15:8:15:8 | ; | 5 | ifelsestmt.c:16:3:16:5 | label ...: | | 5 | ifelsestmt.c:16:3:16:5 | label ...: | 5 | ifelsestmt.c:16:6:16:6 | ; | | 5 | ifelsestmt.c:16:6:16:6 | ; | 6 | ifelsestmt.c:17:1:17:1 | return ... | | 6 | ifelsestmt.c:17:1:17:1 | return ... | 0 | ifelsestmt.c:11:6:11:19 | always_false_2 | -| -1 | file://:0:0:0:0 | { ... } | 2 | ifelsestmt.c:13:5:13:7 | label ...: | -| -1 | file://:0:0:0:0 | { ... } | 4 | ifelsestmt.c:15:5:15:7 | label ...: | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt10.expected b/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt10.expected index 4556d22f978..40b9add82cb 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt10.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifelsestmt/ifelsestmt10.expected @@ -1,12 +1,12 @@ | 0 | ifelsestmt.c:29:22:35:1 | { ... } | 1 | ifelsestmt.c:30:3:33:8 | if (...) ... | | 1 | ifelsestmt.c:30:3:33:8 | if (...) ... | 1 | ifelsestmt.c:30:6:30:6 | 1 | -| 1 | ifelsestmt.c:30:6:30:6 | 1 | -1 | file://:0:0:0:0 | { ... } | +| 1 | ifelsestmt.c:30:6:30:6 | 1 | 2 | ifelsestmt.c:31:5:31:5 | { ... } | +| 2 | ifelsestmt.c:31:5:31:5 | { ... } | 2 | ifelsestmt.c:31:5:31:7 | label ...: | | 2 | ifelsestmt.c:31:5:31:7 | label ...: | 2 | ifelsestmt.c:31:8:31:8 | ; | | 2 | ifelsestmt.c:31:8:31:8 | ; | 5 | ifelsestmt.c:34:3:34:5 | label ...: | +| 4 | ifelsestmt.c:33:5:33:5 | { ... } | 4 | ifelsestmt.c:33:5:33:7 | label ...: | | 4 | ifelsestmt.c:33:5:33:7 | label ...: | 4 | ifelsestmt.c:33:8:33:8 | ; | | 4 | ifelsestmt.c:33:8:33:8 | ; | 5 | ifelsestmt.c:34:3:34:5 | label ...: | | 5 | ifelsestmt.c:34:3:34:5 | label ...: | 5 | ifelsestmt.c:34:6:34:6 | ; | | 5 | ifelsestmt.c:34:6:34:6 | ; | 6 | ifelsestmt.c:35:1:35:1 | return ... | | 6 | ifelsestmt.c:35:1:35:1 | return ... | 0 | ifelsestmt.c:29:6:29:18 | always_true_2 | -| -1 | file://:0:0:0:0 | { ... } | 2 | ifelsestmt.c:31:5:31:7 | label ...: | -| -1 | file://:0:0:0:0 | { ... } | 4 | ifelsestmt.c:33:5:33:7 | label ...: | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt.cpp b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt.cpp new file mode 100644 index 00000000000..b8d09edffca --- /dev/null +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt.cpp @@ -0,0 +1,8 @@ +void normal(int x, int y) { + if(int z = y; x == z) { + l1:; + } + l2:; +} + +// semmle-extractor-options: -std=c++17 diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt01.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt01.expected index 9ed533ab840..73752ac3834 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt01.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt01.expected @@ -1 +1,2 @@ | ifstmt.c:28:6:28:11 | ... == ... | l2 | +| ifstmt.cpp:2:17:2:22 | ... == ... | l2 | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt02.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt02.expected index 1dfd5b6042e..fcc99833adc 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt02.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt02.expected @@ -1 +1,2 @@ | ifstmt.c:28:6:28:11 | ... == ... | l1 | +| ifstmt.cpp:2:17:2:22 | ... == ... | l1 | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt04.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt04.expected index a3eb12cc2c2..6de3a7b13f0 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt04.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt04.expected @@ -1 +1,2 @@ | ifstmt.c:29:8:29:8 | ; | l2 | +| ifstmt.cpp:3:8:3:8 | ; | l2 | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt05.ql b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt05.ql index 46d6d103b8a..e59a59a01f4 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt05.ql +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt05.ql @@ -1,6 +1,9 @@ /** * @name ifstmt05 - * @description Every if statement has its condition or one of the condition's descendants as its unique successor. + * @description Every if statement with an initialization has the initialization or one of the + * initialization's descendants as its unique successor. Every if statement without + * and initialization has its condition or one of the condition's descendants as + * its unique successor. */ import cpp @@ -8,7 +11,11 @@ import cpp from IfStmt is where not ( - is.getASuccessor() = is.getCondition().getAChild*() and + ( + if exists(is.getInitialization()) + then is.getASuccessor() = is.getInitialization().getAChild*() + else is.getASuccessor() = is.getCondition().getAChild*() + ) and count(is.getASuccessor()) = 1 ) select is diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt07.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt07.expected index 8223f1d0c54..442846d7db7 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt07.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt07.expected @@ -1,9 +1,9 @@ | 0 | ifstmt.c:8:23:12:1 | { ... } | 1 | ifstmt.c:9:3:10:8 | if (...) ... | | 1 | ifstmt.c:9:3:10:8 | if (...) ... | 1 | ifstmt.c:9:6:9:6 | 0 | | 1 | ifstmt.c:9:6:9:6 | 0 | 3 | ifstmt.c:11:3:11:5 | label ...: | +| 2 | ifstmt.c:10:5:10:5 | { ... } | 2 | ifstmt.c:10:5:10:7 | label ...: | | 2 | ifstmt.c:10:5:10:7 | label ...: | 2 | ifstmt.c:10:8:10:8 | ; | | 2 | ifstmt.c:10:8:10:8 | ; | 3 | ifstmt.c:11:3:11:5 | label ...: | | 3 | ifstmt.c:11:3:11:5 | label ...: | 3 | ifstmt.c:11:6:11:6 | ; | | 3 | ifstmt.c:11:6:11:6 | ; | 4 | ifstmt.c:12:1:12:1 | return ... | | 4 | ifstmt.c:12:1:12:1 | return ... | 0 | ifstmt.c:8:6:8:19 | always_false_2 | -| -1 | file://:0:0:0:0 | { ... } | 2 | ifstmt.c:10:5:10:7 | label ...: | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt09.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt09.expected index a5b27cb720b..d2bc2cadcd0 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt09.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt09.expected @@ -1,9 +1,9 @@ | 0 | ifstmt.c:21:22:25:1 | { ... } | 1 | ifstmt.c:22:3:23:8 | if (...) ... | | 1 | ifstmt.c:22:3:23:8 | if (...) ... | 1 | ifstmt.c:22:6:22:6 | 1 | -| 1 | ifstmt.c:22:6:22:6 | 1 | -1 | file://:0:0:0:0 | { ... } | +| 1 | ifstmt.c:22:6:22:6 | 1 | 2 | ifstmt.c:23:5:23:5 | { ... } | +| 2 | ifstmt.c:23:5:23:5 | { ... } | 2 | ifstmt.c:23:5:23:7 | label ...: | | 2 | ifstmt.c:23:5:23:7 | label ...: | 2 | ifstmt.c:23:8:23:8 | ; | | 2 | ifstmt.c:23:8:23:8 | ; | 3 | ifstmt.c:24:3:24:5 | label ...: | | 3 | ifstmt.c:24:3:24:5 | label ...: | 3 | ifstmt.c:24:6:24:6 | ; | | 3 | ifstmt.c:24:6:24:6 | ; | 4 | ifstmt.c:25:1:25:1 | return ... | | 4 | ifstmt.c:25:1:25:1 | return ... | 0 | ifstmt.c:21:6:21:18 | always_true_2 | -| -1 | file://:0:0:0:0 | { ... } | 2 | ifstmt.c:23:5:23:7 | label ...: | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt10.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt10.expected index 8ffff11ac6e..a031d5f7d66 100644 --- a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt10.expected +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt10.expected @@ -1,12 +1,27 @@ | 0 | ifstmt.c:27:27:32:1 | { ... } | 1 | ifstmt.c:28:3:30:3 | if (...) ... | +| 0 | ifstmt.cpp:1:27:6:1 | { ... } | 1 | ifstmt.cpp:2:3:4:3 | if (...) ... | | 1 | ifstmt.c:28:3:30:3 | if (...) ... | 1 | ifstmt.c:28:6:28:6 | x | | 1 | ifstmt.c:28:6:28:6 | x | 1 | ifstmt.c:28:11:28:11 | y | | 1 | ifstmt.c:28:6:28:11 | ... == ... | 1 | ifstmt.c:28:14:30:3 | { ... } | | 1 | ifstmt.c:28:6:28:11 | ... == ... | 4 | ifstmt.c:31:3:31:5 | label ...: | | 1 | ifstmt.c:28:11:28:11 | y | 1 | ifstmt.c:28:6:28:11 | ... == ... | | 1 | ifstmt.c:28:14:30:3 | { ... } | 2 | ifstmt.c:29:5:29:7 | label ...: | +| 1 | ifstmt.cpp:2:3:4:3 | if (...) ... | 1 | ifstmt.cpp:2:6:2:6 | declaration | +| 1 | ifstmt.cpp:2:6:2:6 | declaration | 1 | ifstmt.cpp:2:13:2:14 | initializer for z | +| 1 | ifstmt.cpp:2:13:2:14 | initializer for z | 1 | ifstmt.cpp:2:14:2:14 | y | +| 1 | ifstmt.cpp:2:14:2:14 | y | 1 | ifstmt.cpp:2:17:2:17 | x | +| 1 | ifstmt.cpp:2:17:2:17 | x | 1 | ifstmt.cpp:2:22:2:22 | z | +| 1 | ifstmt.cpp:2:17:2:22 | ... == ... | 1 | ifstmt.cpp:2:25:4:3 | { ... } | +| 1 | ifstmt.cpp:2:17:2:22 | ... == ... | 4 | ifstmt.cpp:5:3:5:5 | label ...: | +| 1 | ifstmt.cpp:2:22:2:22 | z | 1 | ifstmt.cpp:2:17:2:22 | ... == ... | +| 1 | ifstmt.cpp:2:25:4:3 | { ... } | 2 | ifstmt.cpp:3:5:3:7 | label ...: | | 2 | ifstmt.c:29:5:29:7 | label ...: | 2 | ifstmt.c:29:8:29:8 | ; | | 2 | ifstmt.c:29:8:29:8 | ; | 4 | ifstmt.c:31:3:31:5 | label ...: | +| 2 | ifstmt.cpp:3:5:3:7 | label ...: | 2 | ifstmt.cpp:3:8:3:8 | ; | +| 2 | ifstmt.cpp:3:8:3:8 | ; | 4 | ifstmt.cpp:5:3:5:5 | label ...: | | 4 | ifstmt.c:31:3:31:5 | label ...: | 4 | ifstmt.c:31:6:31:6 | ; | | 4 | ifstmt.c:31:6:31:6 | ; | 5 | ifstmt.c:32:1:32:1 | return ... | +| 4 | ifstmt.cpp:5:3:5:5 | label ...: | 4 | ifstmt.cpp:5:6:5:6 | ; | +| 4 | ifstmt.cpp:5:6:5:6 | ; | 5 | ifstmt.cpp:6:1:6:1 | return ... | | 5 | ifstmt.c:32:1:32:1 | return ... | 0 | ifstmt.c:27:6:27:11 | normal | +| 5 | ifstmt.cpp:6:1:6:1 | return ... | 0 | ifstmt.cpp:1:6:1:11 | normal | diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt11.expected b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt11.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt11.ql b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt11.ql new file mode 100644 index 00000000000..ad729b076e6 --- /dev/null +++ b/cpp/ql/test/successor-tests/ifstmt/ifstmt/ifstmt11.ql @@ -0,0 +1,15 @@ +/** + * @name ifstmt11 + * @description If an initialization exists, then the condition is a successor of the initialization. + */ + +import cpp + +from IfStmt is, Expr e, Stmt s, ControlFlowNode n +where + s = is.getInitialization() and + e = is.getCondition() and + n = s.getASuccessor*() and + not exists(ControlFlowNode m | m = e.getASuccessor*() | m = n) and + not exists(ControlFlowNode m | m = e.getAPredecessor*() | m = n) +select is diff --git a/cpp/ql/test/successor-tests/pruning/graphable.expected b/cpp/ql/test/successor-tests/pruning/graphable.expected index fe4325329c5..b3aa9de1906 100644 --- a/cpp/ql/test/successor-tests/pruning/graphable.expected +++ b/cpp/ql/test/successor-tests/pruning/graphable.expected @@ -1,557 +1,575 @@ -| f_0 | false | 125 | 125 | f_0 | -| f_0 | false | 130 | 130 | 0 | -| f_0 | false | 133 | 133 | return ... | -| f_0 | false | 135 | 135 | { ... } | -| f_0 | false | 137 | 137 | ; | -| f_0 | false | 139 | 139 | { ... } | -| f_0 | false | 141 | 141 | if (...) ... | -| f_0 | false | 143 | 143 | return ... | -| f_0 | false | 145 | 145 | { ... } | -| f_0 | true | 130 | 139 | F | -| f_0 | true | 133 | 125 | | -| f_0 | true | 135 | 133 | | -| f_0 | true | 137 | 143 | | -| f_0 | true | 139 | 137 | | -| f_0 | true | 141 | 130 | | -| f_0 | true | 143 | 125 | | -| f_0 | true | 145 | 141 | | -| f_1 | false | 148 | 148 | f_1 | -| f_1 | false | 153 | 153 | 1 | -| f_1 | false | 154 | 154 | return ... | -| f_1 | false | 156 | 156 | { ... } | -| f_1 | false | 160 | 160 | ; | -| f_1 | false | 162 | 162 | { ... } | -| f_1 | false | 164 | 164 | if (...) ... | -| f_1 | false | 166 | 166 | return ... | -| f_1 | false | 168 | 168 | { ... } | -| f_1 | true | 153 | 156 | T | -| f_1 | true | 154 | 148 | | -| f_1 | true | 156 | 154 | | -| f_1 | true | 160 | 166 | | -| f_1 | true | 162 | 160 | | -| f_1 | true | 164 | 153 | | -| f_1 | true | 166 | 148 | | -| f_1 | true | 168 | 164 | | -| f_256 | false | 171 | 171 | f_256 | -| f_256 | false | 176 | 176 | 256 | -| f_256 | false | 177 | 177 | return ... | -| f_256 | false | 179 | 179 | { ... } | -| f_256 | false | 183 | 183 | ; | -| f_256 | false | 185 | 185 | { ... } | -| f_256 | false | 187 | 187 | if (...) ... | -| f_256 | false | 189 | 189 | return ... | -| f_256 | false | 191 | 191 | { ... } | -| f_256 | true | 176 | 179 | T | -| f_256 | true | 177 | 171 | | -| f_256 | true | 179 | 177 | | -| f_256 | true | 183 | 189 | | -| f_256 | true | 185 | 183 | | -| f_256 | true | 187 | 176 | | -| f_256 | true | 189 | 171 | | -| f_256 | true | 191 | 187 | | -| f_uint8_t_0 | false | 194 | 194 | f_uint8_t_0 | -| f_uint8_t_0 | false | 199 | 199 | 0 | -| f_uint8_t_0 | false | 200 | 200 | (uint8_t)... | -| f_uint8_t_0 | false | 206 | 206 | return ... | -| f_uint8_t_0 | false | 208 | 208 | { ... } | -| f_uint8_t_0 | false | 210 | 210 | ; | -| f_uint8_t_0 | false | 212 | 212 | { ... } | -| f_uint8_t_0 | false | 214 | 214 | if (...) ... | -| f_uint8_t_0 | false | 216 | 216 | return ... | -| f_uint8_t_0 | false | 218 | 218 | { ... } | -| f_uint8_t_0 | true | 199 | 212 | F | -| f_uint8_t_0 | true | 206 | 194 | | -| f_uint8_t_0 | true | 208 | 206 | | -| f_uint8_t_0 | true | 210 | 216 | | -| f_uint8_t_0 | true | 212 | 210 | | -| f_uint8_t_0 | true | 214 | 199 | | -| f_uint8_t_0 | true | 216 | 194 | | -| f_uint8_t_0 | true | 218 | 214 | | -| f_uint8_t_1 | false | 221 | 221 | f_uint8_t_1 | -| f_uint8_t_1 | false | 226 | 226 | 1 | -| f_uint8_t_1 | false | 227 | 227 | (uint8_t)... | -| f_uint8_t_1 | false | 231 | 231 | return ... | -| f_uint8_t_1 | false | 233 | 233 | { ... } | -| f_uint8_t_1 | false | 237 | 237 | ; | -| f_uint8_t_1 | false | 239 | 239 | { ... } | -| f_uint8_t_1 | false | 241 | 241 | if (...) ... | -| f_uint8_t_1 | false | 243 | 243 | return ... | -| f_uint8_t_1 | false | 245 | 245 | { ... } | -| f_uint8_t_1 | true | 226 | 233 | T | -| f_uint8_t_1 | true | 231 | 221 | | -| f_uint8_t_1 | true | 233 | 231 | | -| f_uint8_t_1 | true | 237 | 243 | | -| f_uint8_t_1 | true | 239 | 237 | | -| f_uint8_t_1 | true | 241 | 226 | | -| f_uint8_t_1 | true | 243 | 221 | | -| f_uint8_t_1 | true | 245 | 241 | | -| f_uint8_t_256 | false | 248 | 248 | f_uint8_t_256 | -| f_uint8_t_256 | false | 253 | 253 | 256 | -| f_uint8_t_256 | false | 254 | 254 | (uint8_t)... | -| f_uint8_t_256 | false | 260 | 260 | return ... | -| f_uint8_t_256 | false | 262 | 262 | { ... } | -| f_uint8_t_256 | false | 264 | 264 | ; | -| f_uint8_t_256 | false | 266 | 266 | { ... } | -| f_uint8_t_256 | false | 268 | 268 | if (...) ... | -| f_uint8_t_256 | false | 270 | 270 | return ... | -| f_uint8_t_256 | false | 272 | 272 | { ... } | -| f_uint8_t_256 | true | 253 | 266 | F | -| f_uint8_t_256 | true | 260 | 248 | | -| f_uint8_t_256 | true | 262 | 260 | | -| f_uint8_t_256 | true | 264 | 270 | | -| f_uint8_t_256 | true | 266 | 264 | | -| f_uint8_t_256 | true | 268 | 253 | | -| f_uint8_t_256 | true | 270 | 248 | | -| f_uint8_t_256 | true | 272 | 268 | | -| f_uint8_t_257 | false | 275 | 275 | f_uint8_t_257 | -| f_uint8_t_257 | false | 280 | 280 | 257 | -| f_uint8_t_257 | false | 281 | 281 | (uint8_t)... | -| f_uint8_t_257 | false | 285 | 285 | return ... | -| f_uint8_t_257 | false | 287 | 287 | { ... } | -| f_uint8_t_257 | false | 291 | 291 | ; | -| f_uint8_t_257 | false | 293 | 293 | { ... } | -| f_uint8_t_257 | false | 295 | 295 | if (...) ... | -| f_uint8_t_257 | false | 297 | 297 | return ... | -| f_uint8_t_257 | false | 299 | 299 | { ... } | -| f_uint8_t_257 | true | 280 | 287 | T | -| f_uint8_t_257 | true | 285 | 275 | | -| f_uint8_t_257 | true | 287 | 285 | | -| f_uint8_t_257 | true | 291 | 297 | | -| f_uint8_t_257 | true | 293 | 291 | | -| f_uint8_t_257 | true | 295 | 280 | | -| f_uint8_t_257 | true | 297 | 275 | | -| f_uint8_t_257 | true | 299 | 295 | | -| f_uint8_t_minus1 | false | 302 | 302 | f_uint8_t_minus1 | -| f_uint8_t_minus1 | false | 307 | 307 | 255 | -| f_uint8_t_minus1 | false | 310 | 310 | 1 | -| f_uint8_t_minus1 | false | 311 | 311 | - ... | -| f_uint8_t_minus1 | false | 313 | 313 | (uint8_t)... | -| f_uint8_t_minus1 | false | 315 | 315 | (int)... | -| f_uint8_t_minus1 | false | 319 | 319 | ... == ... | -| f_uint8_t_minus1 | false | 323 | 323 | return ... | -| f_uint8_t_minus1 | false | 325 | 325 | { ... } | -| f_uint8_t_minus1 | false | 329 | 329 | ; | -| f_uint8_t_minus1 | false | 331 | 331 | { ... } | -| f_uint8_t_minus1 | false | 333 | 333 | if (...) ... | -| f_uint8_t_minus1 | false | 335 | 335 | return ... | -| f_uint8_t_minus1 | false | 337 | 337 | { ... } | -| f_uint8_t_minus1 | true | 307 | 310 | | -| f_uint8_t_minus1 | true | 310 | 311 | | -| f_uint8_t_minus1 | true | 311 | 319 | | -| f_uint8_t_minus1 | true | 319 | 325 | T | -| f_uint8_t_minus1 | true | 323 | 302 | | -| f_uint8_t_minus1 | true | 325 | 323 | | -| f_uint8_t_minus1 | true | 329 | 335 | | -| f_uint8_t_minus1 | true | 331 | 329 | | -| f_uint8_t_minus1 | true | 333 | 307 | | -| f_uint8_t_minus1 | true | 335 | 302 | | -| f_uint8_t_minus1 | true | 337 | 333 | | -| f_v_int_0 | false | 340 | 340 | f_v_int_0 | -| f_v_int_0 | false | 346 | 346 | 0 | -| f_v_int_0 | false | 347 | 347 | initializer for i | -| f_v_int_0 | false | 350 | 350 | declaration | -| f_v_int_0 | false | 352 | 352 | i | -| f_v_int_0 | false | 356 | 356 | return ... | -| f_v_int_0 | false | 358 | 358 | { ... } | -| f_v_int_0 | false | 360 | 360 | ; | -| f_v_int_0 | false | 362 | 362 | { ... } | -| f_v_int_0 | false | 364 | 364 | if (...) ... | -| f_v_int_0 | false | 366 | 366 | return ... | -| f_v_int_0 | false | 368 | 368 | { ... } | -| f_v_int_0 | true | 346 | 364 | | -| f_v_int_0 | true | 347 | 346 | | -| f_v_int_0 | true | 350 | 347 | | -| f_v_int_0 | true | 352 | 362 | F | -| f_v_int_0 | true | 356 | 340 | | -| f_v_int_0 | true | 358 | 356 | | -| f_v_int_0 | true | 360 | 366 | | -| f_v_int_0 | true | 362 | 360 | | -| f_v_int_0 | true | 364 | 352 | | -| f_v_int_0 | true | 366 | 340 | | -| f_v_int_0 | true | 368 | 350 | | -| f_v_int_1 | false | 371 | 371 | f_v_int_1 | -| f_v_int_1 | false | 377 | 377 | 1 | -| f_v_int_1 | false | 378 | 378 | initializer for i | -| f_v_int_1 | false | 381 | 381 | declaration | -| f_v_int_1 | false | 383 | 383 | i | -| f_v_int_1 | false | 385 | 385 | return ... | -| f_v_int_1 | false | 387 | 387 | { ... } | -| f_v_int_1 | false | 391 | 391 | ; | -| f_v_int_1 | false | 393 | 393 | { ... } | -| f_v_int_1 | false | 395 | 395 | if (...) ... | -| f_v_int_1 | false | 397 | 397 | return ... | -| f_v_int_1 | false | 399 | 399 | { ... } | -| f_v_int_1 | true | 377 | 395 | | -| f_v_int_1 | true | 378 | 377 | | -| f_v_int_1 | true | 381 | 378 | | -| f_v_int_1 | true | 383 | 387 | T | -| f_v_int_1 | true | 385 | 371 | | -| f_v_int_1 | true | 387 | 385 | | -| f_v_int_1 | true | 391 | 397 | | -| f_v_int_1 | true | 393 | 391 | | -| f_v_int_1 | true | 395 | 383 | | -| f_v_int_1 | true | 397 | 371 | | -| f_v_int_1 | true | 399 | 381 | | -| f_v_int_256 | false | 402 | 402 | f_v_int_256 | -| f_v_int_256 | false | 408 | 408 | 256 | -| f_v_int_256 | false | 409 | 409 | initializer for i | -| f_v_int_256 | false | 412 | 412 | declaration | -| f_v_int_256 | false | 414 | 414 | i | -| f_v_int_256 | false | 416 | 416 | return ... | -| f_v_int_256 | false | 418 | 418 | { ... } | -| f_v_int_256 | false | 422 | 422 | ; | -| f_v_int_256 | false | 424 | 424 | { ... } | -| f_v_int_256 | false | 426 | 426 | if (...) ... | -| f_v_int_256 | false | 428 | 428 | return ... | -| f_v_int_256 | false | 430 | 430 | { ... } | -| f_v_int_256 | true | 408 | 426 | | -| f_v_int_256 | true | 409 | 408 | | -| f_v_int_256 | true | 412 | 409 | | -| f_v_int_256 | true | 414 | 418 | T | -| f_v_int_256 | true | 416 | 402 | | -| f_v_int_256 | true | 418 | 416 | | -| f_v_int_256 | true | 422 | 428 | | -| f_v_int_256 | true | 424 | 422 | | -| f_v_int_256 | true | 426 | 414 | | -| f_v_int_256 | true | 428 | 402 | | -| f_v_int_256 | true | 430 | 412 | | -| f_v_uint8_t_0 | false | 433 | 433 | f_v_uint8_t_0 | -| f_v_uint8_t_0 | false | 439 | 439 | 0 | -| f_v_uint8_t_0 | false | 440 | 440 | (uint8_t)... | -| f_v_uint8_t_0 | false | 443 | 443 | initializer for i | -| f_v_uint8_t_0 | false | 447 | 447 | declaration | -| f_v_uint8_t_0 | false | 449 | 449 | i | -| f_v_uint8_t_0 | false | 453 | 453 | return ... | -| f_v_uint8_t_0 | false | 455 | 455 | { ... } | -| f_v_uint8_t_0 | false | 457 | 457 | ; | -| f_v_uint8_t_0 | false | 459 | 459 | { ... } | -| f_v_uint8_t_0 | false | 461 | 461 | if (...) ... | -| f_v_uint8_t_0 | false | 463 | 463 | return ... | -| f_v_uint8_t_0 | false | 465 | 465 | { ... } | -| f_v_uint8_t_0 | true | 439 | 461 | | -| f_v_uint8_t_0 | true | 443 | 439 | | -| f_v_uint8_t_0 | true | 447 | 443 | | -| f_v_uint8_t_0 | true | 449 | 459 | F | -| f_v_uint8_t_0 | true | 453 | 433 | | -| f_v_uint8_t_0 | true | 455 | 453 | | -| f_v_uint8_t_0 | true | 457 | 463 | | -| f_v_uint8_t_0 | true | 459 | 457 | | -| f_v_uint8_t_0 | true | 461 | 449 | | -| f_v_uint8_t_0 | true | 463 | 433 | | -| f_v_uint8_t_0 | true | 465 | 447 | | -| f_v_uint8_t_1 | false | 468 | 468 | f_v_uint8_t_1 | -| f_v_uint8_t_1 | false | 474 | 474 | 1 | -| f_v_uint8_t_1 | false | 475 | 475 | (uint8_t)... | -| f_v_uint8_t_1 | false | 478 | 478 | initializer for i | -| f_v_uint8_t_1 | false | 482 | 482 | declaration | -| f_v_uint8_t_1 | false | 484 | 484 | i | -| f_v_uint8_t_1 | false | 486 | 486 | return ... | -| f_v_uint8_t_1 | false | 488 | 488 | { ... } | -| f_v_uint8_t_1 | false | 492 | 492 | ; | -| f_v_uint8_t_1 | false | 494 | 494 | { ... } | -| f_v_uint8_t_1 | false | 496 | 496 | if (...) ... | -| f_v_uint8_t_1 | false | 498 | 498 | return ... | -| f_v_uint8_t_1 | false | 500 | 500 | { ... } | -| f_v_uint8_t_1 | true | 474 | 496 | | -| f_v_uint8_t_1 | true | 478 | 474 | | -| f_v_uint8_t_1 | true | 482 | 478 | | -| f_v_uint8_t_1 | true | 484 | 488 | T | -| f_v_uint8_t_1 | true | 486 | 468 | | -| f_v_uint8_t_1 | true | 488 | 486 | | -| f_v_uint8_t_1 | true | 492 | 498 | | -| f_v_uint8_t_1 | true | 494 | 492 | | -| f_v_uint8_t_1 | true | 496 | 484 | | -| f_v_uint8_t_1 | true | 498 | 468 | | -| f_v_uint8_t_1 | true | 500 | 482 | | -| f_v_uint8_t_256 | false | 503 | 503 | f_v_uint8_t_256 | -| f_v_uint8_t_256 | false | 509 | 509 | 256 | -| f_v_uint8_t_256 | false | 510 | 510 | (uint8_t)... | -| f_v_uint8_t_256 | false | 513 | 513 | initializer for i | -| f_v_uint8_t_256 | false | 517 | 517 | declaration | -| f_v_uint8_t_256 | false | 519 | 519 | i | -| f_v_uint8_t_256 | false | 523 | 523 | return ... | -| f_v_uint8_t_256 | false | 525 | 525 | { ... } | -| f_v_uint8_t_256 | false | 527 | 527 | ; | -| f_v_uint8_t_256 | false | 529 | 529 | { ... } | -| f_v_uint8_t_256 | false | 531 | 531 | if (...) ... | -| f_v_uint8_t_256 | false | 533 | 533 | return ... | -| f_v_uint8_t_256 | false | 535 | 535 | { ... } | -| f_v_uint8_t_256 | true | 509 | 531 | | -| f_v_uint8_t_256 | true | 513 | 509 | | -| f_v_uint8_t_256 | true | 517 | 513 | | -| f_v_uint8_t_256 | true | 519 | 529 | F | -| f_v_uint8_t_256 | true | 523 | 503 | | -| f_v_uint8_t_256 | true | 525 | 523 | | -| f_v_uint8_t_256 | true | 527 | 533 | | -| f_v_uint8_t_256 | true | 529 | 527 | | -| f_v_uint8_t_256 | true | 531 | 519 | | -| f_v_uint8_t_256 | true | 533 | 503 | | -| f_v_uint8_t_256 | true | 535 | 517 | | -| f_v_uint8_t_257 | false | 538 | 538 | f_v_uint8_t_257 | -| f_v_uint8_t_257 | false | 544 | 544 | 257 | -| f_v_uint8_t_257 | false | 545 | 545 | (uint8_t)... | -| f_v_uint8_t_257 | false | 548 | 548 | initializer for i | -| f_v_uint8_t_257 | false | 552 | 552 | declaration | -| f_v_uint8_t_257 | false | 554 | 554 | i | -| f_v_uint8_t_257 | false | 556 | 556 | return ... | -| f_v_uint8_t_257 | false | 558 | 558 | { ... } | -| f_v_uint8_t_257 | false | 562 | 562 | ; | -| f_v_uint8_t_257 | false | 564 | 564 | { ... } | -| f_v_uint8_t_257 | false | 566 | 566 | if (...) ... | -| f_v_uint8_t_257 | false | 568 | 568 | return ... | -| f_v_uint8_t_257 | false | 570 | 570 | { ... } | -| f_v_uint8_t_257 | true | 544 | 566 | | -| f_v_uint8_t_257 | true | 548 | 544 | | -| f_v_uint8_t_257 | true | 552 | 548 | | -| f_v_uint8_t_257 | true | 554 | 558 | T | -| f_v_uint8_t_257 | true | 556 | 538 | | -| f_v_uint8_t_257 | true | 558 | 556 | | -| f_v_uint8_t_257 | true | 562 | 568 | | -| f_v_uint8_t_257 | true | 564 | 562 | | -| f_v_uint8_t_257 | true | 566 | 554 | | -| f_v_uint8_t_257 | true | 568 | 538 | | -| f_v_uint8_t_257 | true | 570 | 552 | | -| f_v_uint8_t_minus1 | false | 573 | 573 | f_v_uint8_t_minus1 | -| f_v_uint8_t_minus1 | false | 579 | 579 | 1 | -| f_v_uint8_t_minus1 | false | 580 | 580 | - ... | -| f_v_uint8_t_minus1 | false | 582 | 582 | (uint8_t)... | -| f_v_uint8_t_minus1 | false | 586 | 586 | initializer for i | -| f_v_uint8_t_minus1 | false | 590 | 590 | declaration | -| f_v_uint8_t_minus1 | false | 594 | 594 | 255 | -| f_v_uint8_t_minus1 | false | 595 | 595 | i | -| f_v_uint8_t_minus1 | false | 597 | 597 | (int)... | -| f_v_uint8_t_minus1 | false | 599 | 599 | ... == ... | -| f_v_uint8_t_minus1 | false | 601 | 601 | return ... | -| f_v_uint8_t_minus1 | false | 603 | 603 | { ... } | -| f_v_uint8_t_minus1 | false | 607 | 607 | ; | -| f_v_uint8_t_minus1 | false | 609 | 609 | { ... } | -| f_v_uint8_t_minus1 | false | 611 | 611 | if (...) ... | -| f_v_uint8_t_minus1 | false | 613 | 613 | return ... | -| f_v_uint8_t_minus1 | false | 615 | 615 | { ... } | -| f_v_uint8_t_minus1 | true | 579 | 580 | | -| f_v_uint8_t_minus1 | true | 580 | 611 | | -| f_v_uint8_t_minus1 | true | 586 | 579 | | -| f_v_uint8_t_minus1 | true | 590 | 586 | | -| f_v_uint8_t_minus1 | true | 594 | 595 | | -| f_v_uint8_t_minus1 | true | 595 | 599 | | -| f_v_uint8_t_minus1 | true | 599 | 603 | T | -| f_v_uint8_t_minus1 | true | 601 | 573 | | -| f_v_uint8_t_minus1 | true | 603 | 601 | | -| f_v_uint8_t_minus1 | true | 607 | 613 | | -| f_v_uint8_t_minus1 | true | 609 | 607 | | -| f_v_uint8_t_minus1 | true | 611 | 594 | | -| f_v_uint8_t_minus1 | true | 613 | 573 | | -| f_v_uint8_t_minus1 | true | 615 | 590 | | -| switch_asm | false | 878 | 878 | switch_asm | -| switch_asm | false | 884 | 884 | 0 | -| switch_asm | false | 885 | 885 | initializer for faulted | -| switch_asm | false | 888 | 888 | declaration | -| switch_asm | false | 890 | 890 | faulted | -| switch_asm | false | 892 | 892 | faulted | -| switch_asm | false | 894 | 894 | asm statement | -| switch_asm | false | 896 | 896 | faulted | -| switch_asm | false | 900 | 900 | 1 | -| switch_asm | false | 901 | 901 | case ...: | -| switch_asm | false | 903 | 903 | break; | -| switch_asm | false | 905 | 905 | { ... } | -| switch_asm | false | 907 | 907 | switch (...) ... | -| switch_asm | false | 909 | 909 | label ...: | -| switch_asm | false | 911 | 911 | return ... | -| switch_asm | false | 913 | 913 | { ... } | -| switch_asm | true | 884 | 894 | | -| switch_asm | true | 885 | 884 | | -| switch_asm | true | 888 | 885 | | -| switch_asm | true | 890 | 892 | | -| switch_asm | true | 892 | 907 | | -| switch_asm | true | 894 | 890 | | -| switch_asm | true | 896 | 905 | | -| switch_asm | true | 901 | 903 | | -| switch_asm | true | 903 | 909 | | -| switch_asm | true | 905 | 901 | | -| switch_asm | true | 905 | 909 | | -| switch_asm | true | 907 | 896 | | -| switch_asm | true | 909 | 911 | | -| switch_asm | true | 911 | 878 | | -| switch_asm | true | 913 | 888 | | -| switch_f_0 | false | 618 | 618 | switch_f_0 | -| switch_f_0 | false | 623 | 623 | 255 | -| switch_f_0 | false | 626 | 626 | 0 | -| switch_f_0 | false | 627 | 627 | case ...: | -| switch_f_0 | false | 631 | 631 | break; | -| switch_f_0 | false | 633 | 633 | { ... } | -| switch_f_0 | false | 635 | 635 | switch (...) ... | -| switch_f_0 | false | 637 | 637 | label ...: | -| switch_f_0 | false | 639 | 639 | return ... | -| switch_f_0 | false | 641 | 641 | { ... } | -| switch_f_0 | true | 623 | 633 | | -| switch_f_0 | true | 627 | 631 | | -| switch_f_0 | true | 631 | 637 | | -| switch_f_0 | true | 633 | 637 | | -| switch_f_0 | true | 635 | 623 | | -| switch_f_0 | true | 637 | 639 | | -| switch_f_0 | true | 639 | 618 | | -| switch_f_0 | true | 641 | 635 | | -| switch_f_255 | false | 644 | 644 | switch_f_255 | -| switch_f_255 | false | 649 | 649 | 255 | -| switch_f_255 | false | 652 | 652 | 255 | -| switch_f_255 | false | 653 | 653 | case ...: | -| switch_f_255 | false | 655 | 655 | break; | -| switch_f_255 | false | 657 | 657 | { ... } | -| switch_f_255 | false | 659 | 659 | switch (...) ... | -| switch_f_255 | false | 661 | 661 | label ...: | -| switch_f_255 | false | 663 | 663 | return ... | -| switch_f_255 | false | 665 | 665 | { ... } | -| switch_f_255 | true | 649 | 657 | | -| switch_f_255 | true | 653 | 655 | | -| switch_f_255 | true | 655 | 661 | | -| switch_f_255 | true | 657 | 653 | | -| switch_f_255 | true | 657 | 661 | | -| switch_f_255 | true | 659 | 649 | | -| switch_f_255 | true | 661 | 663 | | -| switch_f_255 | true | 663 | 644 | | -| switch_f_255 | true | 665 | 659 | | -| switch_f_uint8_t_256 | false | 700 | 700 | switch_f_uint8_t_256 | -| switch_f_uint8_t_256 | false | 705 | 705 | 256 | -| switch_f_uint8_t_256 | false | 708 | 708 | 256 | -| switch_f_uint8_t_256 | false | 709 | 709 | (uint8_t)... | -| switch_f_uint8_t_256 | false | 711 | 711 | (int)... | -| switch_f_uint8_t_256 | false | 715 | 715 | case ...: | -| switch_f_uint8_t_256 | false | 719 | 719 | break; | -| switch_f_uint8_t_256 | false | 721 | 721 | { ... } | -| switch_f_uint8_t_256 | false | 723 | 723 | switch (...) ... | -| switch_f_uint8_t_256 | false | 725 | 725 | label ...: | -| switch_f_uint8_t_256 | false | 727 | 727 | return ... | -| switch_f_uint8_t_256 | false | 729 | 729 | { ... } | -| switch_f_uint8_t_256 | true | 705 | 721 | | -| switch_f_uint8_t_256 | true | 715 | 719 | | -| switch_f_uint8_t_256 | true | 719 | 725 | | -| switch_f_uint8_t_256 | true | 721 | 725 | | -| switch_f_uint8_t_256 | true | 723 | 705 | | -| switch_f_uint8_t_256 | true | 725 | 727 | | -| switch_f_uint8_t_256 | true | 727 | 700 | | -| switch_f_uint8_t_256 | true | 729 | 723 | | -| switch_f_uint8_t_minus1 | false | 668 | 668 | switch_f_uint8_t_minus1 | -| switch_f_uint8_t_minus1 | false | 673 | 673 | 255 | -| switch_f_uint8_t_minus1 | false | 676 | 676 | 1 | -| switch_f_uint8_t_minus1 | false | 677 | 677 | - ... | -| switch_f_uint8_t_minus1 | false | 679 | 679 | (uint8_t)... | -| switch_f_uint8_t_minus1 | false | 681 | 681 | (int)... | -| switch_f_uint8_t_minus1 | false | 685 | 685 | case ...: | -| switch_f_uint8_t_minus1 | false | 687 | 687 | break; | -| switch_f_uint8_t_minus1 | false | 689 | 689 | { ... } | -| switch_f_uint8_t_minus1 | false | 691 | 691 | switch (...) ... | -| switch_f_uint8_t_minus1 | false | 693 | 693 | label ...: | -| switch_f_uint8_t_minus1 | false | 695 | 695 | return ... | -| switch_f_uint8_t_minus1 | false | 697 | 697 | { ... } | -| switch_f_uint8_t_minus1 | true | 673 | 689 | | -| switch_f_uint8_t_minus1 | true | 685 | 687 | | -| switch_f_uint8_t_minus1 | true | 687 | 693 | | -| switch_f_uint8_t_minus1 | true | 689 | 685 | | -| switch_f_uint8_t_minus1 | true | 689 | 693 | | -| switch_f_uint8_t_minus1 | true | 691 | 673 | | -| switch_f_uint8_t_minus1 | true | 693 | 695 | | -| switch_f_uint8_t_minus1 | true | 695 | 668 | | -| switch_f_uint8_t_minus1 | true | 697 | 691 | | -| switch_f_v_0 | false | 732 | 732 | switch_f_v_0 | -| switch_f_v_0 | false | 738 | 738 | 255 | -| switch_f_v_0 | false | 739 | 739 | initializer for i | -| switch_f_v_0 | false | 742 | 742 | declaration | -| switch_f_v_0 | false | 744 | 744 | i | -| switch_f_v_0 | false | 748 | 748 | 0 | -| switch_f_v_0 | false | 749 | 749 | case ...: | -| switch_f_v_0 | false | 753 | 753 | break; | -| switch_f_v_0 | false | 755 | 755 | { ... } | -| switch_f_v_0 | false | 757 | 757 | switch (...) ... | -| switch_f_v_0 | false | 759 | 759 | label ...: | -| switch_f_v_0 | false | 761 | 761 | return ... | -| switch_f_v_0 | false | 763 | 763 | { ... } | -| switch_f_v_0 | true | 738 | 757 | | -| switch_f_v_0 | true | 739 | 738 | | -| switch_f_v_0 | true | 742 | 739 | | -| switch_f_v_0 | true | 744 | 755 | | -| switch_f_v_0 | true | 749 | 753 | | -| switch_f_v_0 | true | 753 | 759 | | -| switch_f_v_0 | true | 755 | 759 | | -| switch_f_v_0 | true | 757 | 744 | | -| switch_f_v_0 | true | 759 | 761 | | -| switch_f_v_0 | true | 761 | 732 | | -| switch_f_v_0 | true | 763 | 742 | | -| switch_f_v_255 | false | 766 | 766 | switch_f_v_255 | -| switch_f_v_255 | false | 772 | 772 | 255 | -| switch_f_v_255 | false | 773 | 773 | initializer for i | -| switch_f_v_255 | false | 776 | 776 | declaration | -| switch_f_v_255 | false | 778 | 778 | i | -| switch_f_v_255 | false | 782 | 782 | 255 | -| switch_f_v_255 | false | 783 | 783 | case ...: | -| switch_f_v_255 | false | 785 | 785 | break; | -| switch_f_v_255 | false | 787 | 787 | { ... } | -| switch_f_v_255 | false | 789 | 789 | switch (...) ... | -| switch_f_v_255 | false | 791 | 791 | label ...: | -| switch_f_v_255 | false | 793 | 793 | return ... | -| switch_f_v_255 | false | 795 | 795 | { ... } | -| switch_f_v_255 | true | 772 | 789 | | -| switch_f_v_255 | true | 773 | 772 | | -| switch_f_v_255 | true | 776 | 773 | | -| switch_f_v_255 | true | 778 | 787 | | -| switch_f_v_255 | true | 783 | 785 | | -| switch_f_v_255 | true | 785 | 791 | | -| switch_f_v_255 | true | 787 | 783 | | -| switch_f_v_255 | true | 787 | 791 | | -| switch_f_v_255 | true | 789 | 778 | | -| switch_f_v_255 | true | 791 | 793 | | -| switch_f_v_255 | true | 793 | 766 | | -| switch_f_v_255 | true | 795 | 776 | | -| switch_f_v_uint8_t_256 | false | 838 | 838 | switch_f_v_uint8_t_256 | -| switch_f_v_uint8_t_256 | false | 844 | 844 | 256 | -| switch_f_v_uint8_t_256 | false | 845 | 845 | initializer for i | -| switch_f_v_uint8_t_256 | false | 848 | 848 | declaration | -| switch_f_v_uint8_t_256 | false | 850 | 850 | i | -| switch_f_v_uint8_t_256 | false | 854 | 854 | 256 | -| switch_f_v_uint8_t_256 | false | 855 | 855 | (uint8_t)... | -| switch_f_v_uint8_t_256 | false | 857 | 857 | (int)... | -| switch_f_v_uint8_t_256 | false | 861 | 861 | case ...: | -| switch_f_v_uint8_t_256 | false | 865 | 865 | break; | -| switch_f_v_uint8_t_256 | false | 867 | 867 | { ... } | -| switch_f_v_uint8_t_256 | false | 869 | 869 | switch (...) ... | -| switch_f_v_uint8_t_256 | false | 871 | 871 | label ...: | -| switch_f_v_uint8_t_256 | false | 873 | 873 | return ... | -| switch_f_v_uint8_t_256 | false | 875 | 875 | { ... } | -| switch_f_v_uint8_t_256 | true | 844 | 869 | | -| switch_f_v_uint8_t_256 | true | 845 | 844 | | -| switch_f_v_uint8_t_256 | true | 848 | 845 | | -| switch_f_v_uint8_t_256 | true | 850 | 867 | | -| switch_f_v_uint8_t_256 | true | 861 | 865 | | -| switch_f_v_uint8_t_256 | true | 865 | 871 | | -| switch_f_v_uint8_t_256 | true | 867 | 871 | | -| switch_f_v_uint8_t_256 | true | 869 | 850 | | -| switch_f_v_uint8_t_256 | true | 871 | 873 | | -| switch_f_v_uint8_t_256 | true | 873 | 838 | | -| switch_f_v_uint8_t_256 | true | 875 | 848 | | -| switch_f_v_uint8_t_minus1 | false | 798 | 798 | switch_f_v_uint8_t_minus1 | -| switch_f_v_uint8_t_minus1 | false | 804 | 804 | 255 | -| switch_f_v_uint8_t_minus1 | false | 805 | 805 | initializer for i | -| switch_f_v_uint8_t_minus1 | false | 808 | 808 | declaration | -| switch_f_v_uint8_t_minus1 | false | 810 | 810 | i | -| switch_f_v_uint8_t_minus1 | false | 814 | 814 | 1 | -| switch_f_v_uint8_t_minus1 | false | 815 | 815 | - ... | -| switch_f_v_uint8_t_minus1 | false | 817 | 817 | (uint8_t)... | -| switch_f_v_uint8_t_minus1 | false | 819 | 819 | (int)... | -| switch_f_v_uint8_t_minus1 | false | 823 | 823 | case ...: | -| switch_f_v_uint8_t_minus1 | false | 825 | 825 | break; | -| switch_f_v_uint8_t_minus1 | false | 827 | 827 | { ... } | -| switch_f_v_uint8_t_minus1 | false | 829 | 829 | switch (...) ... | -| switch_f_v_uint8_t_minus1 | false | 831 | 831 | label ...: | -| switch_f_v_uint8_t_minus1 | false | 833 | 833 | return ... | -| switch_f_v_uint8_t_minus1 | false | 835 | 835 | { ... } | -| switch_f_v_uint8_t_minus1 | true | 804 | 829 | | -| switch_f_v_uint8_t_minus1 | true | 805 | 804 | | -| switch_f_v_uint8_t_minus1 | true | 808 | 805 | | -| switch_f_v_uint8_t_minus1 | true | 810 | 827 | | -| switch_f_v_uint8_t_minus1 | true | 823 | 825 | | -| switch_f_v_uint8_t_minus1 | true | 825 | 831 | | -| switch_f_v_uint8_t_minus1 | true | 827 | 823 | | -| switch_f_v_uint8_t_minus1 | true | 827 | 831 | | -| switch_f_v_uint8_t_minus1 | true | 829 | 810 | | -| switch_f_v_uint8_t_minus1 | true | 831 | 833 | | -| switch_f_v_uint8_t_minus1 | true | 833 | 798 | | -| switch_f_v_uint8_t_minus1 | true | 835 | 808 | | +| f_0 | false | 900 | 900 | f_0 | +| f_0 | false | 905 | 905 | if (...) ... | +| f_0 | false | 909 | 909 | 0 | +| f_0 | false | 910 | 910 | return ... | +| f_0 | false | 912 | 912 | { ... } | +| f_0 | false | 914 | 914 | ; | +| f_0 | false | 916 | 916 | { ... } | +| f_0 | false | 918 | 918 | return ... | +| f_0 | false | 920 | 920 | { ... } | +| f_0 | true | 905 | 909 | | +| f_0 | true | 909 | 916 | F | +| f_0 | true | 910 | 900 | | +| f_0 | true | 912 | 910 | | +| f_0 | true | 914 | 918 | | +| f_0 | true | 916 | 914 | | +| f_0 | true | 918 | 900 | | +| f_0 | true | 920 | 905 | | +| f_1 | false | 878 | 878 | f_1 | +| f_1 | false | 883 | 883 | if (...) ... | +| f_1 | false | 887 | 887 | 1 | +| f_1 | false | 888 | 888 | return ... | +| f_1 | false | 890 | 890 | { ... } | +| f_1 | false | 892 | 892 | ; | +| f_1 | false | 894 | 894 | { ... } | +| f_1 | false | 896 | 896 | return ... | +| f_1 | false | 898 | 898 | { ... } | +| f_1 | true | 883 | 887 | | +| f_1 | true | 887 | 890 | T | +| f_1 | true | 888 | 878 | | +| f_1 | true | 890 | 888 | | +| f_1 | true | 892 | 896 | | +| f_1 | true | 894 | 892 | | +| f_1 | true | 896 | 878 | | +| f_1 | true | 898 | 883 | | +| f_256 | false | 856 | 856 | f_256 | +| f_256 | false | 861 | 861 | if (...) ... | +| f_256 | false | 865 | 865 | 256 | +| f_256 | false | 866 | 866 | return ... | +| f_256 | false | 868 | 868 | { ... } | +| f_256 | false | 870 | 870 | ; | +| f_256 | false | 872 | 872 | { ... } | +| f_256 | false | 874 | 874 | return ... | +| f_256 | false | 876 | 876 | { ... } | +| f_256 | true | 861 | 865 | | +| f_256 | true | 865 | 868 | T | +| f_256 | true | 866 | 856 | | +| f_256 | true | 868 | 866 | | +| f_256 | true | 870 | 874 | | +| f_256 | true | 872 | 870 | | +| f_256 | true | 874 | 856 | | +| f_256 | true | 876 | 861 | | +| f_uint8_t_0 | false | 831 | 831 | f_uint8_t_0 | +| f_uint8_t_0 | false | 836 | 836 | if (...) ... | +| f_uint8_t_0 | false | 840 | 840 | 0 | +| f_uint8_t_0 | false | 841 | 841 | (uint8_t)... | +| f_uint8_t_0 | false | 844 | 844 | return ... | +| f_uint8_t_0 | false | 846 | 846 | { ... } | +| f_uint8_t_0 | false | 848 | 848 | ; | +| f_uint8_t_0 | false | 850 | 850 | { ... } | +| f_uint8_t_0 | false | 852 | 852 | return ... | +| f_uint8_t_0 | false | 854 | 854 | { ... } | +| f_uint8_t_0 | true | 836 | 840 | | +| f_uint8_t_0 | true | 840 | 850 | F | +| f_uint8_t_0 | true | 844 | 831 | | +| f_uint8_t_0 | true | 846 | 844 | | +| f_uint8_t_0 | true | 848 | 852 | | +| f_uint8_t_0 | true | 850 | 848 | | +| f_uint8_t_0 | true | 852 | 831 | | +| f_uint8_t_0 | true | 854 | 836 | | +| f_uint8_t_1 | false | 806 | 806 | f_uint8_t_1 | +| f_uint8_t_1 | false | 811 | 811 | if (...) ... | +| f_uint8_t_1 | false | 815 | 815 | 1 | +| f_uint8_t_1 | false | 816 | 816 | (uint8_t)... | +| f_uint8_t_1 | false | 819 | 819 | return ... | +| f_uint8_t_1 | false | 821 | 821 | { ... } | +| f_uint8_t_1 | false | 823 | 823 | ; | +| f_uint8_t_1 | false | 825 | 825 | { ... } | +| f_uint8_t_1 | false | 827 | 827 | return ... | +| f_uint8_t_1 | false | 829 | 829 | { ... } | +| f_uint8_t_1 | true | 811 | 815 | | +| f_uint8_t_1 | true | 815 | 821 | T | +| f_uint8_t_1 | true | 819 | 806 | | +| f_uint8_t_1 | true | 821 | 819 | | +| f_uint8_t_1 | true | 823 | 827 | | +| f_uint8_t_1 | true | 825 | 823 | | +| f_uint8_t_1 | true | 827 | 806 | | +| f_uint8_t_1 | true | 829 | 811 | | +| f_uint8_t_256 | false | 781 | 781 | f_uint8_t_256 | +| f_uint8_t_256 | false | 786 | 786 | if (...) ... | +| f_uint8_t_256 | false | 790 | 790 | 256 | +| f_uint8_t_256 | false | 791 | 791 | (uint8_t)... | +| f_uint8_t_256 | false | 794 | 794 | return ... | +| f_uint8_t_256 | false | 796 | 796 | { ... } | +| f_uint8_t_256 | false | 798 | 798 | ; | +| f_uint8_t_256 | false | 800 | 800 | { ... } | +| f_uint8_t_256 | false | 802 | 802 | return ... | +| f_uint8_t_256 | false | 804 | 804 | { ... } | +| f_uint8_t_256 | true | 786 | 790 | | +| f_uint8_t_256 | true | 790 | 800 | F | +| f_uint8_t_256 | true | 794 | 781 | | +| f_uint8_t_256 | true | 796 | 794 | | +| f_uint8_t_256 | true | 798 | 802 | | +| f_uint8_t_256 | true | 800 | 798 | | +| f_uint8_t_256 | true | 802 | 781 | | +| f_uint8_t_256 | true | 804 | 786 | | +| f_uint8_t_257 | false | 756 | 756 | f_uint8_t_257 | +| f_uint8_t_257 | false | 761 | 761 | if (...) ... | +| f_uint8_t_257 | false | 765 | 765 | 257 | +| f_uint8_t_257 | false | 766 | 766 | (uint8_t)... | +| f_uint8_t_257 | false | 769 | 769 | return ... | +| f_uint8_t_257 | false | 771 | 771 | { ... } | +| f_uint8_t_257 | false | 773 | 773 | ; | +| f_uint8_t_257 | false | 775 | 775 | { ... } | +| f_uint8_t_257 | false | 777 | 777 | return ... | +| f_uint8_t_257 | false | 779 | 779 | { ... } | +| f_uint8_t_257 | true | 761 | 765 | | +| f_uint8_t_257 | true | 765 | 771 | T | +| f_uint8_t_257 | true | 769 | 756 | | +| f_uint8_t_257 | true | 771 | 769 | | +| f_uint8_t_257 | true | 773 | 777 | | +| f_uint8_t_257 | true | 775 | 773 | | +| f_uint8_t_257 | true | 777 | 756 | | +| f_uint8_t_257 | true | 779 | 761 | | +| f_uint8_t_minus1 | false | 722 | 722 | f_uint8_t_minus1 | +| f_uint8_t_minus1 | false | 727 | 727 | if (...) ... | +| f_uint8_t_minus1 | false | 731 | 731 | 255 | +| f_uint8_t_minus1 | false | 734 | 734 | 1 | +| f_uint8_t_minus1 | false | 735 | 735 | - ... | +| f_uint8_t_minus1 | false | 737 | 737 | (uint8_t)... | +| f_uint8_t_minus1 | false | 739 | 739 | (int)... | +| f_uint8_t_minus1 | false | 741 | 741 | ... == ... | +| f_uint8_t_minus1 | false | 744 | 744 | return ... | +| f_uint8_t_minus1 | false | 746 | 746 | { ... } | +| f_uint8_t_minus1 | false | 748 | 748 | ; | +| f_uint8_t_minus1 | false | 750 | 750 | { ... } | +| f_uint8_t_minus1 | false | 752 | 752 | return ... | +| f_uint8_t_minus1 | false | 754 | 754 | { ... } | +| f_uint8_t_minus1 | true | 727 | 731 | | +| f_uint8_t_minus1 | true | 731 | 734 | | +| f_uint8_t_minus1 | true | 734 | 735 | | +| f_uint8_t_minus1 | true | 735 | 741 | | +| f_uint8_t_minus1 | true | 741 | 746 | T | +| f_uint8_t_minus1 | true | 744 | 722 | | +| f_uint8_t_minus1 | true | 746 | 744 | | +| f_uint8_t_minus1 | true | 748 | 752 | | +| f_uint8_t_minus1 | true | 750 | 748 | | +| f_uint8_t_minus1 | true | 752 | 722 | | +| f_uint8_t_minus1 | true | 754 | 727 | | +| f_v_int_0 | false | 692 | 692 | f_v_int_0 | +| f_v_int_0 | false | 697 | 697 | declaration | +| f_v_int_0 | false | 702 | 702 | 0 | +| f_v_int_0 | false | 703 | 703 | initializer for i | +| f_v_int_0 | false | 706 | 706 | if (...) ... | +| f_v_int_0 | false | 708 | 708 | i | +| f_v_int_0 | false | 710 | 710 | return ... | +| f_v_int_0 | false | 712 | 712 | { ... } | +| f_v_int_0 | false | 714 | 714 | ; | +| f_v_int_0 | false | 716 | 716 | { ... } | +| f_v_int_0 | false | 718 | 718 | return ... | +| f_v_int_0 | false | 720 | 720 | { ... } | +| f_v_int_0 | true | 697 | 703 | | +| f_v_int_0 | true | 702 | 706 | | +| f_v_int_0 | true | 703 | 702 | | +| f_v_int_0 | true | 706 | 708 | | +| f_v_int_0 | true | 708 | 716 | F | +| f_v_int_0 | true | 710 | 692 | | +| f_v_int_0 | true | 712 | 710 | | +| f_v_int_0 | true | 714 | 718 | | +| f_v_int_0 | true | 716 | 714 | | +| f_v_int_0 | true | 718 | 692 | | +| f_v_int_0 | true | 720 | 697 | | +| f_v_int_1 | false | 662 | 662 | f_v_int_1 | +| f_v_int_1 | false | 667 | 667 | declaration | +| f_v_int_1 | false | 672 | 672 | 1 | +| f_v_int_1 | false | 673 | 673 | initializer for i | +| f_v_int_1 | false | 676 | 676 | if (...) ... | +| f_v_int_1 | false | 678 | 678 | i | +| f_v_int_1 | false | 680 | 680 | return ... | +| f_v_int_1 | false | 682 | 682 | { ... } | +| f_v_int_1 | false | 684 | 684 | ; | +| f_v_int_1 | false | 686 | 686 | { ... } | +| f_v_int_1 | false | 688 | 688 | return ... | +| f_v_int_1 | false | 690 | 690 | { ... } | +| f_v_int_1 | true | 667 | 673 | | +| f_v_int_1 | true | 672 | 676 | | +| f_v_int_1 | true | 673 | 672 | | +| f_v_int_1 | true | 676 | 678 | | +| f_v_int_1 | true | 678 | 682 | T | +| f_v_int_1 | true | 680 | 662 | | +| f_v_int_1 | true | 682 | 680 | | +| f_v_int_1 | true | 684 | 688 | | +| f_v_int_1 | true | 686 | 684 | | +| f_v_int_1 | true | 688 | 662 | | +| f_v_int_1 | true | 690 | 667 | | +| f_v_int_256 | false | 632 | 632 | f_v_int_256 | +| f_v_int_256 | false | 637 | 637 | declaration | +| f_v_int_256 | false | 642 | 642 | 256 | +| f_v_int_256 | false | 643 | 643 | initializer for i | +| f_v_int_256 | false | 646 | 646 | if (...) ... | +| f_v_int_256 | false | 648 | 648 | i | +| f_v_int_256 | false | 650 | 650 | return ... | +| f_v_int_256 | false | 652 | 652 | { ... } | +| f_v_int_256 | false | 654 | 654 | ; | +| f_v_int_256 | false | 656 | 656 | { ... } | +| f_v_int_256 | false | 658 | 658 | return ... | +| f_v_int_256 | false | 660 | 660 | { ... } | +| f_v_int_256 | true | 637 | 643 | | +| f_v_int_256 | true | 642 | 646 | | +| f_v_int_256 | true | 643 | 642 | | +| f_v_int_256 | true | 646 | 648 | | +| f_v_int_256 | true | 648 | 652 | T | +| f_v_int_256 | true | 650 | 632 | | +| f_v_int_256 | true | 652 | 650 | | +| f_v_int_256 | true | 654 | 658 | | +| f_v_int_256 | true | 656 | 654 | | +| f_v_int_256 | true | 658 | 632 | | +| f_v_int_256 | true | 660 | 637 | | +| f_v_uint8_t_0 | false | 599 | 599 | f_v_uint8_t_0 | +| f_v_uint8_t_0 | false | 604 | 604 | declaration | +| f_v_uint8_t_0 | false | 609 | 609 | 0 | +| f_v_uint8_t_0 | false | 610 | 610 | (uint8_t)... | +| f_v_uint8_t_0 | false | 612 | 612 | initializer for i | +| f_v_uint8_t_0 | false | 616 | 616 | if (...) ... | +| f_v_uint8_t_0 | false | 618 | 618 | i | +| f_v_uint8_t_0 | false | 620 | 620 | return ... | +| f_v_uint8_t_0 | false | 622 | 622 | { ... } | +| f_v_uint8_t_0 | false | 624 | 624 | ; | +| f_v_uint8_t_0 | false | 626 | 626 | { ... } | +| f_v_uint8_t_0 | false | 628 | 628 | return ... | +| f_v_uint8_t_0 | false | 630 | 630 | { ... } | +| f_v_uint8_t_0 | true | 604 | 612 | | +| f_v_uint8_t_0 | true | 609 | 616 | | +| f_v_uint8_t_0 | true | 612 | 609 | | +| f_v_uint8_t_0 | true | 616 | 618 | | +| f_v_uint8_t_0 | true | 618 | 626 | F | +| f_v_uint8_t_0 | true | 620 | 599 | | +| f_v_uint8_t_0 | true | 622 | 620 | | +| f_v_uint8_t_0 | true | 624 | 628 | | +| f_v_uint8_t_0 | true | 626 | 624 | | +| f_v_uint8_t_0 | true | 628 | 599 | | +| f_v_uint8_t_0 | true | 630 | 604 | | +| f_v_uint8_t_1 | false | 566 | 566 | f_v_uint8_t_1 | +| f_v_uint8_t_1 | false | 571 | 571 | declaration | +| f_v_uint8_t_1 | false | 576 | 576 | 1 | +| f_v_uint8_t_1 | false | 577 | 577 | (uint8_t)... | +| f_v_uint8_t_1 | false | 579 | 579 | initializer for i | +| f_v_uint8_t_1 | false | 583 | 583 | if (...) ... | +| f_v_uint8_t_1 | false | 585 | 585 | i | +| f_v_uint8_t_1 | false | 587 | 587 | return ... | +| f_v_uint8_t_1 | false | 589 | 589 | { ... } | +| f_v_uint8_t_1 | false | 591 | 591 | ; | +| f_v_uint8_t_1 | false | 593 | 593 | { ... } | +| f_v_uint8_t_1 | false | 595 | 595 | return ... | +| f_v_uint8_t_1 | false | 597 | 597 | { ... } | +| f_v_uint8_t_1 | true | 571 | 579 | | +| f_v_uint8_t_1 | true | 576 | 583 | | +| f_v_uint8_t_1 | true | 579 | 576 | | +| f_v_uint8_t_1 | true | 583 | 585 | | +| f_v_uint8_t_1 | true | 585 | 589 | T | +| f_v_uint8_t_1 | true | 587 | 566 | | +| f_v_uint8_t_1 | true | 589 | 587 | | +| f_v_uint8_t_1 | true | 591 | 595 | | +| f_v_uint8_t_1 | true | 593 | 591 | | +| f_v_uint8_t_1 | true | 595 | 566 | | +| f_v_uint8_t_1 | true | 597 | 571 | | +| f_v_uint8_t_256 | false | 533 | 533 | f_v_uint8_t_256 | +| f_v_uint8_t_256 | false | 538 | 538 | declaration | +| f_v_uint8_t_256 | false | 543 | 543 | 256 | +| f_v_uint8_t_256 | false | 544 | 544 | (uint8_t)... | +| f_v_uint8_t_256 | false | 546 | 546 | initializer for i | +| f_v_uint8_t_256 | false | 550 | 550 | if (...) ... | +| f_v_uint8_t_256 | false | 552 | 552 | i | +| f_v_uint8_t_256 | false | 554 | 554 | return ... | +| f_v_uint8_t_256 | false | 556 | 556 | { ... } | +| f_v_uint8_t_256 | false | 558 | 558 | ; | +| f_v_uint8_t_256 | false | 560 | 560 | { ... } | +| f_v_uint8_t_256 | false | 562 | 562 | return ... | +| f_v_uint8_t_256 | false | 564 | 564 | { ... } | +| f_v_uint8_t_256 | true | 538 | 546 | | +| f_v_uint8_t_256 | true | 543 | 550 | | +| f_v_uint8_t_256 | true | 546 | 543 | | +| f_v_uint8_t_256 | true | 550 | 552 | | +| f_v_uint8_t_256 | true | 552 | 560 | F | +| f_v_uint8_t_256 | true | 554 | 533 | | +| f_v_uint8_t_256 | true | 556 | 554 | | +| f_v_uint8_t_256 | true | 558 | 562 | | +| f_v_uint8_t_256 | true | 560 | 558 | | +| f_v_uint8_t_256 | true | 562 | 533 | | +| f_v_uint8_t_256 | true | 564 | 538 | | +| f_v_uint8_t_257 | false | 500 | 500 | f_v_uint8_t_257 | +| f_v_uint8_t_257 | false | 505 | 505 | declaration | +| f_v_uint8_t_257 | false | 510 | 510 | 257 | +| f_v_uint8_t_257 | false | 511 | 511 | (uint8_t)... | +| f_v_uint8_t_257 | false | 513 | 513 | initializer for i | +| f_v_uint8_t_257 | false | 517 | 517 | if (...) ... | +| f_v_uint8_t_257 | false | 519 | 519 | i | +| f_v_uint8_t_257 | false | 521 | 521 | return ... | +| f_v_uint8_t_257 | false | 523 | 523 | { ... } | +| f_v_uint8_t_257 | false | 525 | 525 | ; | +| f_v_uint8_t_257 | false | 527 | 527 | { ... } | +| f_v_uint8_t_257 | false | 529 | 529 | return ... | +| f_v_uint8_t_257 | false | 531 | 531 | { ... } | +| f_v_uint8_t_257 | true | 505 | 513 | | +| f_v_uint8_t_257 | true | 510 | 517 | | +| f_v_uint8_t_257 | true | 513 | 510 | | +| f_v_uint8_t_257 | true | 517 | 519 | | +| f_v_uint8_t_257 | true | 519 | 523 | T | +| f_v_uint8_t_257 | true | 521 | 500 | | +| f_v_uint8_t_257 | true | 523 | 521 | | +| f_v_uint8_t_257 | true | 525 | 529 | | +| f_v_uint8_t_257 | true | 527 | 525 | | +| f_v_uint8_t_257 | true | 529 | 500 | | +| f_v_uint8_t_257 | true | 531 | 505 | | +| f_v_uint8_t_minus1 | false | 459 | 459 | f_v_uint8_t_minus1 | +| f_v_uint8_t_minus1 | false | 464 | 464 | declaration | +| f_v_uint8_t_minus1 | false | 469 | 469 | 1 | +| f_v_uint8_t_minus1 | false | 470 | 470 | - ... | +| f_v_uint8_t_minus1 | false | 472 | 472 | (uint8_t)... | +| f_v_uint8_t_minus1 | false | 474 | 474 | initializer for i | +| f_v_uint8_t_minus1 | false | 478 | 478 | if (...) ... | +| f_v_uint8_t_minus1 | false | 482 | 482 | 255 | +| f_v_uint8_t_minus1 | false | 483 | 483 | i | +| f_v_uint8_t_minus1 | false | 485 | 485 | (int)... | +| f_v_uint8_t_minus1 | false | 486 | 486 | ... == ... | +| f_v_uint8_t_minus1 | false | 488 | 488 | return ... | +| f_v_uint8_t_minus1 | false | 490 | 490 | { ... } | +| f_v_uint8_t_minus1 | false | 492 | 492 | ; | +| f_v_uint8_t_minus1 | false | 494 | 494 | { ... } | +| f_v_uint8_t_minus1 | false | 496 | 496 | return ... | +| f_v_uint8_t_minus1 | false | 498 | 498 | { ... } | +| f_v_uint8_t_minus1 | true | 464 | 474 | | +| f_v_uint8_t_minus1 | true | 469 | 470 | | +| f_v_uint8_t_minus1 | true | 470 | 478 | | +| f_v_uint8_t_minus1 | true | 474 | 469 | | +| f_v_uint8_t_minus1 | true | 478 | 482 | | +| f_v_uint8_t_minus1 | true | 482 | 483 | | +| f_v_uint8_t_minus1 | true | 483 | 486 | | +| f_v_uint8_t_minus1 | true | 486 | 490 | T | +| f_v_uint8_t_minus1 | true | 488 | 459 | | +| f_v_uint8_t_minus1 | true | 490 | 488 | | +| f_v_uint8_t_minus1 | true | 492 | 496 | | +| f_v_uint8_t_minus1 | true | 494 | 492 | | +| f_v_uint8_t_minus1 | true | 496 | 459 | | +| f_v_uint8_t_minus1 | true | 498 | 464 | | +| switch_asm | false | 150 | 150 | switch_asm | +| switch_asm | false | 155 | 155 | declaration | +| switch_asm | false | 160 | 160 | 0 | +| switch_asm | false | 161 | 161 | initializer for faulted | +| switch_asm | false | 164 | 164 | asm statement | +| switch_asm | false | 166 | 166 | faulted | +| switch_asm | false | 168 | 168 | faulted | +| switch_asm | false | 170 | 170 | switch (...) ... | +| switch_asm | false | 172 | 172 | faulted | +| switch_asm | false | 174 | 174 | case ...: | +| switch_asm | false | 178 | 178 | 1 | +| switch_asm | false | 179 | 179 | break; | +| switch_asm | false | 181 | 181 | { ... } | +| switch_asm | false | 183 | 183 | label ...: | +| switch_asm | false | 185 | 185 | { ... } | +| switch_asm | false | 187 | 187 | return ... | +| switch_asm | false | 189 | 189 | { ... } | +| switch_asm | true | 155 | 161 | | +| switch_asm | true | 160 | 164 | | +| switch_asm | true | 161 | 160 | | +| switch_asm | true | 164 | 166 | | +| switch_asm | true | 166 | 168 | | +| switch_asm | true | 168 | 185 | | +| switch_asm | true | 170 | 172 | | +| switch_asm | true | 172 | 181 | | +| switch_asm | true | 174 | 179 | | +| switch_asm | true | 179 | 183 | | +| switch_asm | true | 181 | 174 | | +| switch_asm | true | 181 | 183 | | +| switch_asm | true | 183 | 187 | | +| switch_asm | true | 185 | 170 | | +| switch_asm | true | 187 | 150 | | +| switch_asm | true | 189 | 155 | | +| switch_f_0 | false | 432 | 432 | switch_f_0 | +| switch_f_0 | false | 437 | 437 | switch (...) ... | +| switch_f_0 | false | 441 | 441 | 255 | +| switch_f_0 | false | 442 | 442 | case ...: | +| switch_f_0 | false | 446 | 446 | 0 | +| switch_f_0 | false | 447 | 447 | break; | +| switch_f_0 | false | 449 | 449 | { ... } | +| switch_f_0 | false | 451 | 451 | label ...: | +| switch_f_0 | false | 453 | 453 | { ... } | +| switch_f_0 | false | 455 | 455 | return ... | +| switch_f_0 | false | 457 | 457 | { ... } | +| switch_f_0 | true | 437 | 441 | | +| switch_f_0 | true | 441 | 449 | | +| switch_f_0 | true | 442 | 447 | | +| switch_f_0 | true | 447 | 451 | | +| switch_f_0 | true | 449 | 451 | | +| switch_f_0 | true | 451 | 455 | | +| switch_f_0 | true | 453 | 437 | | +| switch_f_0 | true | 455 | 432 | | +| switch_f_0 | true | 457 | 453 | | +| switch_f_255 | false | 405 | 405 | switch_f_255 | +| switch_f_255 | false | 410 | 410 | switch (...) ... | +| switch_f_255 | false | 414 | 414 | 255 | +| switch_f_255 | false | 415 | 415 | case ...: | +| switch_f_255 | false | 419 | 419 | 255 | +| switch_f_255 | false | 420 | 420 | break; | +| switch_f_255 | false | 422 | 422 | { ... } | +| switch_f_255 | false | 424 | 424 | label ...: | +| switch_f_255 | false | 426 | 426 | { ... } | +| switch_f_255 | false | 428 | 428 | return ... | +| switch_f_255 | false | 430 | 430 | { ... } | +| switch_f_255 | true | 410 | 414 | | +| switch_f_255 | true | 414 | 422 | | +| switch_f_255 | true | 415 | 420 | | +| switch_f_255 | true | 420 | 424 | | +| switch_f_255 | true | 422 | 415 | | +| switch_f_255 | true | 422 | 424 | | +| switch_f_255 | true | 424 | 428 | | +| switch_f_255 | true | 426 | 410 | | +| switch_f_255 | true | 428 | 405 | | +| switch_f_255 | true | 430 | 426 | | +| switch_f_uint8_t_256 | false | 341 | 341 | switch_f_uint8_t_256 | +| switch_f_uint8_t_256 | false | 346 | 346 | switch (...) ... | +| switch_f_uint8_t_256 | false | 350 | 350 | 256 | +| switch_f_uint8_t_256 | false | 351 | 351 | case ...: | +| switch_f_uint8_t_256 | false | 355 | 355 | 256 | +| switch_f_uint8_t_256 | false | 356 | 356 | (uint8_t)... | +| switch_f_uint8_t_256 | false | 358 | 358 | (int)... | +| switch_f_uint8_t_256 | false | 360 | 360 | break; | +| switch_f_uint8_t_256 | false | 362 | 362 | { ... } | +| switch_f_uint8_t_256 | false | 364 | 364 | label ...: | +| switch_f_uint8_t_256 | false | 366 | 366 | { ... } | +| switch_f_uint8_t_256 | false | 368 | 368 | return ... | +| switch_f_uint8_t_256 | false | 370 | 370 | { ... } | +| switch_f_uint8_t_256 | true | 346 | 350 | | +| switch_f_uint8_t_256 | true | 350 | 362 | | +| switch_f_uint8_t_256 | true | 351 | 360 | | +| switch_f_uint8_t_256 | true | 360 | 364 | | +| switch_f_uint8_t_256 | true | 362 | 364 | | +| switch_f_uint8_t_256 | true | 364 | 368 | | +| switch_f_uint8_t_256 | true | 366 | 346 | | +| switch_f_uint8_t_256 | true | 368 | 341 | | +| switch_f_uint8_t_256 | true | 370 | 366 | | +| switch_f_uint8_t_minus1 | false | 372 | 372 | switch_f_uint8_t_minus1 | +| switch_f_uint8_t_minus1 | false | 377 | 377 | switch (...) ... | +| switch_f_uint8_t_minus1 | false | 381 | 381 | 255 | +| switch_f_uint8_t_minus1 | false | 382 | 382 | case ...: | +| switch_f_uint8_t_minus1 | false | 386 | 386 | 1 | +| switch_f_uint8_t_minus1 | false | 387 | 387 | - ... | +| switch_f_uint8_t_minus1 | false | 389 | 389 | (uint8_t)... | +| switch_f_uint8_t_minus1 | false | 391 | 391 | (int)... | +| switch_f_uint8_t_minus1 | false | 393 | 393 | break; | +| switch_f_uint8_t_minus1 | false | 395 | 395 | { ... } | +| switch_f_uint8_t_minus1 | false | 397 | 397 | label ...: | +| switch_f_uint8_t_minus1 | false | 399 | 399 | { ... } | +| switch_f_uint8_t_minus1 | false | 401 | 401 | return ... | +| switch_f_uint8_t_minus1 | false | 403 | 403 | { ... } | +| switch_f_uint8_t_minus1 | true | 377 | 381 | | +| switch_f_uint8_t_minus1 | true | 381 | 395 | | +| switch_f_uint8_t_minus1 | true | 382 | 393 | | +| switch_f_uint8_t_minus1 | true | 393 | 397 | | +| switch_f_uint8_t_minus1 | true | 395 | 382 | | +| switch_f_uint8_t_minus1 | true | 395 | 397 | | +| switch_f_uint8_t_minus1 | true | 397 | 401 | | +| switch_f_uint8_t_minus1 | true | 399 | 377 | | +| switch_f_uint8_t_minus1 | true | 401 | 372 | | +| switch_f_uint8_t_minus1 | true | 403 | 399 | | +| switch_f_v_0 | false | 306 | 306 | switch_f_v_0 | +| switch_f_v_0 | false | 311 | 311 | declaration | +| switch_f_v_0 | false | 316 | 316 | 255 | +| switch_f_v_0 | false | 317 | 317 | initializer for i | +| switch_f_v_0 | false | 320 | 320 | switch (...) ... | +| switch_f_v_0 | false | 322 | 322 | i | +| switch_f_v_0 | false | 324 | 324 | case ...: | +| switch_f_v_0 | false | 328 | 328 | 0 | +| switch_f_v_0 | false | 329 | 329 | break; | +| switch_f_v_0 | false | 331 | 331 | { ... } | +| switch_f_v_0 | false | 333 | 333 | label ...: | +| switch_f_v_0 | false | 335 | 335 | { ... } | +| switch_f_v_0 | false | 337 | 337 | return ... | +| switch_f_v_0 | false | 339 | 339 | { ... } | +| switch_f_v_0 | true | 311 | 317 | | +| switch_f_v_0 | true | 316 | 335 | | +| switch_f_v_0 | true | 317 | 316 | | +| switch_f_v_0 | true | 320 | 322 | | +| switch_f_v_0 | true | 322 | 331 | | +| switch_f_v_0 | true | 324 | 329 | | +| switch_f_v_0 | true | 329 | 333 | | +| switch_f_v_0 | true | 331 | 333 | | +| switch_f_v_0 | true | 333 | 337 | | +| switch_f_v_0 | true | 335 | 320 | | +| switch_f_v_0 | true | 337 | 306 | | +| switch_f_v_0 | true | 339 | 311 | | +| switch_f_v_255 | false | 271 | 271 | switch_f_v_255 | +| switch_f_v_255 | false | 276 | 276 | declaration | +| switch_f_v_255 | false | 281 | 281 | 255 | +| switch_f_v_255 | false | 282 | 282 | initializer for i | +| switch_f_v_255 | false | 285 | 285 | switch (...) ... | +| switch_f_v_255 | false | 287 | 287 | i | +| switch_f_v_255 | false | 289 | 289 | case ...: | +| switch_f_v_255 | false | 293 | 293 | 255 | +| switch_f_v_255 | false | 294 | 294 | break; | +| switch_f_v_255 | false | 296 | 296 | { ... } | +| switch_f_v_255 | false | 298 | 298 | label ...: | +| switch_f_v_255 | false | 300 | 300 | { ... } | +| switch_f_v_255 | false | 302 | 302 | return ... | +| switch_f_v_255 | false | 304 | 304 | { ... } | +| switch_f_v_255 | true | 276 | 282 | | +| switch_f_v_255 | true | 281 | 300 | | +| switch_f_v_255 | true | 282 | 281 | | +| switch_f_v_255 | true | 285 | 287 | | +| switch_f_v_255 | true | 287 | 296 | | +| switch_f_v_255 | true | 289 | 294 | | +| switch_f_v_255 | true | 294 | 298 | | +| switch_f_v_255 | true | 296 | 289 | | +| switch_f_v_255 | true | 296 | 298 | | +| switch_f_v_255 | true | 298 | 302 | | +| switch_f_v_255 | true | 300 | 285 | | +| switch_f_v_255 | true | 302 | 271 | | +| switch_f_v_255 | true | 304 | 276 | | +| switch_f_v_uint8_t_256 | false | 191 | 191 | switch_f_v_uint8_t_256 | +| switch_f_v_uint8_t_256 | false | 196 | 196 | declaration | +| switch_f_v_uint8_t_256 | false | 201 | 201 | 256 | +| switch_f_v_uint8_t_256 | false | 202 | 202 | initializer for i | +| switch_f_v_uint8_t_256 | false | 205 | 205 | switch (...) ... | +| switch_f_v_uint8_t_256 | false | 207 | 207 | i | +| switch_f_v_uint8_t_256 | false | 209 | 209 | case ...: | +| switch_f_v_uint8_t_256 | false | 213 | 213 | 256 | +| switch_f_v_uint8_t_256 | false | 214 | 214 | (uint8_t)... | +| switch_f_v_uint8_t_256 | false | 216 | 216 | (int)... | +| switch_f_v_uint8_t_256 | false | 218 | 218 | break; | +| switch_f_v_uint8_t_256 | false | 220 | 220 | { ... } | +| switch_f_v_uint8_t_256 | false | 222 | 222 | label ...: | +| switch_f_v_uint8_t_256 | false | 224 | 224 | { ... } | +| switch_f_v_uint8_t_256 | false | 226 | 226 | return ... | +| switch_f_v_uint8_t_256 | false | 228 | 228 | { ... } | +| switch_f_v_uint8_t_256 | true | 196 | 202 | | +| switch_f_v_uint8_t_256 | true | 201 | 224 | | +| switch_f_v_uint8_t_256 | true | 202 | 201 | | +| switch_f_v_uint8_t_256 | true | 205 | 207 | | +| switch_f_v_uint8_t_256 | true | 207 | 220 | | +| switch_f_v_uint8_t_256 | true | 209 | 218 | | +| switch_f_v_uint8_t_256 | true | 218 | 222 | | +| switch_f_v_uint8_t_256 | true | 220 | 222 | | +| switch_f_v_uint8_t_256 | true | 222 | 226 | | +| switch_f_v_uint8_t_256 | true | 224 | 205 | | +| switch_f_v_uint8_t_256 | true | 226 | 191 | | +| switch_f_v_uint8_t_256 | true | 228 | 196 | | +| switch_f_v_uint8_t_minus1 | false | 230 | 230 | switch_f_v_uint8_t_minus1 | +| switch_f_v_uint8_t_minus1 | false | 235 | 235 | declaration | +| switch_f_v_uint8_t_minus1 | false | 240 | 240 | 255 | +| switch_f_v_uint8_t_minus1 | false | 241 | 241 | initializer for i | +| switch_f_v_uint8_t_minus1 | false | 244 | 244 | switch (...) ... | +| switch_f_v_uint8_t_minus1 | false | 246 | 246 | i | +| switch_f_v_uint8_t_minus1 | false | 248 | 248 | case ...: | +| switch_f_v_uint8_t_minus1 | false | 252 | 252 | 1 | +| switch_f_v_uint8_t_minus1 | false | 253 | 253 | - ... | +| switch_f_v_uint8_t_minus1 | false | 255 | 255 | (uint8_t)... | +| switch_f_v_uint8_t_minus1 | false | 257 | 257 | (int)... | +| switch_f_v_uint8_t_minus1 | false | 259 | 259 | break; | +| switch_f_v_uint8_t_minus1 | false | 261 | 261 | { ... } | +| switch_f_v_uint8_t_minus1 | false | 263 | 263 | label ...: | +| switch_f_v_uint8_t_minus1 | false | 265 | 265 | { ... } | +| switch_f_v_uint8_t_minus1 | false | 267 | 267 | return ... | +| switch_f_v_uint8_t_minus1 | false | 269 | 269 | { ... } | +| switch_f_v_uint8_t_minus1 | true | 235 | 241 | | +| switch_f_v_uint8_t_minus1 | true | 240 | 265 | | +| switch_f_v_uint8_t_minus1 | true | 241 | 240 | | +| switch_f_v_uint8_t_minus1 | true | 244 | 246 | | +| switch_f_v_uint8_t_minus1 | true | 246 | 261 | | +| switch_f_v_uint8_t_minus1 | true | 248 | 259 | | +| switch_f_v_uint8_t_minus1 | true | 259 | 263 | | +| switch_f_v_uint8_t_minus1 | true | 261 | 248 | | +| switch_f_v_uint8_t_minus1 | true | 261 | 263 | | +| switch_f_v_uint8_t_minus1 | true | 263 | 267 | | +| switch_f_v_uint8_t_minus1 | true | 265 | 244 | | +| switch_f_v_uint8_t_minus1 | true | 267 | 230 | | +| switch_f_v_uint8_t_minus1 | true | 269 | 235 | | diff --git a/cpp/ql/test/successor-tests/switchstmt/switchstmt/cfg.expected b/cpp/ql/test/successor-tests/switchstmt/switchstmt/cfg.expected index ca3de0ffaff..607995cefd3 100644 --- a/cpp/ql/test/successor-tests/switchstmt/switchstmt/cfg.expected +++ b/cpp/ql/test/successor-tests/switchstmt/switchstmt/cfg.expected @@ -12,3 +12,20 @@ | switchstmt | switchstmt.c:1:6:1:6 | f | 7 | 8 | switchstmt.c:7:5:7:5 | switchstmt.c:7:5:7:5 | switchstmt.c:7:5:7:5 | ; | 8: return ... | | switchstmt | switchstmt.c:1:6:1:6 | f | 8 | 9 | switchstmt.c:8:1:8:1 | switchstmt.c:8:1:8:1 | switchstmt.c:8:1:8:1 | return ... | 8: f | | switchstmt | switchstmt.c:1:6:1:6 | f | 8 | 10 | switchstmt.c:1:6:1:6 | switchstmt.c:1:6:1:6 | switchstmt.c:1:6:1:6 | f | | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 3 | 1 | switchstmt.cpp:3:15:12:1 | switchstmt.cpp:3:15:12:1 | switchstmt.cpp:3:15:12:1 | { ... } | 4: switch (...) ... | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 4 | 2 | switchstmt.cpp:4:6:10:5 | switchstmt.cpp:4:6:10:5 | switchstmt.cpp:4:6:10:5 | switch (...) ... | 5: declaration | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 5 | 3 | switchstmt.cpp:5:10:5:10 | switchstmt.cpp:5:10:5:10 | switchstmt.cpp:5:10:5:10 | declaration | 5: initializer for y | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 5 | 4 | switchstmt.cpp:5:17:5:18 | switchstmt.cpp:5:17:5:18 | switchstmt.cpp:5:17:5:18 | initializer for y | 5: x | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 5 | 5 | switchstmt.cpp:5:18:5:18 | switchstmt.cpp:5:18:5:18 | switchstmt.cpp:5:18:5:18 | x | 6: y | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 6 | 6 | switchstmt.cpp:6:10:6:10 | switchstmt.cpp:6:10:6:10 | switchstmt.cpp:6:10:6:10 | y | 6: { ... } | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 6 | 7 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | { ... } | 7: case ...: | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 6 | 7 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | { ... } | 8: case ...: | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 6 | 7 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | switchstmt.cpp:6:13:10:5 | { ... } | 9: default: | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 7 | 1 | switchstmt.cpp:7:14:7:14 | switchstmt.cpp:7:14:7:14 | switchstmt.cpp:7:14:7:14 | 1 | | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 7 | 8 | switchstmt.cpp:7:9:7:15 | switchstmt.cpp:7:9:7:15 | switchstmt.cpp:7:9:7:15 | case ...: | 8: case ...: | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 8 | 1 | switchstmt.cpp:8:14:8:14 | switchstmt.cpp:8:14:8:14 | switchstmt.cpp:8:14:8:14 | 2 | | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 8 | 9 | switchstmt.cpp:8:9:8:15 | switchstmt.cpp:8:9:8:15 | switchstmt.cpp:8:9:8:15 | case ...: | 9: default: | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 9 | 10 | switchstmt.cpp:9:9:9:16 | switchstmt.cpp:9:9:9:16 | switchstmt.cpp:9:9:9:16 | default: | 11: ; | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 11 | 11 | switchstmt.cpp:11:5:11:5 | switchstmt.cpp:11:5:11:5 | switchstmt.cpp:11:5:11:5 | ; | 12: return ... | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 12 | 12 | switchstmt.cpp:12:1:12:1 | switchstmt.cpp:12:1:12:1 | switchstmt.cpp:12:1:12:1 | return ... | 12: g | +| switchstmt | switchstmt.cpp:3:6:3:6 | g | 12 | 13 | switchstmt.cpp:3:6:3:6 | switchstmt.cpp:3:6:3:6 | switchstmt.cpp:3:6:3:6 | g | | diff --git a/cpp/ql/test/successor-tests/switchstmt/switchstmt/switchstmt.cpp b/cpp/ql/test/successor-tests/switchstmt/switchstmt/switchstmt.cpp new file mode 100644 index 00000000000..a88ad7e710c --- /dev/null +++ b/cpp/ql/test/successor-tests/switchstmt/switchstmt/switchstmt.cpp @@ -0,0 +1,12 @@ +// semmle-extractor-options: -std=c++17 + +void g(int x) { + switch ( + int y = x; + y) { + case 1: + case 2: + default: + } + ; +} diff --git a/cpp/ql/test/successor-tests/whilestmt/whilestmt07.expected b/cpp/ql/test/successor-tests/whilestmt/whilestmt07.expected index 062c5a02e8b..1bdfcc5428f 100644 --- a/cpp/ql/test/successor-tests/whilestmt/whilestmt07.expected +++ b/cpp/ql/test/successor-tests/whilestmt/whilestmt07.expected @@ -1,4 +1,5 @@ -| 0 | whilestmt.c:15:22:21:1 | { ... } | 1 | whilestmt.c:16:3:19:3 | while (...) ... | +| 0 | whilestmt.c:15:22:21:1 | { ... } | 1 | whilestmt.c:16:3:16:3 | { ... } | +| 1 | whilestmt.c:16:3:16:3 | { ... } | 1 | whilestmt.c:16:3:19:3 | while (...) ... | | 1 | whilestmt.c:16:3:19:3 | while (...) ... | 1 | whilestmt.c:16:9:16:9 | 1 | | 1 | whilestmt.c:16:9:16:9 | 1 | 1 | whilestmt.c:16:12:19:3 | { ... } | | 1 | whilestmt.c:16:12:19:3 | { ... } | 2 | whilestmt.c:17:5:17:7 | label ...: | diff --git a/cpp/ql/test/successor-tests/whilestmt/whilestmt08.expected b/cpp/ql/test/successor-tests/whilestmt/whilestmt08.expected index b80cf3db691..ca64f447bc8 100644 --- a/cpp/ql/test/successor-tests/whilestmt/whilestmt08.expected +++ b/cpp/ql/test/successor-tests/whilestmt/whilestmt08.expected @@ -1,4 +1,5 @@ -| 0 | whilestmt.c:23:22:30:1 | { ... } | 1 | whilestmt.c:24:3:28:3 | while (...) ... | +| 0 | whilestmt.c:23:22:30:1 | { ... } | 1 | whilestmt.c:24:3:24:3 | { ... } | +| 1 | whilestmt.c:24:3:24:3 | { ... } | 1 | whilestmt.c:24:3:28:3 | while (...) ... | | 1 | whilestmt.c:24:3:28:3 | while (...) ... | 1 | whilestmt.c:24:9:24:9 | 1 | | 1 | whilestmt.c:24:9:24:9 | 1 | 1 | whilestmt.c:24:12:28:3 | { ... } | | 1 | whilestmt.c:24:12:28:3 | { ... } | 2 | whilestmt.c:25:5:25:7 | label ...: | diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 197edc2c162..304c8a68b6f 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -51,7 +51,7 @@ namespace Semmle.Autobuild.CSharp.Tests int IBuildActions.RunProcess(string cmd, string args, string? workingDirectory, IDictionary? env, out IList stdOut) { - var pattern = cmd + " " + args; + var pattern = string.IsNullOrEmpty(args) ? cmd : cmd + " " + args; RunProcessIn.Add(pattern); if (!RunProcessOut.TryGetValue(pattern, out var str)) @@ -62,7 +62,7 @@ namespace Semmle.Autobuild.CSharp.Tests RunProcessWorkingDirectory.TryGetValue(pattern, out var wd); if (wd != workingDirectory) - throw new ArgumentException("Missing RunProcessWorkingDirectory " + pattern); + throw new ArgumentException($"Unexpected RunProcessWorkingDirectory, got {wd ?? "null"} expected {workingDirectory ?? "null"} in {pattern}"); if (!RunProcess.TryGetValue(pattern, out var ret)) throw new ArgumentException("Missing RunProcess " + pattern); @@ -72,12 +72,12 @@ namespace Semmle.Autobuild.CSharp.Tests int IBuildActions.RunProcess(string cmd, string args, string? workingDirectory, IDictionary? env) { - var pattern = cmd + " " + args; + var pattern = string.IsNullOrEmpty(args) ? cmd : cmd + " " + args; RunProcessIn.Add(pattern); RunProcessWorkingDirectory.TryGetValue(pattern, out var wd); if (wd != workingDirectory) - throw new ArgumentException("Missing RunProcessWorkingDirectory " + pattern); + throw new ArgumentException($"Unexpected RunProcessWorkingDirectory, got {wd ?? "null"} expected {workingDirectory ?? "null"} in {pattern}"); if (!RunProcess.TryGetValue(pattern, out var ret)) throw new ArgumentException("Missing RunProcess " + pattern); @@ -255,7 +255,7 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestAnd1() { - var cmd = BuildScript.Create("abc", "def ghi", false, null, null) & BuildScript.Create("odasa", null, false, null, null); + var cmd = BuildScript.Create("abc", "def ghi", false, null, null) & BuildScript.Create("codeql", null, false, null, null); actions.RunProcess["abc def ghi"] = 1; cmd.Run(actions, StartCallback, EndCallback); @@ -269,14 +269,14 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestAnd2() { - var cmd = BuildScript.Create("odasa", null, false, null, null) & BuildScript.Create("abc", "def ghi", false, null, null); + var cmd = BuildScript.Create("codeql", null, false, null, null) & BuildScript.Create("abc", "def ghi", false, null, null); actions.RunProcess["abc def ghi"] = 1; - actions.RunProcess["odasa "] = 0; + actions.RunProcess["codeql"] = 0; cmd.Run(actions, StartCallback, EndCallback); - Assert.Equal("odasa ", actions.RunProcessIn[0]); - Assert.Equal("odasa ", startCallbackIn[0]); + Assert.Equal("codeql", actions.RunProcessIn[0]); + Assert.Equal("codeql", startCallbackIn[0]); Assert.Equal("", endCallbackIn[0]); Assert.Equal(0, endCallbackReturn[0]); @@ -289,14 +289,14 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestOr1() { - var cmd = BuildScript.Create("odasa", null, false, null, null) | BuildScript.Create("abc", "def ghi", false, null, null); + var cmd = BuildScript.Create("codeql", null, false, null, null) | BuildScript.Create("abc", "def ghi", false, null, null); actions.RunProcess["abc def ghi"] = 1; - actions.RunProcess["odasa "] = 0; + actions.RunProcess["codeql"] = 0; cmd.Run(actions, StartCallback, EndCallback); - Assert.Equal("odasa ", actions.RunProcessIn[0]); - Assert.Equal("odasa ", startCallbackIn[0]); + Assert.Equal("codeql", actions.RunProcessIn[0]); + Assert.Equal("codeql", startCallbackIn[0]); Assert.Equal("", endCallbackIn[0]); Assert.Equal(0, endCallbackReturn[0]); Assert.Equal(1, endCallbackReturn.Count); @@ -305,10 +305,10 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestOr2() { - var cmd = BuildScript.Create("abc", "def ghi", false, null, null) | BuildScript.Create("odasa", null, false, null, null); + var cmd = BuildScript.Create("abc", "def ghi", false, null, null) | BuildScript.Create("codeql", null, false, null, null); actions.RunProcess["abc def ghi"] = 1; - actions.RunProcess["odasa "] = 0; + actions.RunProcess["codeql"] = 0; cmd.Run(actions, StartCallback, EndCallback); Assert.Equal("abc def ghi", actions.RunProcessIn[0]); @@ -316,8 +316,8 @@ namespace Semmle.Autobuild.CSharp.Tests Assert.Equal("", endCallbackIn[0]); Assert.Equal(1, endCallbackReturn[0]); - Assert.Equal("odasa ", actions.RunProcessIn[1]); - Assert.Equal("odasa ", startCallbackIn[1]); + Assert.Equal("codeql", actions.RunProcessIn[1]); + Assert.Equal("codeql", startCallbackIn[1]); Assert.Equal("", endCallbackIn[1]); Assert.Equal(0, endCallbackReturn[1]); } @@ -385,9 +385,6 @@ namespace Semmle.Autobuild.CSharp.Tests actions.GetEnvironmentVariable[$"CODEQL_EXTRACTOR_{codeqlUpperLanguage}_ROOT"] = $@"C:\codeql\{codeqlUpperLanguage.ToLowerInvariant()}"; actions.GetEnvironmentVariable["CODEQL_JAVA_HOME"] = @"C:\codeql\tools\java"; actions.GetEnvironmentVariable["CODEQL_PLATFORM"] = isWindows ? "win64" : "linux64"; - actions.GetEnvironmentVariable["SEMMLE_DIST"] = @"C:\odasa"; - actions.GetEnvironmentVariable["SEMMLE_JAVA_HOME"] = @"C:\odasa\tools\java"; - actions.GetEnvironmentVariable["SEMMLE_PLATFORM_TOOLS"] = @"C:\odasa\tools"; actions.GetEnvironmentVariable["LGTM_INDEX_VSTOOLS_VERSION"] = vsToolsVersion; actions.GetEnvironmentVariable["LGTM_INDEX_MSBUILD_ARGUMENTS"] = msBuildArguments; actions.GetEnvironmentVariable["LGTM_INDEX_MSBUILD_PLATFORM"] = msBuildPlatform; @@ -399,6 +396,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.GetEnvironmentVariable["LGTM_INDEX_SOLUTION"] = solution; actions.GetEnvironmentVariable["LGTM_INDEX_IGNORE_ERRORS"] = ignoreErrors; actions.GetEnvironmentVariable["LGTM_INDEX_BUILDLESS"] = buildless; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_OPTION_BUILDLESS"] = buildless; actions.GetEnvironmentVariable["LGTM_INDEX_ALL_SOLUTIONS"] = allSolutions; actions.GetEnvironmentVariable["LGTM_INDEX_NUGET_RESTORE"] = nugetRestore; actions.GetEnvironmentVariable["ProgramFiles(x86)"] = isWindows ? @"C:\Program Files (x86)" : null; @@ -415,7 +413,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess["cmd.exe /C dotnet --info"] = 0; actions.RunProcess[@"cmd.exe /C dotnet clean C:\Project\test.csproj"] = 0; actions.RunProcess[@"cmd.exe /C dotnet restore C:\Project\test.csproj"] = 0; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0; + actions.RunProcess[@"cmd.exe /C dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project\test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -442,7 +440,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess["dotnet --info"] = 0; actions.RunProcess[@"dotnet clean C:\Project/test.csproj"] = 0; actions.RunProcess[@"dotnet restore C:\Project/test.csproj"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; + actions.RunProcess[@"dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project/test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -600,7 +598,7 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildCommand() { - actions.RunProcess[@"C:\odasa/tools/odasa index --auto ""./build.sh --skip-tests"""] = 0; + actions.RunProcess["./build.sh --skip-tests"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; @@ -621,8 +619,8 @@ namespace Semmle.Autobuild.CSharp.Tests actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; actions.RunProcess[@"/bin/chmod u+x C:\Project/build/build.sh"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build/build.sh"] = 0; - actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build/build.sh"] = @"C:\Project/build"; + actions.RunProcess[@"C:\Project/build/build.sh"] = 0; + actions.RunProcessWorkingDirectory[@"C:\Project/build/build.sh"] = @"C:\Project/build"; actions.FileExists["csharp.log"] = true; var autobuilder = CreateAutoBuilder(false); @@ -638,8 +636,8 @@ namespace Semmle.Autobuild.CSharp.Tests actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; actions.RunProcess[@"/bin/chmod u+x C:\Project/build.sh"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = 0; - actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = @"C:\Project"; + actions.RunProcess[@"C:\Project/build.sh"] = 0; + actions.RunProcessWorkingDirectory[@"C:\Project/build.sh"] = @"C:\Project"; actions.FileExists["csharp.log"] = false; var autobuilder = CreateAutoBuilder(false); @@ -655,8 +653,8 @@ namespace Semmle.Autobuild.CSharp.Tests actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; actions.RunProcess[@"/bin/chmod u+x C:\Project/build.sh"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = 5; - actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = @"C:\Project"; + actions.RunProcess[@"C:\Project/build.sh"] = 5; + actions.RunProcessWorkingDirectory[@"C:\Project/build.sh"] = @"C:\Project"; actions.FileExists["csharp.log"] = true; var autobuilder = CreateAutoBuilder(false); @@ -670,8 +668,8 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\build.bat"] = 0; - actions.RunProcessWorkingDirectory[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\build.bat"] = @"C:\Project"; + actions.RunProcess[@"cmd.exe /C C:\Project\build.bat"] = 0; + actions.RunProcessWorkingDirectory[@"cmd.exe /C C:\Project\build.bat"] = @"C:\Project"; actions.FileExists["csharp.log"] = true; var autobuilder = CreateAutoBuilder(true); @@ -685,10 +683,10 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\build.bat"] = 1; - actions.RunProcessWorkingDirectory[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\build.bat"] = @"C:\Project"; + actions.RunProcess[@"cmd.exe /C C:\Project\build.bat"] = 1; + actions.RunProcessWorkingDirectory[@"cmd.exe /C C:\Project\build.bat"] = @"C:\Project"; actions.RunProcess[@"cmd.exe /C C:\codeql\tools\java\bin\java -jar C:\codeql\csharp\tools\extractor-asp.jar ."] = 0; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --xml --extensions config"] = 0; + actions.RunProcess[@"cmd.exe /C C:\codeql\tools\codeql index --xml --extensions config"] = 0; actions.FileExists["csharp.log"] = true; var autobuilder = CreateAutoBuilder(true, ignoreErrors: "true"); @@ -698,9 +696,9 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestWindowsCmdIgnoreErrors() { - actions.RunProcess["cmd.exe /C C:\\odasa\\tools\\odasa index --auto ^\"build.cmd --skip-tests^\""] = 3; + actions.RunProcess["cmd.exe /C ^\"build.cmd --skip-tests^\""] = 3; actions.RunProcess[@"cmd.exe /C C:\codeql\tools\java\bin\java -jar C:\codeql\csharp\tools\extractor-asp.jar ."] = 0; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --xml --extensions config"] = 0; + actions.RunProcess[@"cmd.exe /C C:\codeql\tools\codeql index --xml --extensions config"] = 0; actions.FileExists["csharp.log"] = true; SkipVsWhere(); @@ -717,9 +715,9 @@ namespace Semmle.Autobuild.CSharp.Tests public void TestWindowCSharpMsBuild() { actions.RunProcess[@"cmd.exe /C C:\Project\.nuget\nuget.exe restore C:\Project\test1.sln -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.RunProcess[@"cmd.exe /C C:\Project\.nuget\nuget.exe restore C:\Project\test2.sln -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test2.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test2.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"] = false; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"] = false; @@ -748,9 +746,9 @@ namespace Semmle.Autobuild.CSharp.Tests public void TestWindowCSharpMsBuildMultipleSolutions() { actions.RunProcess[@"cmd.exe /C nuget restore C:\Project\test1.csproj -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test1.csproj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test1.csproj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.RunProcess[@"cmd.exe /C nuget restore C:\Project\test2.csproj -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test2.csproj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test2.csproj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project\test1.csproj"] = true; actions.FileExists[@"C:\Project\test2.csproj"] = true; @@ -793,7 +791,7 @@ namespace Semmle.Autobuild.CSharp.Tests public void TestWindowCSharpMsBuildFailed() { actions.RunProcess[@"cmd.exe /C nuget restore C:\Project\test1.sln -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 1; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 1; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"] = false; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"] = false; @@ -819,8 +817,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestSkipNugetMsBuild() { - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\test2.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test1.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\test2.sln /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"] = false; actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"] = false; @@ -864,7 +862,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess["dotnet --info"] = 0; actions.RunProcess[@"dotnet clean C:\Project/test.csproj"] = 0; actions.RunProcess[@"dotnet restore C:\Project/test.csproj"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto dotnet build --no-incremental /p:UseSharedCompilation=false --no-restore C:\Project/test.csproj"] = 0; + actions.RunProcess[@"dotnet build --no-incremental /p:UseSharedCompilation=false --no-restore C:\Project/test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project/test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -896,7 +894,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess[@"C:\Project/.dotnet/dotnet --info"] = 0; actions.RunProcess[@"C:\Project/.dotnet/dotnet clean C:\Project/test.csproj"] = 0; actions.RunProcess[@"C:\Project/.dotnet/dotnet restore C:\Project/test.csproj"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/.dotnet/dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; + actions.RunProcess[@"C:\Project/.dotnet/dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists["test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -931,7 +929,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess[@"C:\Project/.dotnet/dotnet --info"] = 0; actions.RunProcess[@"C:\Project/.dotnet/dotnet clean C:\Project/test.csproj"] = 0; actions.RunProcess[@"C:\Project/.dotnet/dotnet restore C:\Project/test.csproj"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/.dotnet/dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; + actions.RunProcess[@"C:\Project/.dotnet/dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists["test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -962,7 +960,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet --info"] = 0; actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet clean C:\Project\test.csproj"] = 0; actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet restore C:\Project\test.csproj"] = 0; - actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\.dotnet\dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0; + actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project\test.csproj"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -1010,7 +1008,7 @@ namespace Semmle.Autobuild.CSharp.Tests { actions.RunProcess[@"cmd.exe /C nuget restore C:\Project\dirs.proj -DisableParallelProcessing"] = 1; actions.RunProcess[@"cmd.exe /C C:\Project\.nuget\nuget.exe restore C:\Project\dirs.proj -DisableParallelProcessing"] = 0; - actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && C:\\odasa\\tools\\odasa index --auto msbuild C:\\Project\\dirs.proj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; + actions.RunProcess["cmd.exe /C CALL ^\"C:\\Program Files ^(x86^)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat^\" && set Platform=&& type NUL && msbuild C:\\Project\\dirs.proj /p:UseSharedCompilation=false /t:Windows /p:Platform=\"x86\" /p:Configuration=\"Debug\" /p:MvcBuildViews=true /P:Fu=Bar"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project\a\test.csproj"] = true; actions.FileExists[@"C:\Project\dirs.proj"] = true; @@ -1054,7 +1052,7 @@ namespace Semmle.Autobuild.CSharp.Tests { actions.RunProcess[@"nuget restore C:\Project/dirs.proj -DisableParallelProcessing"] = 1; actions.RunProcess[@"mono C:\Project/.nuget/nuget.exe restore C:\Project/dirs.proj -DisableParallelProcessing"] = 0; - actions.RunProcess[@"C:\odasa/tools/odasa index --auto msbuild C:\Project/dirs.proj /p:UseSharedCompilation=false /t:rebuild /p:MvcBuildViews=true"] = 0; + actions.RunProcess[@"msbuild C:\Project/dirs.proj /p:UseSharedCompilation=false /t:rebuild /p:MvcBuildViews=true"] = 0; actions.FileExists["csharp.log"] = true; actions.FileExists[@"C:\Project/a/test.csproj"] = true; actions.FileExists[@"C:\Project/dirs.proj"] = true; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index 3d7a1168e30..18603809d34 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -240,7 +240,7 @@ namespace Semmle.Autobuild.CSharp private static BuildScript GetBuildScript(Autobuilder builder, string? dotNetPath, IDictionary? environment, string projOrSln) { var build = new CommandBuilder(builder.Actions, null, environment); - var script = builder.MaybeIndex(build, DotNetCommand(builder.Actions, dotNetPath)). + var script = build.RunCommand(DotNetCommand(builder.Actions, dotNetPath)). Argument("build"). Argument("--no-incremental"); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index e98f94f3b44..fa6523e37ae 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -17,10 +17,6 @@ namespace Semmle.Autobuild.CSharp { standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); } - else if (builder.SemmlePlatformTools is not null) - { - standalone = builder.Actions.PathCombine(builder.SemmlePlatformTools, "csharp", "Semmle.Extraction.CSharp.Standalone"); - } else { return BuildScript.Failure; diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs index 3e8720ce676..ed20bb929ff 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs @@ -10,7 +10,8 @@ namespace Semmle.Autobuild.Shared /// public class AutobuildOptions { - private const string prefix = "LGTM_INDEX_"; + private const string lgtmPrefix = "LGTM_INDEX_"; + private const string extractorOptionPrefix = "CODEQL_EXTRACTOR_CSHARP_OPTION_"; public int SearchDepth { get; } = 3; public string RootDirectory { get; } @@ -36,20 +37,21 @@ namespace Semmle.Autobuild.Shared public AutobuildOptions(IBuildActions actions, Language language) { RootDirectory = actions.GetCurrentDirectory(); - VsToolsVersion = actions.GetEnvironmentVariable(prefix + "VSTOOLS_VERSION"); - MsBuildArguments = actions.GetEnvironmentVariable(prefix + "MSBUILD_ARGUMENTS")?.AsStringWithExpandedEnvVars(actions); - MsBuildPlatform = actions.GetEnvironmentVariable(prefix + "MSBUILD_PLATFORM"); - MsBuildConfiguration = actions.GetEnvironmentVariable(prefix + "MSBUILD_CONFIGURATION"); - MsBuildTarget = actions.GetEnvironmentVariable(prefix + "MSBUILD_TARGET"); - DotNetArguments = actions.GetEnvironmentVariable(prefix + "DOTNET_ARGUMENTS")?.AsStringWithExpandedEnvVars(actions); - DotNetVersion = actions.GetEnvironmentVariable(prefix + "DOTNET_VERSION"); - BuildCommand = actions.GetEnvironmentVariable(prefix + "BUILD_COMMAND"); - Solution = actions.GetEnvironmentVariable(prefix + "SOLUTION").AsListWithExpandedEnvVars(actions, Array.Empty()); + VsToolsVersion = actions.GetEnvironmentVariable(lgtmPrefix + "VSTOOLS_VERSION"); + MsBuildArguments = actions.GetEnvironmentVariable(lgtmPrefix + "MSBUILD_ARGUMENTS")?.AsStringWithExpandedEnvVars(actions); + MsBuildPlatform = actions.GetEnvironmentVariable(lgtmPrefix + "MSBUILD_PLATFORM"); + MsBuildConfiguration = actions.GetEnvironmentVariable(lgtmPrefix + "MSBUILD_CONFIGURATION"); + MsBuildTarget = actions.GetEnvironmentVariable(lgtmPrefix + "MSBUILD_TARGET"); + DotNetArguments = actions.GetEnvironmentVariable(lgtmPrefix + "DOTNET_ARGUMENTS")?.AsStringWithExpandedEnvVars(actions); + DotNetVersion = actions.GetEnvironmentVariable(lgtmPrefix + "DOTNET_VERSION"); + BuildCommand = actions.GetEnvironmentVariable(lgtmPrefix + "BUILD_COMMAND"); + Solution = actions.GetEnvironmentVariable(lgtmPrefix + "SOLUTION").AsListWithExpandedEnvVars(actions, Array.Empty()); - IgnoreErrors = actions.GetEnvironmentVariable(prefix + "IGNORE_ERRORS").AsBool("ignore_errors", false); - Buildless = actions.GetEnvironmentVariable(prefix + "BUILDLESS").AsBool("buildless", false); - AllSolutions = actions.GetEnvironmentVariable(prefix + "ALL_SOLUTIONS").AsBool("all_solutions", false); - NugetRestore = actions.GetEnvironmentVariable(prefix + "NUGET_RESTORE").AsBool("nuget_restore", true); + IgnoreErrors = actions.GetEnvironmentVariable(lgtmPrefix + "IGNORE_ERRORS").AsBool("ignore_errors", false); + Buildless = actions.GetEnvironmentVariable(lgtmPrefix + "BUILDLESS").AsBool("buildless", false) || + actions.GetEnvironmentVariable(extractorOptionPrefix + "BUILDLESS").AsBool("buildless", false); + AllSolutions = actions.GetEnvironmentVariable(lgtmPrefix + "ALL_SOLUTIONS").AsBool("all_solutions", false); + NugetRestore = actions.GetEnvironmentVariable(lgtmPrefix + "NUGET_RESTORE").AsBool("nuget_restore", true); Language = language; } @@ -62,21 +64,12 @@ namespace Semmle.Autobuild.Shared if (value is null) return defaultValue; - switch (value.ToLower()) + return value.ToLower() switch { - case "on": - case "yes": - case "true": - case "enabled": - return true; - case "off": - case "no": - case "false": - case "disabled": - return false; - default: - throw new ArgumentOutOfRangeException(param, value, "The Boolean value is invalid."); - } + "on" or "yes" or "true" or "enabled" => true, + "off" or "no" or "false" or "disabled" => false, + _ => throw new ArgumentOutOfRangeException(param, value, "The Boolean value is invalid."), + }; } public static string[] AsListWithExpandedEnvVars(this string? value, IBuildActions actions, string[] defaultValue) diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs index 408672f7b97..d90175d245a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs @@ -190,19 +190,15 @@ namespace Semmle.Autobuild.Shared }); CodeQLExtractorLangRoot = Actions.GetEnvironmentVariable($"CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_ROOT"); - SemmlePlatformTools = Actions.GetEnvironmentVariable("SEMMLE_PLATFORM_TOOLS"); - CodeQlPlatform = Actions.GetEnvironmentVariable("CODEQL_PLATFORM"); TrapDir = Actions.GetEnvironmentVariable($"CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_TRAP_DIR") ?? - Actions.GetEnvironmentVariable("TRAP_FOLDER") ?? - throw new InvalidEnvironmentException($"The environment variable CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_TRAP_DIR or TRAP_FOLDER has not been set."); + throw new InvalidEnvironmentException($"The environment variable CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_TRAP_DIR has not been set."); SourceArchiveDir = Actions.GetEnvironmentVariable($"CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_SOURCE_ARCHIVE_DIR") ?? - Actions.GetEnvironmentVariable("SOURCE_ARCHIVE") ?? - throw new InvalidEnvironmentException($"The environment variable CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_SOURCE_ARCHIVE_DIR or SOURCE_ARCHIVE has not been set."); + throw new InvalidEnvironmentException($"The environment variable CODEQL_EXTRACTOR_{this.Options.Language.UpperCaseName}_SOURCE_ARCHIVE_DIR has not been set."); } protected string TrapDir { get; } @@ -264,34 +260,9 @@ namespace Semmle.Autobuild.Shared /// public string? CodeQLExtractorLangRoot { get; } - /// - /// Value of SEMMLE_PLATFORM_TOOLS environment variable. - /// - public string? SemmlePlatformTools { get; } - /// /// Value of CODEQL_PLATFORM environment variable. /// public string? CodeQlPlatform { get; } - - /// - /// The absolute path of the odasa executable. - /// null if we are running in CodeQL. - /// - public string? Odasa - { - get - { - var semmleDist = Actions.GetEnvironmentVariable("SEMMLE_DIST"); - return semmleDist is null ? null : Actions.PathCombine(semmleDist, "tools", "odasa"); - } - } - - /// - /// Construct a command that executed the given wrapped in - /// an odasa --index, unless indexing has been disabled, in which case - /// is run directly. - /// - public CommandBuilder MaybeIndex(CommandBuilder builder, string cmd) => Odasa is null ? builder.RunCommand(cmd) : builder.IndexCommand(Odasa, cmd); } } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs index fbb109f0b4c..b6cb0737630 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandAutoRule.cs @@ -58,7 +58,7 @@ namespace Semmle.Autobuild.Shared if (vsTools is not null) command.CallBatFile(vsTools.Path); - builder.MaybeIndex(command, scriptPath); + command.RunCommand(scriptPath); return command.Script; }); } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs index 453d3c4f9ad..6db4cfa139d 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildCommandRule.cs @@ -26,7 +26,7 @@ var vsTools = MsBuildRule.GetVcVarsBatFile(builder); if (vsTools is not null) command.CallBatFile(vsTools.Path); - builder.MaybeIndex(command, builder.Options.BuildCommand); + command.RunCommand(builder.Options.BuildCommand); return command.Script; }); diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs index 679db860c49..9840d63c5e4 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs @@ -70,7 +70,7 @@ namespace Semmle.Autobuild.Shared this.environment = environment; } - public override string ToString() => exe + " " + arguments; + public override string ToString() => arguments.Length > 0 ? exe + " " + arguments : exe; public override int Run(IBuildActions actions, Action startCallback, Action exitCallBack) { diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs index e3b7bdbab34..2064380772f 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/CommandBuilder.cs @@ -45,11 +45,6 @@ namespace Semmle.Autobuild.Shared this.silent = silent; } - private void OdasaIndex(string odasa) - { - RunCommand(odasa, "index --auto"); - } - public CommandBuilder CallBatFile(string batFile, string? argumentsOpt = null) { NextCommand(); @@ -59,21 +54,6 @@ namespace Semmle.Autobuild.Shared return this; } - /// - /// Perform odasa index on a given command or BAT file. - /// - /// The odasa executable. - /// The command to run. - /// Additional arguments. - /// this for chaining calls. - public CommandBuilder IndexCommand(string odasa, string command, string? argumentsOpt = null) - { - OdasaIndex(odasa); - QuoteArgument(command); - Argument(argumentsOpt); - return this; - } - private static readonly char[] specialChars = { ' ', '\t', '\n', '\v', '\"' }; private static readonly char[] cmdMetacharacter = { '(', ')', '%', '!', '^', '\"', '<', '>', '&', '|' }; diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs index 1a938f81a32..55dbf31ba1b 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs @@ -95,7 +95,7 @@ namespace Semmle.Autobuild.Shared command.RunCommand("set Platform=&& type NUL", quoteExe: false); } - builder.MaybeIndex(command, msBuild); + command.RunCommand(msBuild); command.QuoteArgument(projectOrSolution.FullPath); command.Argument("/p:UseSharedCompilation=false"); diff --git a/csharp/codeql-extractor.yml b/csharp/codeql-extractor.yml index f346663157a..5d498049a8a 100644 --- a/csharp/codeql-extractor.yml +++ b/csharp/codeql-extractor.yml @@ -16,3 +16,28 @@ file_types: extensions: - .cs legacy_qltest_extraction: true +options: + trap: + title: Options pertaining to TRAP. + type: object + properties: + compression: + title: Controls compression for the TRAP files written by the extractor. + description: > + This option is only intended for use in debugging the extractor. Accepted + values are 'brotli' (the default, to write brotli-compressed TRAP), 'gzip', and 'none' + (to write uncompressed TRAP). + type: string + pattern: "^(none|gzip|brotli)$" + buildless: + title: Whether to use buildless (standalone) extraction. + description: > + A value indicating, which type of extraction the autobuilder should perform. + If 'true', then the standalone extractor will be used, otherwise tracing extraction + will be performed. + The default is 'false'. + Note that buildless extraction will generally yield less accurate analysis results, + and should only be used in cases where it is not possible to build + the code (for example if it uses inaccessible dependencies). + type: string + pattern: "^(false|true)$" diff --git a/csharp/config/tracer/linux/csharp-compiler-settings b/csharp/config/tracer/linux/csharp-compiler-settings deleted file mode 100644 index f62c33a450b..00000000000 --- a/csharp/config/tracer/linux/csharp-compiler-settings +++ /dev/null @@ -1,14 +0,0 @@ -**/mcs.exe: -**/csc.exe: - invoke ${env.SEMMLE_PLATFORM_TOOLS}/csharp/Semmle.Extraction.CSharp.Driver - prepend --compiler - prepend "${compiler}" - prepend --cil -**/mono*: -**/dotnet: - invoke ${odasa_tools}/extract-csharp.sh -**/msbuild: -**/xbuild: - replace yes - invoke ${compiler} - append /p:UseSharedCompilation=false diff --git a/csharp/config/tracer/linux/extract-csharp.sh b/csharp/config/tracer/linux/extract-csharp.sh deleted file mode 100755 index 00bf654d792..00000000000 --- a/csharp/config/tracer/linux/extract-csharp.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -echo extract-csharp.sh: Called with arguments: "$@" - -extractor=$SEMMLE_PLATFORM_TOOLS/csharp/Semmle.Extraction.CSharp.Driver - -for i in "$@" -do - shift - if [[ `basename -- "$i"` =~ csc.exe|mcs.exe|csc.dll ]] - then - echo extract-csharp.sh: exec $extractor --cil $@ - exec "$extractor" --compiler $i --cil $@ - fi -done - -echo extract-csharp.sh: Not a compiler invocation diff --git a/csharp/config/tracer/windows/csharp-compiler-settings b/csharp/config/tracer/windows/csharp-compiler-settings deleted file mode 100644 index 24ffb8e37a3..00000000000 --- a/csharp/config/tracer/windows/csharp-compiler-settings +++ /dev/null @@ -1,9 +0,0 @@ -**\fakes*.exe: -**\moles*.exe: - order compiler - trace no -**\csc*.exe: - invoke ${env.SEMMLE_PLATFORM_TOOLS}\csharp\Semmle.Extraction.CSharp.Driver.exe - prepend --compiler - prepend "${compiler}" - prepend --cil diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index 9a77f1e0ebc..4d9996c1446 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -1,6 +1,7 @@ package,sink,source,summary,sink:code,sink:html,sink:remote,sink:sql,sink:xss,source:local,summary:taint,summary:value Dapper,55,,,,,,55,,,, Microsoft.ApplicationBlocks.Data,28,,,,,,28,,,, +Microsoft.EntityFrameworkCore,6,,,,,,6,,,, Microsoft.Extensions.Primitives,,,54,,,,,,,54, Microsoft.VisualBasic,,,4,,,,,,,,4 MySql.Data.MySqlClient,48,,,,,,48,,,, diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index 7ac7b6d1e9b..9863b503fbf 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -9,6 +9,6 @@ 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``",3,2336,28,5 - Others,"``Dapper``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.Extensions.Primitives``, ``Microsoft.VisualBasic``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``",,149,131, - Totals,,3,2492,353,5 + Others,"``Dapper``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Primitives``, ``Microsoft.VisualBasic``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``",,149,137, + Totals,,3,2492,359,5 diff --git a/csharp/downgrades/qlpack.yml b/csharp/downgrades/qlpack.yml index 760b6156a00..c326f44bb0d 100644 --- a/csharp/downgrades/qlpack.yml +++ b/csharp/downgrades/qlpack.yml @@ -1,5 +1,4 @@ name: codeql/csharp-downgrades groups: csharp -version: 0.0.6-dev downgrades: . -library: true \ No newline at end of file +library: true diff --git a/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs b/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs index 9e72f560854..b4664103962 100644 --- a/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs +++ b/csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs @@ -20,11 +20,11 @@ namespace Semmle.Extraction.CIL.Driver Console.WriteLine(" path A directory/dll/exe to analyze"); } - private static void ExtractAssembly(Layout layout, string assemblyPath, ILogger logger, CommonOptions options) + private static void ExtractAssembly(string assemblyPath, ILogger logger, CommonOptions options) { var sw = new Stopwatch(); sw.Start(); - Analyser.ExtractCIL(layout, assemblyPath, logger, options, out _, out _); + Analyser.ExtractCIL(assemblyPath, logger, options, out _, out _); sw.Stop(); logger.Log(Severity.Info, " {0} ({1})", assemblyPath, sw.Elapsed); } @@ -38,12 +38,11 @@ namespace Semmle.Extraction.CIL.Driver } var options = new ExtractorOptions(args); - var layout = new Layout(); using var logger = new ConsoleLogger(options.Verbosity); var actions = options.AssembliesToExtract .Select(asm => asm.Filename) - .Select(filename => () => ExtractAssembly(layout, filename, logger, options)) + .Select(filename => () => ExtractAssembly(filename, logger, options)) .ToArray(); foreach (var missingRef in options.MissingReferences) diff --git a/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs b/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs index e78843148af..e5b78592fb3 100644 --- a/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs +++ b/csharp/extractor/Semmle.Extraction.CIL/Analyser.cs @@ -25,7 +25,7 @@ namespace Semmle.Extraction.CIL /// Whether to extract PDBs. /// The path of the trap file. /// Whether the file was extracted (false=cached). - public static void ExtractCIL(Layout layout, string assemblyPath, ILogger logger, CommonOptions options, out string trapFile, out bool extracted) + public static void ExtractCIL(string assemblyPath, ILogger logger, CommonOptions options, out string trapFile, out bool extracted) { trapFile = ""; extracted = false; @@ -35,8 +35,7 @@ namespace Semmle.Extraction.CIL var pathTransformer = new PathTransformer(canonicalPathCache); var extractor = new TracingExtractor(assemblyPath, logger, pathTransformer, options); var transformedAssemblyPath = pathTransformer.Transform(assemblyPath); - var project = layout.LookupProjectOrDefault(transformedAssemblyPath); - using var trapWriter = project.CreateTrapWriter(logger, transformedAssemblyPath.WithSuffix(".cil"), options.TrapCompression, discardDuplicates: true); + using var trapWriter = transformedAssemblyPath.WithSuffix(".cil").CreateTrapWriter(logger, options.TrapCompression, discardDuplicates: true); trapFile = trapWriter.TrapFile; if (!options.Cache || !System.IO.File.Exists(trapFile)) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs new file mode 100644 index 00000000000..97a25d200f7 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Semmle.Util; +using Semmle.Util.Logging; + +namespace Semmle.Extraction.CSharp.Standalone +{ + public static class Extractor + { + + private static IEnumerable GetResolvedReferencesStandalone(IEnumerable referencePaths, BlockingCollection references) + { + return referencePaths.Select(path => () => + { + var reference = MetadataReference.CreateFromFile(path); + references.Add(reference); + }); + } + + private static void AnalyseStandalone( + StandaloneAnalyser analyser, + IEnumerable sources, + IEnumerable referencePaths, + CommonOptions options, + IProgressMonitor progressMonitor, + Stopwatch stopwatch) + { + CSharp.Extractor.Analyse(stopwatch, analyser, options, + references => GetResolvedReferencesStandalone(referencePaths, references), + (analyser, syntaxTrees) => CSharp.Extractor.ReadSyntaxTrees(sources, analyser, null, null, syntaxTrees), + (syntaxTrees, references) => CSharpCompilation.Create("csharp.dll", syntaxTrees, references), + (compilation, options) => analyser.Initialize(compilation, options), + () => { }, + _ => { }, + () => + { + foreach (var type in analyser.MissingNamespaces) + { + progressMonitor.MissingNamespace(type); + } + + foreach (var type in analyser.MissingTypes) + { + progressMonitor.MissingType(type); + } + + progressMonitor.MissingSummary(analyser.MissingTypes.Count(), analyser.MissingNamespaces.Count()); + }); + } + + private static void ExtractStandalone( + IEnumerable sources, + IEnumerable referencePaths, + IProgressMonitor pm, + ILogger logger, + CommonOptions options) + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + var canonicalPathCache = CanonicalPathCache.Create(logger, 1000); + var pathTransformer = new PathTransformer(canonicalPathCache); + + using var analyser = new StandaloneAnalyser(pm, logger, false, pathTransformer); + try + { + AnalyseStandalone(analyser, sources, referencePaths, options, pm, stopwatch); + } + catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] + { + analyser.Logger.Log(Severity.Error, " Unhandled exception: {0}", ex); + } + } + + private class ExtractionProgress : IProgressMonitor + { + public ExtractionProgress(ILogger output) + { + logger = output; + } + + private readonly ILogger logger; + + public void Analysed(int item, int total, string source, string output, TimeSpan time, AnalysisAction action) + { + logger.Log(Severity.Info, "[{0}/{1}] {2} ({3})", item, total, source, + action == AnalysisAction.Extracted + ? time.ToString() + : action == AnalysisAction.Excluded + ? "excluded" + : "up to date"); + } + + public void MissingType(string type) + { + logger.Log(Severity.Debug, "Missing type {0}", type); + } + + public void MissingNamespace(string @namespace) + { + logger.Log(Severity.Info, "Missing namespace {0}", @namespace); + } + + public void MissingSummary(int missingTypes, int missingNamespaces) + { + logger.Log(Severity.Info, "Failed to resolve {0} types in {1} namespaces", missingTypes, missingNamespaces); + } + } + + public static ExitCode Run(Options options) + { + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + using var logger = new ConsoleLogger(options.Verbosity); + logger.Log(Severity.Info, "Running C# standalone extractor"); + using var a = new Analysis(logger, options); + var sourceFileCount = a.Extraction.Sources.Count; + + if (sourceFileCount == 0) + { + logger.Log(Severity.Error, "No source files found"); + return ExitCode.Errors; + } + + if (!options.SkipExtraction) + { + using var fileLogger = CSharp.Extractor.MakeLogger(options.Verbosity, false); + + logger.Log(Severity.Info, ""); + logger.Log(Severity.Info, "Extracting..."); + ExtractStandalone( + a.Extraction.Sources, + a.References, + new ExtractionProgress(logger), + fileLogger, + options); + logger.Log(Severity.Info, $"Extraction completed in {stopwatch.Elapsed}"); + } + + return ExitCode.Ok; + } + } +} \ No newline at end of file diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs index e2c973ee60f..6266eb09f93 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using Semmle.BuildAnalyser; using Semmle.Util.Logging; @@ -52,11 +53,10 @@ namespace Semmle.Extraction.CSharp.Standalone { public static int Main(string[] args) { - Extractor.SetInvariantCulture(); + CSharp.Extractor.SetInvariantCulture(); var options = Options.Create(args); // options.CIL = true; // To do: Enable this - using var output = new ConsoleLogger(options.Verbosity); if (options.Help) { @@ -67,69 +67,7 @@ namespace Semmle.Extraction.CSharp.Standalone if (options.Errors) return 1; - var start = DateTime.Now; - - output.Log(Severity.Info, "Running C# standalone extractor"); - using var a = new Analysis(output, options); - var sourceFileCount = a.Extraction.Sources.Count; - - if (sourceFileCount == 0) - { - output.Log(Severity.Error, "No source files found"); - return 1; - } - - if (!options.SkipExtraction) - { - using var fileLogger = new FileLogger(options.Verbosity, Extractor.GetCSharpLogPath()); - - output.Log(Severity.Info, ""); - output.Log(Severity.Info, "Extracting..."); - Extractor.ExtractStandalone( - a.Extraction.Sources, - a.References, - new ExtractionProgress(output), - fileLogger, - options); - output.Log(Severity.Info, $"Extraction completed in {DateTime.Now - start}"); - } - - return 0; - } - - private class ExtractionProgress : IProgressMonitor - { - public ExtractionProgress(ILogger output) - { - logger = output; - } - - private readonly ILogger logger; - - public void Analysed(int item, int total, string source, string output, TimeSpan time, AnalysisAction action) - { - logger.Log(Severity.Info, "[{0}/{1}] {2} ({3})", item, total, source, - action == AnalysisAction.Extracted - ? time.ToString() - : action == AnalysisAction.Excluded - ? "excluded" - : "up to date"); - } - - public void MissingType(string type) - { - logger.Log(Severity.Debug, "Missing type {0}", type); - } - - public void MissingNamespace(string @namespace) - { - logger.Log(Severity.Info, "Missing namespace {0}", @namespace); - } - - public void MissingSummary(int missingTypes, int missingNamespaces) - { - logger.Log(Severity.Info, "Failed to resolve {0} types in {1} namespaces", missingTypes, missingNamespaces); - } + return (int)Extractor.Run(options); } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Runtime.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Runtime.cs index 1fbe016fc76..4b76efc3d65 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Runtime.cs @@ -84,7 +84,7 @@ namespace Semmle.Extraction.CSharp.Standalone foreach (var r in DesktopRuntimes) yield return r; - // A bad choice if it's the self-contained runtime distributed in odasa dist. + // A bad choice if it's the self-contained runtime distributed in codeql dist. yield return ExecutingRuntime; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/StandaloneAnalyser.cs similarity index 87% rename from csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs rename to csharp/extractor/Semmle.Extraction.CSharp.Standalone/StandaloneAnalyser.cs index 9173ab35217..310f7eb1553 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/StandaloneAnalyser.cs @@ -11,10 +11,9 @@ namespace Semmle.Extraction.CSharp { } - public void InitializeStandalone(CSharpCompilation compilationIn, CommonOptions options) + public void Initialize(CSharpCompilation compilationIn, CommonOptions options) { compilation = compilationIn; - layout = new Layout(); extractor = new StandaloneExtractor(Logger, PathTransformer, options); this.options = options; LogExtractorInfo(Extraction.Extractor.Version); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs index 336a76ffbdc..a2b7669c3bb 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs @@ -18,7 +18,6 @@ namespace Semmle.Extraction.CSharp { protected Extraction.Extractor? extractor; protected CSharpCompilation? compilation; - protected Layout? layout; protected CommonOptions? options; private readonly object progressMutex = new object(); @@ -125,8 +124,7 @@ namespace Semmle.Extraction.CSharp var assemblyPath = r.FilePath!; var transformedAssemblyPath = PathTransformer.Transform(assemblyPath); - var projectLayout = layout.LookupProjectOrDefault(transformedAssemblyPath); - using var trapWriter = projectLayout.CreateTrapWriter(Logger, transformedAssemblyPath, options.TrapCompression, discardDuplicates: true); + using var trapWriter = transformedAssemblyPath.CreateTrapWriter(Logger, options.TrapCompression, discardDuplicates: true); var skipExtraction = options.Cache && File.Exists(trapWriter.TrapFile); @@ -178,7 +176,7 @@ namespace Semmle.Extraction.CSharp { var stopwatch = new Stopwatch(); stopwatch.Start(); - CIL.Analyser.ExtractCIL(layout, r.FilePath!, Logger, options, out var trapFile, out var extracted); + CIL.Analyser.ExtractCIL(r.FilePath!, Logger, options, out var trapFile, out var extracted); stopwatch.Stop(); ReportProgress(r.FilePath, trapFile, stopwatch.Elapsed, extracted ? AnalysisAction.Extracted : AnalysisAction.UpToDate); } @@ -192,44 +190,35 @@ namespace Semmle.Extraction.CSharp var sourcePath = tree.FilePath; var transformedSourcePath = PathTransformer.Transform(sourcePath); - var projectLayout = layout.LookupProjectOrNull(transformedSourcePath); - var excluded = projectLayout is null; - var trapPath = excluded ? "" : projectLayout!.GetTrapPath(Logger, transformedSourcePath, options.TrapCompression); + var trapPath = transformedSourcePath.GetTrapPath(Logger, options.TrapCompression); var upToDate = false; - if (!excluded) + // compilation.Clone() is used to allow symbols to be garbage collected. + using var trapWriter = transformedSourcePath.CreateTrapWriter(Logger, options.TrapCompression, discardDuplicates: false); + + upToDate = options.Fast && FileIsUpToDate(sourcePath, trapWriter.TrapFile); + + if (!upToDate) { - // compilation.Clone() is used to allow symbols to be garbage collected. - using var trapWriter = projectLayout!.CreateTrapWriter(Logger, transformedSourcePath, options.TrapCompression, discardDuplicates: false); + var cx = new Context(extractor, compilation.Clone(), trapWriter, new SourceScope(tree), addAssemblyTrapPrefix); + // Ensure that the file itself is populated in case the source file is totally empty + var root = tree.GetRoot(); + Entities.File.Create(cx, root.SyntaxTree.FilePath); - upToDate = options.Fast && FileIsUpToDate(sourcePath, trapWriter.TrapFile); - - if (!upToDate) + var csNode = (CSharpSyntaxNode)root; + var directiveVisitor = new DirectiveVisitor(cx); + csNode.Accept(directiveVisitor); + foreach (var branch in directiveVisitor.BranchesTaken) { - var cx = new Context(extractor, compilation.Clone(), trapWriter, new SourceScope(tree), addAssemblyTrapPrefix); - // Ensure that the file itself is populated in case the source file is totally empty - var root = tree.GetRoot(); - Entities.File.Create(cx, root.SyntaxTree.FilePath); - - var csNode = (CSharpSyntaxNode)root; - var directiveVisitor = new DirectiveVisitor(cx); - csNode.Accept(directiveVisitor); - foreach (var branch in directiveVisitor.BranchesTaken) - { - cx.TrapStackSuffix.Add(branch); - } - csNode.Accept(new CompilationUnitVisitor(cx)); - cx.PopulateAll(); - CommentPopulator.ExtractCommentBlocks(cx, cx.CommentGenerator); - cx.PopulateAll(); + cx.TrapStackSuffix.Add(branch); } + csNode.Accept(new CompilationUnitVisitor(cx)); + cx.PopulateAll(); + CommentPopulator.ExtractCommentBlocks(cx, cx.CommentGenerator); + cx.PopulateAll(); } - ReportProgress(sourcePath, trapPath, stopwatch.Elapsed, excluded - ? AnalysisAction.Excluded - : upToDate - ? AnalysisAction.UpToDate - : AnalysisAction.Extracted); + ReportProgress(sourcePath, trapPath, stopwatch.Elapsed, upToDate ? AnalysisAction.UpToDate : AnalysisAction.Extracted); } catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs index 25829a35068..8d63c6288bf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs @@ -16,15 +16,15 @@ using System.Threading; namespace Semmle.Extraction.CSharp { + public enum ExitCode + { + Ok, // Everything worked perfectly + Errors, // Trap was generated but there were processing errors + Failed // Trap could not be generated + } + public static class Extractor { - public enum ExitCode - { - Ok, // Everything worked perfectly - Errors, // Trap was generated but there were processing errors - Failed // Trap could not be generated - } - private class LogProgressMonitor : IProgressMonitor { private readonly ILogger logger; @@ -69,6 +69,14 @@ namespace Semmle.Extraction.CSharp Thread.CurrentThread.CurrentUICulture = culture; } + public static ILogger MakeLogger(Verbosity verbosity, bool includeConsole) + { + var fileLogger = new FileLogger(verbosity, GetCSharpLogPath()); + return includeConsole + ? new CombinedLogger(new ConsoleLogger(verbosity), fileLogger) + : (ILogger)fileLogger; + } + /// /// Command-line driver for the extractor. /// @@ -89,10 +97,7 @@ namespace Semmle.Extraction.CSharp var options = Options.CreateWithEnvironment(args); Entities.Compilation.Settings = (Directory.GetCurrentDirectory(), options.CompilerArguments.ToArray()); - var fileLogger = new FileLogger(options.Verbosity, GetCSharpLogPath()); - using var logger = options.Console - ? new CombinedLogger(new ConsoleLogger(options.Verbosity), fileLogger) - : (ILogger)fileLogger; + using var logger = MakeLogger(options.Verbosity, options.Console); if (Environment.GetEnvironmentVariable("SEMMLE_CLRTRACER") == "1" && !options.ClrTracer) { @@ -276,7 +281,7 @@ namespace Semmle.Extraction.CSharp /// The constructed syntax trees will be added (thread-safely) to the supplied /// list . /// - private static IEnumerable ReadSyntaxTrees(IEnumerable sources, Analyser analyser, CSharpParseOptions? parseOptions, Encoding? encoding, IList ret) + public static IEnumerable ReadSyntaxTrees(IEnumerable sources, Analyser analyser, CSharpParseOptions? parseOptions, Encoding? encoding, IList ret) { return sources.Select(path => () => { @@ -298,31 +303,7 @@ namespace Semmle.Extraction.CSharp }); } - public static void ExtractStandalone( - IEnumerable sources, - IEnumerable referencePaths, - IProgressMonitor pm, - ILogger logger, - CommonOptions options) - { - var stopwatch = new Stopwatch(); - stopwatch.Start(); - - var canonicalPathCache = CanonicalPathCache.Create(logger, 1000); - var pathTransformer = new PathTransformer(canonicalPathCache); - - using var analyser = new StandaloneAnalyser(pm, logger, false, pathTransformer); - try - { - AnalyseStandalone(analyser, sources, referencePaths, options, pm, stopwatch); - } - catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] - { - analyser.Logger.Log(Severity.Error, " Unhandled exception: {0}", ex); - } - } - - private static ExitCode Analyse(Stopwatch stopwatch, Analyser analyser, CommonOptions options, + public static ExitCode Analyse(Stopwatch stopwatch, Analyser analyser, CommonOptions options, Func, IEnumerable> getResolvedReferenceTasks, Func, IEnumerable> getSyntaxTreeTasks, Func, IEnumerable, CSharpCompilation> getCompilation, @@ -395,37 +376,6 @@ namespace Semmle.Extraction.CSharp return analyser.TotalErrors == 0 ? ExitCode.Ok : ExitCode.Errors; } - private static void AnalyseStandalone( - StandaloneAnalyser analyser, - IEnumerable sources, - IEnumerable referencePaths, - CommonOptions options, - IProgressMonitor progressMonitor, - Stopwatch stopwatch) - { - Analyse(stopwatch, analyser, options, - references => GetResolvedReferencesStandalone(referencePaths, references), - (analyser, syntaxTrees) => ReadSyntaxTrees(sources, analyser, null, null, syntaxTrees), - (syntaxTrees, references) => CSharpCompilation.Create("csharp.dll", syntaxTrees, references), - (compilation, options) => analyser.InitializeStandalone(compilation, options), - () => { }, - _ => { }, - () => - { - foreach (var type in analyser.MissingNamespaces) - { - progressMonitor.MissingNamespace(type); - } - - foreach (var type in analyser.MissingTypes) - { - progressMonitor.MissingType(type); - } - - progressMonitor.MissingSummary(analyser.MissingTypes.Count(), analyser.MissingNamespaces.Count()); - }); - } - private static ExitCode AnalyseTracing( TracingAnalyser analyser, CSharpCommandLineArguments compilerArguments, @@ -468,15 +418,6 @@ namespace Semmle.Extraction.CSharp () => { }); } - private static IEnumerable GetResolvedReferencesStandalone(IEnumerable referencePaths, BlockingCollection references) - { - return referencePaths.Select(path => () => - { - var reference = MetadataReference.CreateFromFile(path); - references.Add(reference); - }); - } - /// /// Gets the path to the `csharp.log` file written to by the C# extractor. /// @@ -511,19 +452,6 @@ namespace Semmle.Extraction.CSharp if (!string.IsNullOrEmpty(codeQlLogDir)) return codeQlLogDir; - var snapshot = Environment.GetEnvironmentVariable("ODASA_SNAPSHOT"); - if (!string.IsNullOrEmpty(snapshot)) - return Path.Combine(snapshot, "log"); - - var buildErrorDir = Environment.GetEnvironmentVariable("ODASA_BUILD_ERROR_DIR"); - if (!string.IsNullOrEmpty(buildErrorDir)) - // Used by `qltest` - return buildErrorDir; - - var traps = Environment.GetEnvironmentVariable("TRAP_FOLDER"); - if (!string.IsNullOrEmpty(traps)) - return traps; - return Directory.GetCurrentDirectory(); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Options.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Options.cs index 0e27799efd1..7b4e0e95ea3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Options.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Options.cs @@ -40,13 +40,14 @@ namespace Semmle.Extraction.CSharp public static Options CreateWithEnvironment(string[] arguments) { var options = new Options(); - var extractionOptions = Environment.GetEnvironmentVariable("SEMMLE_EXTRACTOR_OPTIONS") ?? - Environment.GetEnvironmentVariable("LGTM_INDEX_EXTRACTOR"); + var extractionOptions = Environment.GetEnvironmentVariable("LGTM_INDEX_EXTRACTOR"); var argsList = new List(arguments); if (!string.IsNullOrEmpty(extractionOptions)) + { argsList.AddRange(extractionOptions.Split(' ')); + } options.ParseArguments(argsList); return options; diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs index 4c15d053a93..8681ded3f09 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs @@ -46,7 +46,6 @@ namespace Semmle.Extraction.CSharp { if (!init) throw new InternalError("EndInitialize called without BeginInitialize returning true"); - this.layout = new Layout(); this.options = options; this.compilation = compilation; this.extractor = new TracingExtractor(GetOutputName(compilation, commandLineArguments), Logger, PathTransformer, options); @@ -202,8 +201,7 @@ namespace Semmle.Extraction.CSharp var assemblyPath = ((TracingExtractor?)extractor).OutputPath; var transformedAssemblyPath = PathTransformer.Transform(assemblyPath); var assembly = compilation.Assembly; - var projectLayout = layout.LookupProjectOrDefault(transformedAssemblyPath); - var trapWriter = projectLayout.CreateTrapWriter(Logger, transformedAssemblyPath, options.TrapCompression, discardDuplicates: false); + var trapWriter = transformedAssemblyPath.CreateTrapWriter(Logger, options.TrapCompression, discardDuplicates: false); compilationTrapFile = trapWriter; // Dispose later var cx = new Context(extractor, compilation.Clone(), trapWriter, new AssemblyScope(assembly, assemblyPath), addAssemblyTrapPrefix); diff --git a/csharp/extractor/Semmle.Extraction.Tests/Layout.cs b/csharp/extractor/Semmle.Extraction.Tests/Layout.cs deleted file mode 100644 index 58470fa8caa..00000000000 --- a/csharp/extractor/Semmle.Extraction.Tests/Layout.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System.IO; -using Xunit; -using Semmle.Util.Logging; -using System.Runtime.InteropServices; - -namespace Semmle.Extraction.Tests -{ - internal struct TransformedPathStub : PathTransformer.ITransformedPath - { - private readonly string value; - public TransformedPathStub(string value) => this.value = value; - public string Value => value; - - public string Extension => throw new System.NotImplementedException(); - - public string NameWithoutExtension => throw new System.NotImplementedException(); - - public PathTransformer.ITransformedPath ParentDirectory => throw new System.NotImplementedException(); - - public string DatabaseId => throw new System.NotImplementedException(); - - public PathTransformer.ITransformedPath WithSuffix(string suffix) - { - throw new System.NotImplementedException(); - } - } - - public class Layout - { - private readonly ILogger logger = new LoggerMock(); - - [Fact] - public void TestDefaultLayout() - { - var layout = new Semmle.Extraction.Layout(null, null, null); - var project = layout.LookupProjectOrNull(new TransformedPathStub("foo.cs")); - - Assert.NotNull(project); - - // All files are mapped when there's no layout file. - Assert.True(layout.FileInLayout(new TransformedPathStub("foo.cs"))); - - // Test trap filename - var tmpDir = Path.GetTempPath(); - Directory.SetCurrentDirectory(tmpDir); - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - // `Directory.SetCurrentDirectory()` seems to slightly change the path on macOS, - // so adjusting it: - Assert.NotEqual(Directory.GetCurrentDirectory(), tmpDir); - tmpDir = "/private" + tmpDir; - // Remove trailing slash: - Assert.Equal('/', tmpDir[tmpDir.Length - 1]); - tmpDir = tmpDir.Substring(0, tmpDir.Length - 1); - Assert.Equal(Directory.GetCurrentDirectory(), tmpDir); - } - var f1 = project!.GetTrapPath(logger, new TransformedPathStub("foo.cs"), TrapWriter.CompressionMode.Gzip); - var g1 = TrapWriter.NestPaths(logger, tmpDir, "foo.cs.trap.gz"); - Assert.Equal(f1, g1); - - // Test trap file generation - var trapwriterFilename = project.GetTrapPath(logger, new TransformedPathStub("foo.cs"), TrapWriter.CompressionMode.Gzip); - using (var trapwriter = project.CreateTrapWriter(logger, new TransformedPathStub("foo.cs"), TrapWriter.CompressionMode.Gzip, discardDuplicates: false)) - { - trapwriter.Emit("1=*"); - Assert.False(File.Exists(trapwriterFilename)); - } - Assert.True(File.Exists(trapwriterFilename)); - File.Delete(trapwriterFilename); - } - - [Fact] - public void TestLayoutFile() - { - File.WriteAllLines("layout.txt", new string[] - { - "# Section", - "TRAP_FOLDER=" + Path.GetFullPath("snapshot\\trap"), - "ODASA_DB=snapshot\\db-csharp", - "SOURCE_ARCHIVE=" + Path.GetFullPath("snapshot\\archive"), - "ODASA_BUILD_ERROR_DIR=snapshot\build-errors", - "-foo.cs", - "bar.cs", - "-excluded", - "excluded/foo.cs", - "included" - }); - - var layout = new Semmle.Extraction.Layout(null, null, "layout.txt"); - - // Test general pattern matching - Assert.True(layout.FileInLayout(new TransformedPathStub("bar.cs"))); - Assert.False(layout.FileInLayout(new TransformedPathStub("foo.cs"))); - Assert.False(layout.FileInLayout(new TransformedPathStub("goo.cs"))); - Assert.False(layout.FileInLayout(new TransformedPathStub("excluded/bar.cs"))); - Assert.True(layout.FileInLayout(new TransformedPathStub("excluded/foo.cs"))); - Assert.True(layout.FileInLayout(new TransformedPathStub("included/foo.cs"))); - - // Test the trap file - var project = layout.LookupProjectOrNull(new TransformedPathStub("bar.cs")); - Assert.NotNull(project); - var trapwriterFilename = project!.GetTrapPath(logger, new TransformedPathStub("bar.cs"), TrapWriter.CompressionMode.Gzip); - Assert.Equal(TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\trap"), "bar.cs.trap.gz"), - trapwriterFilename); - - // Test the source archive - var trapWriter = project.CreateTrapWriter(logger, new TransformedPathStub("bar.cs"), TrapWriter.CompressionMode.Gzip, discardDuplicates: false); - trapWriter.Archive("layout.txt", new TransformedPathStub("layout.txt"), System.Text.Encoding.ASCII); - var writtenFile = TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\archive"), "layout.txt"); - Assert.True(File.Exists(writtenFile)); - File.Delete("layout.txt"); - } - - [Fact] - public void TestTrapOverridesLayout() - { - // When you specify both a trap file and a layout, use the trap file. - var layout = new Semmle.Extraction.Layout(Path.GetFullPath("snapshot\\trap"), null, "something.txt"); - Assert.True(layout.FileInLayout(new TransformedPathStub("bar.cs"))); - var subProject = layout.LookupProjectOrNull(new TransformedPathStub("foo.cs")); - Assert.NotNull(subProject); - var f1 = subProject!.GetTrapPath(logger, new TransformedPathStub("foo.cs"), TrapWriter.CompressionMode.Gzip); - var g1 = TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\trap"), "foo.cs.trap.gz"); - Assert.Equal(f1, g1); - } - - [Fact] - public void TestMultipleSections() - { - File.WriteAllLines("layout.txt", new string[] - { - "# Section 1", - "TRAP_FOLDER=" + Path.GetFullPath("snapshot\\trap1"), - "ODASA_DB=snapshot\\db-csharp", - "SOURCE_ARCHIVE=" + Path.GetFullPath("snapshot\\archive1"), - "ODASA_BUILD_ERROR_DIR=snapshot\build-errors", - "foo.cs", - "# Section 2", - "TRAP_FOLDER=" + Path.GetFullPath("snapshot\\trap2"), - "ODASA_DB=snapshot\\db-csharp", - "SOURCE_ARCHIVE=" + Path.GetFullPath("snapshot\\archive2"), - "ODASA_BUILD_ERROR_DIR=snapshot\build-errors", - "bar.cs", - }); - - var layout = new Semmle.Extraction.Layout(null, null, "layout.txt"); - - // Use Section 2 - Assert.True(layout.FileInLayout(new TransformedPathStub("bar.cs"))); - var subProject = layout.LookupProjectOrNull(new TransformedPathStub("bar.cs")); - Assert.NotNull(subProject); - var f1 = subProject!.GetTrapPath(logger, new TransformedPathStub("bar.cs"), TrapWriter.CompressionMode.Gzip); - var g1 = TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\trap2"), "bar.cs.trap.gz"); - Assert.Equal(f1, g1); - - // Use Section 1 - Assert.True(layout.FileInLayout(new TransformedPathStub("foo.cs"))); - subProject = layout.LookupProjectOrNull(new TransformedPathStub("foo.cs")); - Assert.NotNull(subProject); - var f2 = subProject!.GetTrapPath(logger, new TransformedPathStub("foo.cs"), TrapWriter.CompressionMode.Gzip); - var g2 = TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\trap1"), "foo.cs.trap.gz"); - Assert.Equal(f2, g2); - - // boo.dll is not in the layout, so use layout from first section. - Assert.False(layout.FileInLayout(new TransformedPathStub("boo.dll"))); - var f3 = layout.LookupProjectOrDefault(new TransformedPathStub("boo.dll")).GetTrapPath(logger, new TransformedPathStub("boo.dll"), TrapWriter.CompressionMode.Gzip); - var g3 = TrapWriter.NestPaths(logger, Path.GetFullPath("snapshot\\trap1"), "boo.dll.trap.gz"); - Assert.Equal(f3, g3); - - // boo.cs is not in the layout, so return null - Assert.False(layout.FileInLayout(new TransformedPathStub("boo.cs"))); - Assert.Null(layout.LookupProjectOrNull(new TransformedPathStub("boo.cs"))); - } - - [Fact] - public void MissingLayout() - { - Assert.Throws(() => - new Semmle.Extraction.Layout(null, null, "nosuchfile.txt")); - } - - [Fact] - public void EmptyLayout() - { - File.Create("layout.txt").Close(); - Assert.Throws(() => - new Semmle.Extraction.Layout(null, null, "layout.txt")); - } - - [Fact] - public void InvalidLayout() - { - File.WriteAllLines("layout.txt", new string[] - { - "# Section 1" - }); - - Assert.Throws(() => - new Semmle.Extraction.Layout(null, null, "layout.txt")); - } - - private sealed class LoggerMock : ILogger - { - public void Dispose() { } - - public void Log(Severity s, string text) { } - } - } - - internal static class TrapWriterTestExtensions - { - public static void Emit(this TrapWriter trapFile, string s) - { - trapFile.Emit(new StringTrapEmitter(s)); - } - - private class StringTrapEmitter : ITrapEmitter - { - private readonly string content; - public StringTrapEmitter(string content) - { - this.content = content; - } - - public void EmitTrap(TextWriter trapFile) - { - trapFile.Write(content); - } - } - } -} diff --git a/csharp/extractor/Semmle.Extraction.Tests/Options.cs b/csharp/extractor/Semmle.Extraction.Tests/Options.cs index f9a1c34e563..9b17320fbaa 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Options.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Options.cs @@ -14,7 +14,6 @@ namespace Semmle.Extraction.Tests public OptionsTests() { - Environment.SetEnvironmentVariable("SEMMLE_EXTRACTOR_OPTIONS", ""); Environment.SetEnvironmentVariable("LGTM_INDEX_EXTRACTOR", ""); } @@ -33,6 +32,7 @@ namespace Semmle.Extraction.Tests Assert.False(options.ClrTracer); Assert.False(options.PDB); Assert.False(options.Fast); + Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression); } [Fact] @@ -125,14 +125,14 @@ namespace Semmle.Extraction.Tests [Fact] public void EnvironmentVariables() { - Environment.SetEnvironmentVariable("SEMMLE_EXTRACTOR_OPTIONS", "--cil c"); + Environment.SetEnvironmentVariable("LGTM_INDEX_EXTRACTOR", "--cil c"); options = CSharp.Options.CreateWithEnvironment(new string[] { "a", "b" }); Assert.True(options.CIL); Assert.Equal("a", options.CompilerArguments[0]); Assert.Equal("b", options.CompilerArguments[1]); Assert.Equal("c", options.CompilerArguments[2]); - Environment.SetEnvironmentVariable("SEMMLE_EXTRACTOR_OPTIONS", ""); + Environment.SetEnvironmentVariable("LGTM_INDEX_EXTRACTOR", ""); Environment.SetEnvironmentVariable("LGTM_INDEX_EXTRACTOR", "--nocil"); options = CSharp.Options.CreateWithEnvironment(new string[] { "--cil" }); Assert.False(options.CIL); @@ -205,5 +205,25 @@ namespace Semmle.Extraction.Tests File.Delete(file); } } + + [Fact] + public void CompressionTests() + { + Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "gzip"); + options = CSharp.Options.CreateWithEnvironment(Array.Empty()); + Assert.Equal(TrapWriter.CompressionMode.Gzip, options.TrapCompression); + + Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "brotli"); + options = CSharp.Options.CreateWithEnvironment(Array.Empty()); + Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression); + + Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", "none"); + options = CSharp.Options.CreateWithEnvironment(Array.Empty()); + Assert.Equal(TrapWriter.CompressionMode.None, options.TrapCompression); + + Environment.SetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_TRAP_COMPRESSION", null); + options = CSharp.Options.CreateWithEnvironment(Array.Empty()); + Assert.Equal(TrapWriter.CompressionMode.Brotli, options.TrapCompression); + } } } diff --git a/csharp/extractor/Semmle.Extraction/Layout.cs b/csharp/extractor/Semmle.Extraction/Layout.cs deleted file mode 100644 index 549c49b4fb7..00000000000 --- a/csharp/extractor/Semmle.Extraction/Layout.cs +++ /dev/null @@ -1,204 +0,0 @@ -using Semmle.Util.Logging; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Semmle.Extraction -{ - /// - /// An extractor layout file. - /// Represents the layout of projects into trap folders and source archives. - /// - public sealed class Layout - { - /// - /// Exception thrown when the layout file is invalid. - /// - public class InvalidLayoutException : Exception - { - public InvalidLayoutException(string file, string message) : - base("ODASA_CSHARP_LAYOUT " + file + " " + message) - { - } - } - - /// - /// List of blocks in the layout file. - /// - private readonly List blocks; - - /// - /// A subproject in the layout file. - /// - public class SubProject - { - /// - /// The trap folder, or null for current directory. - /// - public string? TRAP_FOLDER { get; } - - /// - /// The source archive, or null to skip. - /// - public string? SOURCE_ARCHIVE { get; } - - public SubProject(string? traps, string? archive) - { - TRAP_FOLDER = traps; - SOURCE_ARCHIVE = archive; - } - - /// - /// Gets the name of the trap file for a given source/assembly file. - /// - /// The source file. - /// The full filepath of the trap file. - public string GetTrapPath(ILogger logger, PathTransformer.ITransformedPath srcFile, TrapWriter.CompressionMode trapCompression) => - TrapWriter.TrapPath(logger, TRAP_FOLDER, srcFile, trapCompression); - - /// - /// Creates a trap writer for a given source/assembly file. - /// - /// The source file. - /// A newly created TrapWriter. - public TrapWriter CreateTrapWriter(ILogger logger, PathTransformer.ITransformedPath srcFile, TrapWriter.CompressionMode trapCompression, bool discardDuplicates) => - new TrapWriter(logger, srcFile, TRAP_FOLDER, SOURCE_ARCHIVE, trapCompression, discardDuplicates); - } - - private readonly SubProject defaultProject; - - /// - /// Finds the suitable directories for a given source file. - /// Returns null if not included in the layout. - /// - /// The file to look up. - /// The relevant subproject, or null if not found. - public SubProject? LookupProjectOrNull(PathTransformer.ITransformedPath sourceFile) - { - if (!useLayoutFile) - return defaultProject; - - return blocks - .Where(block => block.Matches(sourceFile)) - .Select(block => block.Directories) - .FirstOrDefault(); - } - - /// - /// Finds the suitable directories for a given source file. - /// Returns the default project if not included in the layout. - /// - /// The file to look up. - /// The relevant subproject, or DefaultProject if not found. - public SubProject LookupProjectOrDefault(PathTransformer.ITransformedPath sourceFile) - { - return LookupProjectOrNull(sourceFile) ?? defaultProject; - } - - private readonly bool useLayoutFile; - - /// - /// Default constructor reads parameters from the environment. - /// - public Layout() : this( - Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_TRAP_DIR") ?? Environment.GetEnvironmentVariable("TRAP_FOLDER"), - Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR") ?? Environment.GetEnvironmentVariable("SOURCE_ARCHIVE"), - Environment.GetEnvironmentVariable("ODASA_CSHARP_LAYOUT")) - { - } - - /// - /// Creates the project layout. Reads the layout file if specified. - /// - /// Directory for trap files, or null to use layout/current directory. - /// Directory for source archive, or null for layout/no archive. - /// Path of layout file, or null for no layout. - /// Failed to read layout file. - public Layout(string? traps, string? archive, string? layout) - { - useLayoutFile = string.IsNullOrEmpty(traps) && !string.IsNullOrEmpty(layout); - blocks = new List(); - - if (useLayoutFile) - { - ReadLayoutFile(layout!); - defaultProject = blocks[0].Directories; - } - else - { - defaultProject = new SubProject(traps, archive); - } - } - - /// - /// Is the source file included in the layout? - /// - /// The absolute path of the file to query. - /// True iff there is no layout file or the layout file specifies the file. - public bool FileInLayout(PathTransformer.ITransformedPath path) => LookupProjectOrNull(path) is not null; - - private void ReadLayoutFile(string layout) - { - try - { - var lines = File.ReadAllLines(layout); - - var i = 0; - while (!lines[i].StartsWith("#")) - i++; - while (i < lines.Length) - { - var block = new LayoutBlock(lines, ref i); - blocks.Add(block); - } - - if (blocks.Count == 0) - throw new InvalidLayoutException(layout, "contains no blocks"); - } - catch (IOException ex) - { - throw new InvalidLayoutException(layout, ex.Message); - } - catch (IndexOutOfRangeException) - { - throw new InvalidLayoutException(layout, "is invalid"); - } - } - } - - internal sealed class LayoutBlock - { - private readonly List filePatterns = new List(); - - public Layout.SubProject Directories { get; } - - private static string? ReadVariable(string name, string line) - { - var prefix = name + "="; - if (!line.StartsWith(prefix)) - return null; - return line.Substring(prefix.Length).Trim(); - } - - public LayoutBlock(string[] lines, ref int i) - { - // first line: #name - i++; - var trapFolder = ReadVariable("TRAP_FOLDER", lines[i++]); - // Don't care about ODASA_DB. - ReadVariable("ODASA_DB", lines[i++]); - var sourceArchive = ReadVariable("SOURCE_ARCHIVE", lines[i++]); - - Directories = new Layout.SubProject(trapFolder, sourceArchive); - // Don't care about ODASA_BUILD_ERROR_DIR. - ReadVariable("ODASA_BUILD_ERROR_DIR", lines[i++]); - while (i < lines.Length && !lines[i].StartsWith("#")) - { - filePatterns.Add(new FilePattern(lines[i++])); - } - } - - public bool Matches(PathTransformer.ITransformedPath path) => FilePattern.Matches(filePatterns, path.Value, out var _); - } -} diff --git a/csharp/extractor/Semmle.Extraction/Options.cs b/csharp/extractor/Semmle.Extraction/Options.cs index 6195b498ba9..bef37be1d45 100644 --- a/csharp/extractor/Semmle.Extraction/Options.cs +++ b/csharp/extractor/Semmle.Extraction/Options.cs @@ -1,3 +1,4 @@ +using System; using Semmle.Util.Logging; using Semmle.Util; @@ -49,10 +50,11 @@ namespace Semmle.Extraction /// public bool QlTest { get; private set; } = false; + /// /// The compression algorithm used for trap files. /// - public TrapWriter.CompressionMode TrapCompression { get; set; } = TrapWriter.CompressionMode.Brotli; + public TrapWriter.CompressionMode TrapCompression { get; private set; } = TrapWriter.CompressionMode.Brotli; public virtual bool HandleOption(string key, string value) { @@ -64,6 +66,13 @@ namespace Semmle.Extraction case "verbosity": Verbosity = (Verbosity)int.Parse(value); return true; + case "trap_compression": + if (Enum.TryParse(value, true, out var mode)) + { + TrapCompression = mode; + return true; + } + return false; default: return false; } @@ -102,9 +111,6 @@ namespace Semmle.Extraction case "qltest": QlTest = value; return true; - case "brotli": - TrapCompression = value ? TrapWriter.CompressionMode.Brotli : TrapWriter.CompressionMode.Gzip; - return true; default: return false; } diff --git a/csharp/extractor/Semmle.Extraction/PathTransformer.cs b/csharp/extractor/Semmle.Extraction/PathTransformer.cs index 4611e079454..7e4ce24bdc6 100644 --- a/csharp/extractor/Semmle.Extraction/PathTransformer.cs +++ b/csharp/extractor/Semmle.Extraction/PathTransformer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Diagnostics.CodeAnalysis; using Semmle.Util; +using Semmle.Util.Logging; namespace Semmle.Extraction { @@ -35,6 +36,20 @@ namespace Semmle.Extraction ITransformedPath WithSuffix(string suffix); string DatabaseId { get; } + + /// + /// Gets the name of the trap file for this file. + /// + /// The full filepath of the trap file. + public string GetTrapPath(ILogger logger, TrapWriter.CompressionMode trapCompression) => + TrapWriter.TrapPath(logger, Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"), this, trapCompression); + + /// + /// Creates a trap writer for this file. + /// + /// A newly created TrapWriter. + public TrapWriter CreateTrapWriter(ILogger logger, TrapWriter.CompressionMode trapCompression, bool discardDuplicates) => + new(logger, this, Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"), Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"), trapCompression, discardDuplicates); } private struct TransformedPath : ITransformedPath diff --git a/csharp/extractor/Semmle.Util/CanonicalPathCache.cs b/csharp/extractor/Semmle.Util/CanonicalPathCache.cs index 1288cf6d7b6..9b56d3e4f1f 100644 --- a/csharp/extractor/Semmle.Util/CanonicalPathCache.cs +++ b/csharp/extractor/Semmle.Util/CanonicalPathCache.cs @@ -234,9 +234,7 @@ namespace Semmle.Util /// A new CanonicalPathCache. public static CanonicalPathCache Create(ILogger logger, int maxCapacity) { - var preserveSymlinks = - Environment.GetEnvironmentVariable("CODEQL_PRESERVE_SYMLINKS") == "true" || - Environment.GetEnvironmentVariable("SEMMLE_PRESERVE_SYMLINKS") == "true"; + var preserveSymlinks = Environment.GetEnvironmentVariable("CODEQL_PRESERVE_SYMLINKS") == "true"; return Create(logger, maxCapacity, preserveSymlinks ? CanonicalPathCache.Symlinks.Preserve : CanonicalPathCache.Symlinks.Follow); } diff --git a/csharp/extractor/Semmle.Util/CommandLineOptions.cs b/csharp/extractor/Semmle.Util/CommandLineOptions.cs index 8f148219ce4..5531155d5be 100644 --- a/csharp/extractor/Semmle.Util/CommandLineOptions.cs +++ b/csharp/extractor/Semmle.Util/CommandLineOptions.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace Semmle.Util @@ -39,8 +40,26 @@ namespace Semmle.Util public static class OptionsExtensions { - public static void ParseArguments(this ICommandLineOptions options, IReadOnlyList arguments) + private static string? GetExtractorOption(string name) => + Environment.GetEnvironmentVariable($"CODEQL_EXTRACTOR_CSHARP_OPTION_{name.ToUpper()}"); + + private static List GetExtractorOptions() { + var extractorOptions = new List(); + + var trapCompression = GetExtractorOption("trap_compression"); + if (!string.IsNullOrEmpty(trapCompression)) + { + extractorOptions.Add($"--trap_compression:{trapCompression}"); + } + + return extractorOptions; + } + + public static void ParseArguments(this ICommandLineOptions options, IReadOnlyList providedArguments) + { + var arguments = GetExtractorOptions(); + arguments.AddRange(providedArguments); for (var i = 0; i < arguments.Count; ++i) { var arg = arguments[i]; diff --git a/csharp/extractor/Semmle.Util/Logger.cs b/csharp/extractor/Semmle.Util/Logger.cs index 5307ad0fcd9..1182046f693 100644 --- a/csharp/extractor/Semmle.Util/Logger.cs +++ b/csharp/extractor/Semmle.Util/Logger.cs @@ -74,7 +74,7 @@ namespace Semmle.Util.Logging } catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] { - Console.Error.WriteLine("SEMMLE: Couldn't initialise C# extractor output: " + ex.Message + "\n" + ex.StackTrace); + Console.Error.WriteLine("CodeQL: Couldn't initialise C# extractor output: " + ex.Message + "\n" + ex.StackTrace); Console.Error.Flush(); throw; } diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index e6ee473d395..a3b06b075db 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,17 @@ +## 1.1.2 + +## 1.1.1 + +## 1.1.0 + +## 1.0.7 + +## 1.0.6 + +## 1.0.5 + +## 1.0.4 + ## 1.0.3 ## 1.0.2 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md new file mode 100644 index 00000000000..8f1e57bce59 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md @@ -0,0 +1 @@ +## 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.5.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.5.md new file mode 100644 index 00000000000..ac0f13f1f5e --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.5.md @@ -0,0 +1 @@ +## 1.0.5 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.6.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.6.md new file mode 100644 index 00000000000..60834c3f336 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.6.md @@ -0,0 +1 @@ +## 1.0.6 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.7.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.7.md new file mode 100644 index 00000000000..2520d204eb2 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.7.md @@ -0,0 +1 @@ +## 1.0.7 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.0.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.0.md new file mode 100644 index 00000000000..57af6ca9886 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.0.md @@ -0,0 +1 @@ +## 1.1.0 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.1.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.1.md new file mode 100644 index 00000000000..bf5d722f884 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.1.md @@ -0,0 +1 @@ +## 1.1.1 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.2.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.2.md new file mode 100644 index 00000000000..a948ef6c11d --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.1.2.md @@ -0,0 +1 @@ +## 1.1.2 diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 06fa75b96cb..53ab127707f 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.0.3 +lastReleaseVersion: 1.1.2 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 7c9df44253c..ef0192e094a 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,8 +1,8 @@ name: codeql/csharp-solorigate-all -version: 1.0.4-dev +version: 1.1.3-dev groups: - csharp - solorigate library: true dependencies: - codeql/csharp-all: ~0.0.3 + codeql/csharp-all: "*" diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index e6ee473d395..a3b06b075db 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,17 @@ +## 1.1.2 + +## 1.1.1 + +## 1.1.0 + +## 1.0.7 + +## 1.0.6 + +## 1.0.5 + +## 1.0.4 + ## 1.0.3 ## 1.0.2 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md new file mode 100644 index 00000000000..8f1e57bce59 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md @@ -0,0 +1 @@ +## 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.5.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.5.md new file mode 100644 index 00000000000..ac0f13f1f5e --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.5.md @@ -0,0 +1 @@ +## 1.0.5 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.6.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.6.md new file mode 100644 index 00000000000..60834c3f336 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.6.md @@ -0,0 +1 @@ +## 1.0.6 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.7.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.7.md new file mode 100644 index 00000000000..2520d204eb2 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.7.md @@ -0,0 +1 @@ +## 1.0.7 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.0.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.0.md new file mode 100644 index 00000000000..57af6ca9886 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.0.md @@ -0,0 +1 @@ +## 1.1.0 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.1.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.1.md new file mode 100644 index 00000000000..bf5d722f884 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.1.md @@ -0,0 +1 @@ +## 1.1.1 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.2.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.2.md new file mode 100644 index 00000000000..a948ef6c11d --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.1.2.md @@ -0,0 +1 @@ +## 1.1.2 diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 06fa75b96cb..53ab127707f 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.0.3 +lastReleaseVersion: 1.1.2 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 45e39cb9a9d..d3d0baabf19 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,9 +1,9 @@ name: codeql/csharp-solorigate-queries -version: 1.0.4-dev +version: 1.1.3-dev groups: - csharp - solorigate defaultSuiteFile: codeql-suites/solorigate.qls dependencies: - codeql/csharp-all: ~0.0.3 - codeql/csharp-solorigate-all: ^1.0 + codeql/csharp-all: "*" + codeql/csharp-solorigate-all: "*" diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 761175ca743..17252098beb 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,58 @@ +## 0.2.1 + +## 0.2.0 + +### Breaking Changes + +* The signature of `allowImplicitRead` on `DataFlow::Configuration` and `TaintTracking::Configuration` has changed from `allowImplicitRead(DataFlow::Node node, DataFlow::Content c)` to `allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c)`. + +## 0.1.0 + +### Breaking Changes + +* The recently added flow-state versions of `isBarrierIn`, `isBarrierOut`, `isSanitizerIn`, and `isSanitizerOut` in the data flow and taint tracking libraries have been removed. + +## 0.0.13 + +## 0.0.12 + +### Breaking Changes + +* The flow state variants of `isBarrier` and `isAdditionalFlowStep` are no longer exposed in the taint tracking library. The `isSanitizer` and `isAdditionalTaintStep` predicates should be used instead. + +### Deprecated APIs + +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. + The old name still exists as a deprecated alias. + +### New Features + +* The data flow and taint tracking libraries have been extended with versions of `isBarrierIn`, `isBarrierOut`, and `isBarrierGuard`, respectively `isSanitizerIn`, `isSanitizerOut`, and `isSanitizerGuard`, that support flow states. + +### Minor Analysis Improvements + +* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted. + +## 0.0.11 + +### Breaking Changes + +* The C# extractor no longer supports the following legacy environment variables: +``` +ODASA_BUILD_ERROR_DIR +ODASA_CSHARP_LAYOUT +ODASA_SNAPSHOT +SEMMLE_DIST +SEMMLE_EXTRACTOR_OPTIONS +SEMMLE_PLATFORM_TOOLS +SEMMLE_PRESERVE_SYMLINKS +SOURCE_ARCHIVE +TRAP_FOLDER +``` +* `codeql test run` now extracts source code recursively from sub folders. This may break existing tests that have other tests in nested sub folders, as those will now get the nested test code included. + +## 0.0.10 + ## 0.0.9 ### Major Analysis Improvements diff --git a/csharp/ql/lib/change-notes/released/0.0.10.md b/csharp/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..979029c0162 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1 @@ +## 0.0.10 diff --git a/csharp/ql/lib/change-notes/released/0.0.11.md b/csharp/ql/lib/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..fb37f9e3758 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.11.md @@ -0,0 +1,17 @@ +## 0.0.11 + +### Breaking Changes + +* The C# extractor no longer supports the following legacy environment variables: +``` +ODASA_BUILD_ERROR_DIR +ODASA_CSHARP_LAYOUT +ODASA_SNAPSHOT +SEMMLE_DIST +SEMMLE_EXTRACTOR_OPTIONS +SEMMLE_PLATFORM_TOOLS +SEMMLE_PRESERVE_SYMLINKS +SOURCE_ARCHIVE +TRAP_FOLDER +``` +* `codeql test run` now extracts source code recursively from sub folders. This may break existing tests that have other tests in nested sub folders, as those will now get the nested test code included. diff --git a/csharp/ql/lib/change-notes/released/0.0.12.md b/csharp/ql/lib/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..2be5a554dbb --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.12.md @@ -0,0 +1,18 @@ +## 0.0.12 + +### Breaking Changes + +* The flow state variants of `isBarrier` and `isAdditionalFlowStep` are no longer exposed in the taint tracking library. The `isSanitizer` and `isAdditionalTaintStep` predicates should be used instead. + +### Deprecated APIs + +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. + The old name still exists as a deprecated alias. + +### New Features + +* The data flow and taint tracking libraries have been extended with versions of `isBarrierIn`, `isBarrierOut`, and `isBarrierGuard`, respectively `isSanitizerIn`, `isSanitizerOut`, and `isSanitizerGuard`, that support flow states. + +### Minor Analysis Improvements + +* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted. diff --git a/csharp/ql/lib/change-notes/released/0.0.13.md b/csharp/ql/lib/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..30ff8ab8dd0 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.13.md @@ -0,0 +1 @@ +## 0.0.13 diff --git a/csharp/ql/lib/change-notes/released/0.1.0.md b/csharp/ql/lib/change-notes/released/0.1.0.md new file mode 100644 index 00000000000..e488a4f757e --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.1.0.md @@ -0,0 +1,5 @@ +## 0.1.0 + +### Breaking Changes + +* The recently added flow-state versions of `isBarrierIn`, `isBarrierOut`, `isSanitizerIn`, and `isSanitizerOut` in the data flow and taint tracking libraries have been removed. diff --git a/csharp/ql/lib/change-notes/released/0.2.0.md b/csharp/ql/lib/change-notes/released/0.2.0.md new file mode 100644 index 00000000000..7ccf56ddd47 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.2.0.md @@ -0,0 +1,5 @@ +## 0.2.0 + +### Breaking Changes + +* The signature of `allowImplicitRead` on `DataFlow::Configuration` and `TaintTracking::Configuration` has changed from `allowImplicitRead(DataFlow::Node node, DataFlow::Content c)` to `allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c)`. diff --git a/csharp/ql/lib/change-notes/released/0.2.1.md b/csharp/ql/lib/change-notes/released/0.2.1.md new file mode 100644 index 00000000000..c260de2a9ee --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.2.1.md @@ -0,0 +1 @@ +## 0.2.1 diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index ecdd64fbab8..df29a726bcc 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.9 +lastReleaseVersion: 0.2.1 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index e38e027bbb9..2b91ac08704 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.0.10-dev +version: 0.2.2-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/asp/WebConfig.qll b/csharp/ql/lib/semmle/code/asp/WebConfig.qll index 16d5393afc2..024d60ca450 100644 --- a/csharp/ql/lib/semmle/code/asp/WebConfig.qll +++ b/csharp/ql/lib/semmle/code/asp/WebConfig.qll @@ -7,67 +7,88 @@ import csharp /** * A `Web.config` file. */ -class WebConfigXML extends XMLFile { - WebConfigXML() { this.getName().matches("%Web.config") } +class WebConfigXml extends XMLFile { + WebConfigXml() { this.getName().matches("%Web.config") } } +/** DEPRECATED: Alias for WebConfigXml */ +deprecated class WebConfigXML = WebConfigXml; + /** A `` tag in an ASP.NET configuration file. */ -class ConfigurationXMLElement extends XMLElement { - ConfigurationXMLElement() { this.getName().toLowerCase() = "configuration" } +class ConfigurationXmlElement extends XMLElement { + ConfigurationXmlElement() { this.getName().toLowerCase() = "configuration" } } +/** DEPRECATED: Alias for ConfigurationXmlElement */ +deprecated class ConfigurationXMLElement = ConfigurationXmlElement; + /** A `` tag in an ASP.NET configuration file. */ -class LocationXMLElement extends XMLElement { - LocationXMLElement() { - this.getParent() instanceof ConfigurationXMLElement and +class LocationXmlElement extends XMLElement { + LocationXmlElement() { + this.getParent() instanceof ConfigurationXmlElement and this.getName().toLowerCase() = "location" } } +/** DEPRECATED: Alias for LocationXmlElement */ +deprecated class LocationXMLElement = LocationXmlElement; + /** A `` tag in an ASP.NET configuration file. */ -class SystemWebXMLElement extends XMLElement { - SystemWebXMLElement() { +class SystemWebXmlElement extends XMLElement { + SystemWebXmlElement() { ( - this.getParent() instanceof ConfigurationXMLElement + this.getParent() instanceof ConfigurationXmlElement or - this.getParent() instanceof LocationXMLElement + this.getParent() instanceof LocationXmlElement ) and this.getName().toLowerCase() = "system.web" } } +/** DEPRECATED: Alias for SystemWebXmlElement */ +deprecated class SystemWebXMLElement = SystemWebXmlElement; + /** A `` tag in an ASP.NET configuration file. */ -class SystemWebServerXMLElement extends XMLElement { - SystemWebServerXMLElement() { +class SystemWebServerXmlElement extends XMLElement { + SystemWebServerXmlElement() { ( - this.getParent() instanceof ConfigurationXMLElement + this.getParent() instanceof ConfigurationXmlElement or - this.getParent() instanceof LocationXMLElement + this.getParent() instanceof LocationXmlElement ) and this.getName().toLowerCase() = "system.webserver" } } +/** DEPRECATED: Alias for SystemWebServerXmlElement */ +deprecated class SystemWebServerXMLElement = SystemWebServerXmlElement; + /** A `` tag in an ASP.NET configuration file. */ -class CustomErrorsXMLElement extends XMLElement { - CustomErrorsXMLElement() { - this.getParent() instanceof SystemWebXMLElement and +class CustomErrorsXmlElement extends XMLElement { + CustomErrorsXmlElement() { + this.getParent() instanceof SystemWebXmlElement and this.getName().toLowerCase() = "customerrors" } } +/** DEPRECATED: Alias for CustomErrorsXmlElement */ +deprecated class CustomErrorsXMLElement = CustomErrorsXmlElement; + /** A `` tag in an ASP.NET configuration file. */ -class HttpRuntimeXMLElement extends XMLElement { - HttpRuntimeXMLElement() { - this.getParent() instanceof SystemWebXMLElement and +class HttpRuntimeXmlElement extends XMLElement { + HttpRuntimeXmlElement() { + this.getParent() instanceof SystemWebXmlElement and this.getName().toLowerCase() = "httpruntime" } } +/** DEPRECATED: Alias for HttpRuntimeXmlElement */ +deprecated class HttpRuntimeXMLElement = HttpRuntimeXmlElement; + /** A `` tag under `` in an ASP.NET configuration file. */ class FormsElement extends XMLElement { FormsElement() { - this = any(SystemWebXMLElement sw).getAChild("authentication").getAChild("forms") + this = any(SystemWebXmlElement sw).getAChild("authentication").getAChild("forms") } /** @@ -85,7 +106,7 @@ class FormsElement extends XMLElement { /** A `` tag in an ASP.NET configuration file. */ class HttpCookiesElement extends XMLElement { - HttpCookiesElement() { this = any(SystemWebXMLElement sw).getAChild("httpCookies") } + HttpCookiesElement() { this = any(SystemWebXmlElement sw).getAChild("httpCookies") } /** * Gets attribute's `httpOnlyCookies` value. diff --git a/csharp/ql/lib/semmle/code/cil/Declaration.qll b/csharp/ql/lib/semmle/code/cil/Declaration.qll index 178b5c9966e..9d35eeba9f9 100644 --- a/csharp/ql/lib/semmle/code/cil/Declaration.qll +++ b/csharp/ql/lib/semmle/code/cil/Declaration.qll @@ -23,13 +23,6 @@ class Declaration extends DotNet::Declaration, Element, @cil_declaration { } override Declaration getUnboundDeclaration() { result = this } - - /** - * DEPRECATED: Use `isUnboundDeclaration()` instead. - * - * Holds if this declaration is a source declaration. - */ - deprecated final predicate isSourceDeclaration() { this.isUnboundDeclaration() } } private CS::Declaration toCSharpNonTypeParameter(Declaration d) { result.matchesHandle(d) } diff --git a/csharp/ql/lib/semmle/code/cil/Instructions.qll b/csharp/ql/lib/semmle/code/cil/Instructions.qll index 370a91d8343..91bc1f37ea6 100644 --- a/csharp/ql/lib/semmle/code/cil/Instructions.qll +++ b/csharp/ql/lib/semmle/code/cil/Instructions.qll @@ -491,7 +491,7 @@ module Opcodes { override Callable getTarget() { none() } - /** Gets the function pointer type targetted by this instruction. */ + /** Gets the function pointer type targeted by this instruction. */ FunctionPointerType getTargetType() { cil_access(this, result) } // The number of items popped/pushed from the stack depends on the target of diff --git a/csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll index 19bf1d4f27d..eed0d050735 100644 --- a/csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll +++ b/csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll @@ -287,20 +287,6 @@ private module SsaDefReaches { ) } - /** - * Holds if the SSA definition of `v` at `def` reaches uncertain SSA definition - * `redef` in the same basic block, without crossing another SSA definition of `v`. - */ - predicate ssaDefReachesUncertainDefWithinBlock( - SourceVariable v, Definition def, UncertainWriteDefinition redef - ) { - exists(BasicBlock bb, int rnk, int i | - ssaDefReachesRank(bb, def, rnk, v) and - rnk = ssaRefRank(bb, i, v, SsaDef()) - 1 and - redef.definesAt(v, bb, i) - ) - } - /** * Same as `ssaRefRank()`, but restricted to a particular SSA definition `def`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index 41641a9d032..b403d201266 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -64,11 +64,6 @@ class Callable extends DotNet::Callable, Parameterizable, ExprOrStmtParent, @cal result = this.getExpressionBody() } - /** - * DEPRECATED: Use `getBody()` instead. - */ - deprecated final ControlFlowElement getABody() { result = this.getBody() } - override predicate hasBody() { exists(this.getBody()) } /** @@ -151,11 +146,6 @@ class Callable extends DotNet::Callable, Parameterizable, ExprOrStmtParent, @cal not result = this.(Constructor).getInitializer() } - /** - * DEPRECATED: Use `getExpressionBody()` instead. - */ - deprecated final Expr getAnExpressionBody() { result = this.getExpressionBody() } - /** Holds if this callable has an expression body. */ final predicate hasExpressionBody() { exists(this.getExpressionBody()) } @@ -470,6 +460,11 @@ class Operator extends Callable, Member, Attributable, @operator { override string toString() { result = Callable.super.toString() } override Parameter getRawParameter(int i) { result = this.getParameter(i) } + + override predicate hasQualifiedName(string qualifier, string name) { + super.hasQualifiedName(qualifier, _) and + name = this.getFunctionName() + } } /** A clone method on a record. */ diff --git a/csharp/ql/lib/semmle/code/csharp/Comments.qll b/csharp/ql/lib/semmle/code/csharp/Comments.qll index 9a611b851e8..e4070ec48ca 100644 --- a/csharp/ql/lib/semmle/code/csharp/Comments.qll +++ b/csharp/ql/lib/semmle/code/csharp/Comments.qll @@ -11,7 +11,7 @@ import Location /** * A single line of comment. * - * Either a single line comment (`SinglelineComment`), an XML comment (`XmlComment`), + * Either a single line comment (`SinglelineComment`), an XML comment (`XmlCommentLine`), * or a line in a multi-line comment (`MultilineComment`). */ class CommentLine extends @commentline { @@ -66,7 +66,7 @@ class MultilineComment extends CommentLine, @multilinecomment { * /// * ``` */ -class XmlComment extends CommentLine, @xmldoccomment { +class XmlCommentLine extends CommentLine, @xmldoccomment { override string toString() { result = "/// ..." } private string xmlAttributeRegex() { @@ -196,7 +196,7 @@ class CommentBlock extends @commentblock { /** Holds if this block consists entirely of XML comments. */ predicate isXmlCommentBlock() { - forall(CommentLine l | l = getAChild() | l instanceof XmlComment) + forall(CommentLine l | l = getAChild() | l instanceof XmlCommentLine) } /** Gets a `CommentLine` containing text. */ diff --git a/csharp/ql/lib/semmle/code/csharp/Member.qll b/csharp/ql/lib/semmle/code/csharp/Member.qll index 01a19ff87e0..ad314217024 100644 --- a/csharp/ql/lib/semmle/code/csharp/Member.qll +++ b/csharp/ql/lib/semmle/code/csharp/Member.qll @@ -117,7 +117,7 @@ class Modifiable extends Declaration, @modifiable { * Note that explicit interface implementations are also considered effectively * `private` if the implemented interface is itself effectively `private`. Finally, * `private protected` members are not considered effectively `private`, because - * they can be overriden within the declaring assembly. + * they can be overridden within the declaring assembly. */ predicate isEffectivelyPrivate() { this.isReallyPrivate() or @@ -143,7 +143,7 @@ class Modifiable extends Declaration, @modifiable { * considered. Explicit interface implementations are also considered effectively * `internal` if the implemented interface is itself effectively `internal`. Finally, * `internal protected` members are not considered effectively `internal`, because - * they can be overriden outside the declaring assembly. + * they can be overridden outside the declaring assembly. */ predicate isEffectivelyInternal() { this.isReallyInternal() or diff --git a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll index a3d36fba69d..d179da2e194 100644 --- a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll +++ b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll @@ -265,7 +265,7 @@ class TypeMentionNode extends PrintAstNode, TTypeMentionNode { final TypeMention getTypeMention() { result = typeMention } /** - * Gets the `Element` targetted by the `TypeMention`. + * Gets the `Element` targeted by the `TypeMention`. */ final Element getTarget() { result = typeMention.getTarget() } diff --git a/csharp/ql/lib/semmle/code/csharp/Unification.qll b/csharp/ql/lib/semmle/code/csharp/Unification.qll index ae2ee5a2e49..4df258c1d00 100644 --- a/csharp/ql/lib/semmle/code/csharp/Unification.qll +++ b/csharp/ql/lib/semmle/code/csharp/Unification.qll @@ -672,7 +672,7 @@ module Unification { * `ConstrainedTypeParameter::unifiable()` can be used. * * - * For performance reasons, type paramater constraints inside `t1` and `t2` are + * For performance reasons, type parameter constraints inside `t1` and `t2` are * *not* taken into account, and there is also no guarantee that the same type * parameter can be substituted with two different terms. For example, in * diff --git a/csharp/ql/lib/semmle/code/csharp/XML.qll b/csharp/ql/lib/semmle/code/csharp/XML.qll index dc76884b73c..fb781a4683f 100755 --- a/csharp/ql/lib/semmle/code/csharp/XML.qll +++ b/csharp/ql/lib/semmle/code/csharp/XML.qll @@ -4,21 +4,14 @@ import semmle.files.FileSystem -private class TXMLLocatable = +private class TXmlLocatable = @xmldtd or @xmlelement or @xmlattribute or @xmlnamespace or @xmlcomment or @xmlcharacters; /** An XML element that has a location. */ -class XMLLocatable extends @xmllocatable, TXMLLocatable { +class XMLLocatable extends @xmllocatable, TXmlLocatable { /** Gets the source location for this element. */ Location getLocation() { xmllocations(this, result) } - /** - * DEPRECATED: Use `getLocation()` instead. - * - * Gets the source location for this element. - */ - deprecated Location getALocation() { result = this.getLocation() } - /** * Holds if this element is at the specified location. * The location spans column `startcolumn` of line `startline` to @@ -83,21 +76,6 @@ class XMLParent extends @xmlparent { /** Gets the number of places in the body of this XML parent where text occurs. */ int getNumberOfCharacterSets() { result = count(int pos | xmlChars(_, _, this, pos, _, _)) } - /** - * DEPRECATED: Internal. - * - * Append the character sequences of this XML parent from left to right, separated by a space, - * up to a specified (zero-based) index. - */ - deprecated string charsSetUpTo(int n) { - n = 0 and xmlChars(_, result, this, 0, _, _) - or - n > 0 and - exists(string chars | xmlChars(_, chars, this, n, _, _) | - result = this.charsSetUpTo(n - 1) + " " + chars - ) - } - /** * Gets the result of appending all the character sequences of this XML parent from * left to right, separated by a space. diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll b/csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll index 4f364147395..df8ae6ea6ed 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll @@ -59,13 +59,6 @@ abstract class AssertMethod extends Method { /** Gets the failure type if the assertion fails for argument `i`, if any. */ abstract AssertionFailure getAssertionFailure(int i); - - /** - * DEPRECATED: Use `getAssertionFailure(_)` instead. - * - * Gets the exception being thrown if the assertion fails, if any. - */ - deprecated final Class getExceptionClass() { this.getAssertionFailure(_).isException(result) } } /** A Boolean assertion method. */ @@ -76,34 +69,6 @@ abstract class BooleanAssertMethod extends AssertMethod { override int getAnAssertionIndex() { result = this.getAnAssertionIndex(_) } } -/** A positive assertion method. */ -deprecated class AssertTrueMethod extends AssertMethod { - private BooleanAssertMethod m; - - AssertTrueMethod() { - this = m and - exists(m.getAnAssertionIndex(true)) - } - - final override int getAnAssertionIndex() { result = m.getAnAssertionIndex() } - - final override AssertionFailure getAssertionFailure(int i) { result = m.getAssertionFailure(i) } -} - -/** A negated assertion method. */ -deprecated class AssertFalseMethod extends AssertMethod { - private BooleanAssertMethod m; - - AssertFalseMethod() { - this = m and - exists(m.getAnAssertionIndex(false)) - } - - final override int getAnAssertionIndex() { result = m.getAnAssertionIndex() } - - final override AssertionFailure getAssertionFailure(int i) { result = m.getAssertionFailure(i) } -} - /** A nullness assertion method. */ abstract class NullnessAssertMethod extends AssertMethod { /** @@ -115,34 +80,6 @@ abstract class NullnessAssertMethod extends AssertMethod { override int getAnAssertionIndex() { result = this.getAnAssertionIndex(_) } } -/** A `null` assertion method. */ -deprecated class AssertNullMethod extends AssertMethod { - private NullnessAssertMethod m; - - AssertNullMethod() { - this = m and - exists(m.getAnAssertionIndex(true)) - } - - final override int getAnAssertionIndex() { result = m.getAnAssertionIndex() } - - final override AssertionFailure getAssertionFailure(int i) { result = m.getAssertionFailure(i) } -} - -/** A non-`null` assertion method. */ -deprecated class AssertNonNullMethod extends AssertMethod { - private NullnessAssertMethod m; - - AssertNonNullMethod() { - this = m and - exists(m.getAnAssertionIndex(false)) - } - - final override int getAnAssertionIndex() { result = m.getAnAssertionIndex() } - - final override AssertionFailure getAssertionFailure(int i) { result = m.getAssertionFailure(i) } -} - /** An assertion, that is, a call to an assertion method. */ class Assertion extends MethodCall { private AssertMethod target; @@ -160,108 +97,6 @@ class Assertion extends MethodCall { result = this.getArgumentForParameter(p) ) } - - /** - * DEPRECATED: Use `getExpr(_)` instead. - * - * Gets an expression that this assertion pertains to. - */ - deprecated Expr getExpr() { result = this.getExpr(_) } - - /** - * Holds if basic block `succ` is immediately dominated by this assertion. - * That is, `succ` can only be reached from the callable entry point by - * going via *some* basic block `pred` containing this assertion, and `pred` - * is an immediate predecessor of `succ`. - * - * Moreover, this assertion corresponds to multiple control flow nodes, - * which is why - * - * ```ql - * exists(BasicBlock bb | - * bb.getANode() = this.getAControlFlowNode() | - * bb.immediatelyDominates(succ) - * ) - * ``` - * - * does not work. - */ - pragma[nomagic] - deprecated private predicate immediatelyDominatesBlockSplit(BasicBlock succ) { - // Only calculate dominance by explicit recursion for split nodes; - // all other nodes can use regular CFG dominance - this instanceof SplitControlFlowElement and - exists(BasicBlock bb | bb.getANode() = this.getAControlFlowNode() | - succ = bb.getASuccessor() and - forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != bb | - succ.dominates(pred) - or - // `pred` might be another split of this element - pred.getANode().getElement() = this - ) - ) - } - - pragma[noinline] - deprecated private predicate strictlyDominatesJoinBlockPredecessor(JoinBlock jb, int i) { - this.strictlyDominatesSplit(jb.getJoinBlockPredecessor(i)) - } - - deprecated private predicate strictlyDominatesJoinBlockSplit(JoinBlock jb, int i) { - i = -1 and - this.strictlyDominatesJoinBlockPredecessor(jb, _) - or - this.strictlyDominatesJoinBlockSplit(jb, i - 1) and - ( - this.strictlyDominatesJoinBlockPredecessor(jb, i) - or - this.getAControlFlowNode().getBasicBlock() = jb.getJoinBlockPredecessor(i) - ) - } - - pragma[nomagic] - deprecated private predicate strictlyDominatesSplit(BasicBlock bb) { - this.immediatelyDominatesBlockSplit(bb) - or - // Equivalent with - // - // ```ql - // exists(JoinBlockPredecessor pred | pred = bb.getAPredecessor() | - // this.strictlyDominatesSplit(pred) - // ) and - // forall(JoinBlockPredecessor pred | pred = bb.getAPredecessor() | - // this.strictlyDominatesSplit(pred) - // or - // this.getAControlFlowNode().getBasicBlock() = pred - // ) - // ``` - // - // but uses no universal recursion for better performance. - exists(int last | last = max(int i | exists(bb.(JoinBlock).getJoinBlockPredecessor(i))) | - this.strictlyDominatesJoinBlockSplit(bb, last) - ) - or - not bb instanceof JoinBlock and - this.strictlyDominatesSplit(bb.getAPredecessor()) - } - - /** - * DEPRECATED: Use `getExpr().controlsBlock()` instead. - * - * Holds if this assertion strictly dominates basic block `bb`. That is, `bb` - * can only be reached from the callable entry point by going via *some* basic - * block containing this element. - * - * This predicate is different from - * `this.getAControlFlowNode().getBasicBlock().strictlyDominates(bb)` - * in that it takes control flow splitting into account. - */ - pragma[nomagic] - deprecated predicate strictlyDominates(BasicBlock bb) { - this.strictlyDominatesSplit(bb) - or - this.getAControlFlowNode().getBasicBlock().strictlyDominates(bb) - } } /** A trivially failing assertion, for example `Debug.Assert(false)`. */ @@ -551,16 +386,6 @@ class ForwarderBooleanAssertMethod extends BooleanAssertMethod { } } -/** A method that forwards to a positive assertion method. */ -deprecated class ForwarderAssertTrueMethod extends ForwarderBooleanAssertMethod { - ForwarderAssertTrueMethod() { exists(this.getAnAssertionIndex(true)) } -} - -/** A method that forwards to a negated assertion method. */ -deprecated class ForwarderAssertFalseMethod extends ForwarderBooleanAssertMethod { - ForwarderAssertFalseMethod() { exists(this.getAnAssertionIndex(false)) } -} - /** A method that forwards to a nullness assertion method. */ class ForwarderNullnessAssertMethod extends NullnessAssertMethod { private ForwarderAssertMethod forwarder; @@ -580,15 +405,5 @@ class ForwarderNullnessAssertMethod extends NullnessAssertMethod { } } -/** A method that forwards to a `null` assertion method. */ -deprecated class ForwarderAssertNullMethod extends ForwarderNullnessAssertMethod { - ForwarderAssertNullMethod() { exists(this.getAnAssertionIndex(true)) } -} - -/** A method that forwards to a non-`null` assertion method. */ -deprecated class ForwarderAssertNonNullMethod extends ForwarderNullnessAssertMethod { - ForwarderAssertNonNullMethod() { exists(this.getAnAssertionIndex(false)) } -} - /** Holds if expression `e` appears in an assertion. */ predicate isExprInAssertion(Expr e) { e = any(Assertion a).getExpr(_).getAChildExpr*() } diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Collections.qll b/csharp/ql/lib/semmle/code/csharp/commons/Collections.qll index 0121ef13f8c..6bd6acd7656 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Collections.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Collections.qll @@ -1,6 +1,7 @@ /** Provides classes for collections. */ import csharp +import semmle.code.csharp.frameworks.system.Collections private string modifyMethodName() { result = @@ -66,6 +67,12 @@ class CollectionType extends RefType { } } +/** Holds if `t` is a collection type. */ +predicate isCollectionType(ValueOrRefType t) { + t.getABaseType*() instanceof SystemCollectionsIEnumerableInterface and + not t instanceof StringType +} + /** An object creation that creates an empty collection. */ class EmptyCollectionCreation extends ObjectCreation { EmptyCollectionCreation() { diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll index 0e01f7f7ab7..1d6e67aa488 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll @@ -105,31 +105,12 @@ private module ConstantComparisonOperation { } } -private class StructuralComparisonConfig extends StructuralComparison::StructuralComparisonConfiguration { - StructuralComparisonConfig() { this = "CompareIdenticalValues" } - - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(ComparisonTest ct | - x = ct.getFirstArgument() and - y = ct.getSecondArgument() - ) - } - - ComparisonTest getComparisonTest() { - exists(Element x, Element y | - result.getFirstArgument() = x and - result.getSecondArgument() = y and - same(x, y) - ) - } -} - /** * Holds if comparison test `ct` compares two structurally identical * expressions. */ predicate comparesIdenticalValues(ComparisonTest ct) { - ct = any(StructuralComparisonConfig c).getComparisonTest() + StructuralComparison::sameGvn(ct.getFirstArgument(), ct.getSecondArgument()) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll index ceac3b03aca..9ff113f1590 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll @@ -5,6 +5,36 @@ import csharp +abstract private class GvnKind extends TGvnKind { + abstract string toString(); +} + +private class GvnKindExpr extends GvnKind, TGvnKindExpr { + private int kind; + + GvnKindExpr() { this = TGvnKindExpr(kind) } + + override string toString() { result = "Expr(" + kind + ")" } +} + +private class GvnKindStmt extends GvnKind, TGvnKindStmt { + private int kind; + + GvnKindStmt() { this = TGvnKindStmt(kind) } + + override string toString() { result = "Stmt(" + kind + ")" } +} + +private class GvnKindDeclaration extends GvnKind, TGvnKindDeclaration { + private int kind; + private boolean isTargetThis; + private Declaration d; + + GvnKindDeclaration() { this = TGvnKindDeclaration(kind, isTargetThis, d) } + + override string toString() { result = "Expr(" + kind + ")," + isTargetThis + "," + d } +} + /** Gets the declaration referenced by the expression `e`, if any. */ private Declaration referenceAttribute(Expr e) { result = e.(MethodCall).getTarget() @@ -14,20 +44,166 @@ private Declaration referenceAttribute(Expr e) { result = e.(Access).getTarget() } -/** Gets the AST node kind element `e`. */ -private int elementKind(ControlFlowElement e) { - expressions(e, result, _) +/** Gets a Boolean indicating whether the target of the expression `e` is `this`. */ +private boolean isTargetThis(Expr e) { + result = true and e.(MemberAccess).targetIsThisInstance() or - exists(int k | statements(e, k) | result = -k) -} - -private int getNumberOfActualChildren(ControlFlowElement e) { - if e.(MemberAccess).targetIsThisInstance() - then result = e.getNumberOfChildren() - 1 - else result = e.getNumberOfChildren() + result = false and not e.(MemberAccess).targetIsThisInstance() } /** + * A global value number (GVN) for a control flow element. + * + * GVNs are used to map control flow elements to a representation that + * omits location information, that is, two elements that are structurally + * equal will be mapped to the same GVN. + */ +class Gvn extends TGvn { + /** Gets the string representation of this global value number. */ + string toString() { none() } +} + +private class ConstantGvn extends Gvn, TConstantGvn { + override string toString() { this = TConstantGvn(result) } +} + +private class GvnNil extends Gvn, TGvnNil { + private GvnKind kind; + + GvnNil() { this = TGvnNil(kind) } + + override string toString() { result = "(kind:" + kind + ")" } +} + +private class GvnCons extends Gvn, TGvnCons { + private Gvn head; + private Gvn tail; + + GvnCons() { this = TGvnCons(head, tail) } + + override string toString() { result = "(" + head + " :: " + tail + ")" } +} + +pragma[noinline] +private predicate gvnKindDeclaration(Expr e, int kind, boolean isTargetThis, Declaration d) { + isTargetThis = isTargetThis(e) and + // guard against elements with multiple declaration targets (DB inconsistency), + // which may result in a combinatorial explosion + d = unique(Declaration d0 | d0 = referenceAttribute(e) | d0) and + expressions(e, kind, _) +} + +/** + * Gets the `GvnKind` of the element `cfe`. + * + * In case `cfe` is a reference attribute, we encode the entire declaration and whether + * the target is semantically equivalent to `this`. + */ +private GvnKind getGvnKind(ControlFlowElement cfe) { + exists(int kind, boolean isTargetThis, Declaration d | + gvnKindDeclaration(cfe, kind, isTargetThis, d) and + result = TGvnKindDeclaration(kind, isTargetThis, d) + ) + or + exists(int kind | + not exists(referenceAttribute(cfe)) and + expressions(cfe, kind, _) and + result = TGvnKindExpr(kind) + or + statements(cfe, kind) and + result = TGvnKindStmt(kind) + ) +} + +private Gvn toGvn(ControlFlowElement cfe, GvnKind kind, int index) { + kind = getGvnKind(cfe) and + result = TGvnNil(kind) and + index = -1 + or + exists(Gvn head, Gvn tail | + toGvnCons(cfe, kind, index, head, tail) and + result = TGvnCons(head, tail) + ) +} + +private int getNumberOfActualChildren(ControlFlowElement cfe) { + if cfe.(MemberAccess).targetIsThisInstance() + then result = cfe.getNumberOfChildren() - 1 + else result = cfe.getNumberOfChildren() +} + +private ControlFlowElement getRankedChild(ControlFlowElement cfe, int rnk) { + result = + rank[rnk + 1](ControlFlowElement child, int j | + child = cfe.getChild(j) and + ( + j >= 0 + or + j = -1 and not cfe.(MemberAccess).targetIsThisInstance() + ) + | + child order by j + ) +} + +pragma[noinline] +private Gvn toGvnChild(ControlFlowElement cfe, int index) { + result = toGvn(getRankedChild(cfe, index)) +} + +pragma[noinline] +private predicate toGvnCons(ControlFlowElement cfe, GvnKind kind, int index, Gvn head, Gvn tail) { + tail = toGvn(cfe, kind, index - 1) and + head = toGvnChild(cfe, index) +} + +cached +private module Cached { + cached + newtype TGvnKind = + TGvnKindExpr(int kind) { expressions(_, kind, _) } or + TGvnKindStmt(int kind) { statements(_, kind) } or + TGvnKindDeclaration(int kind, boolean thisTarget, Declaration d) { + exists(Expr e | + d = referenceAttribute(e) and thisTarget = isTargetThis(e) and expressions(e, kind, _) + ) + } + + cached + newtype TGvn = + TConstantGvn(string s) { s = any(Expr e).getValue() } or + TGvnNil(GvnKind gkind) or + TGvnCons(Gvn head, Gvn tail) { toGvnCons(_, _, _, head, tail) } + + /** Gets the global value number of the element `cfe`. */ + cached + Gvn toGvnCached(ControlFlowElement cfe) { + result = TConstantGvn(cfe.(Expr).getValue()) + or + not exists(cfe.(Expr).getValue()) and + exists(GvnKind kind, int index | + result = toGvn(cfe, kind, index - 1) and + index = getNumberOfActualChildren(cfe) + ) + } +} + +private import Cached + +predicate toGvn = toGvnCached/1; + +/** + * Holds if the control flow elements `x` and `y` are structurally equal. + */ +pragma[inline] +predicate sameGvn(ControlFlowElement x, ControlFlowElement y) { + pragma[only_bind_into](toGvn(pragma[only_bind_out](x))) = + pragma[only_bind_into](toGvn(pragma[only_bind_out](y))) +} + +/** + * DEPRECATED: Use `sameGvn` instead. + * * A configuration for performing structural comparisons of program elements * (expressions and statements). * @@ -36,7 +212,7 @@ private int getNumberOfActualChildren(ControlFlowElement e) { * * Each use of the library is identified by a unique string value. */ -abstract class StructuralComparisonConfiguration extends string { +abstract deprecated class StructuralComparisonConfiguration extends string { bindingset[this] StructuralComparisonConfiguration() { any() } @@ -57,212 +233,10 @@ abstract class StructuralComparisonConfiguration extends string { */ abstract predicate candidate(ControlFlowElement x, ControlFlowElement y); - private predicate candidateInternal(ControlFlowElement x, ControlFlowElement y) { - candidate(x, y) - or - exists(ControlFlowElement xParent, ControlFlowElement yParent, int i | - candidateInternalChild(xParent, i, x, yParent) - | - y = yParent.getChild(i) - ) - } - - pragma[noinline] - private predicate candidateInternalChild( - ControlFlowElement x, int i, ControlFlowElement xChild, ControlFlowElement y - ) { - candidateInternal(x, y) and - xChild = x.getChild(i) - } - - private predicate sameByValue(Expr x, Expr y) { sameByValueAux(x, y, y.getValue()) } - - pragma[nomagic] - private predicate sameByValueAux(Expr x, Expr y, string value) { - candidateInternal(x, y) and - value = x.getValue() - } - - private ControlFlowElement getRankedChild(ControlFlowElement cfe, int rnk, int i) { - (candidateInternal(cfe, _) or candidateInternal(_, cfe)) and - i = - rank[rnk](int j | - exists(ControlFlowElement child | child = cfe.getChild(j) | - not (j = -1 and cfe.(MemberAccess).targetIsThisInstance()) - ) - ) and - result = cfe.getChild(i) - } - - pragma[nomagic] - private predicate sameByStructure0( - ControlFlowElement x, ControlFlowElement y, int elementKind, int children - ) { - candidateInternal(x, y) and - elementKind = elementKind(x) and - children = getNumberOfActualChildren(x) and - not (x.(Expr).hasValue() and y.(Expr).hasValue()) - } - - pragma[nomagic] - private predicate sameByStructure(ControlFlowElement x, ControlFlowElement y, int i) { - i = 0 and - // At least one of `x` and `y` must not have a value, they must have - // the same kind, and the same number of children - sameByStructure0(x, y, elementKind(y), getNumberOfActualChildren(y)) and - // If one of them has a reference attribute, they should both reference - // the same node - (exists(referenceAttribute(x)) implies referenceAttribute(x) = referenceAttribute(y)) and - // x is a member access on `this` iff y is - (x.(MemberAccess).targetIsThisInstance() implies y.(MemberAccess).targetIsThisInstance()) and - (y.(MemberAccess).targetIsThisInstance() implies x.(MemberAccess).targetIsThisInstance()) - or - exists(int j | sameByStructure(x, y, i - 1) | - sameInternal(getRankedChild(x, i, j), getRankedChild(y, i, j)) - ) - } - - pragma[nomagic] - private predicate sameInternal(ControlFlowElement x, ControlFlowElement y) { - sameByValue(x, y) - or - sameByStructure(x, y, getNumberOfActualChildren(x)) - } - /** * Holds if elements `x` and `y` structurally equal. `x` and `y` must be * flagged as candidates for structural equality, that is, * `candidate(x, y)` must hold. */ - predicate same(ControlFlowElement x, ControlFlowElement y) { - candidate(x, y) and - sameInternal(x, y) - } -} - -/** - * INTERNAL: Do not use. - * - * A verbatim copy of the class `StructuralComparisonConfiguration` for internal - * use. - * - * A copy is needed in order to use structural comparison within the standard - * library without running into caching issues. - */ -module Internal { - // Import all uses of the internal library to make sure caching works - private import semmle.code.csharp.controlflow.Guards as G - - /** - * A configuration for performing structural comparisons of program elements - * (expressions and statements). - * - * The predicate `candidate()` must be overridden, in order to identify the - * elements for which to perform structural comparison. - * - * Each use of the library is identified by a unique string value. - */ - abstract class InternalStructuralComparisonConfiguration extends string { - bindingset[this] - InternalStructuralComparisonConfiguration() { any() } - - /** - * Holds if elements `x` and `y` are candidates for testing structural - * equality. - * - * Subclasses are expected to override this predicate to identify the - * top-level elements which they want to compare. Care should be - * taken to avoid identifying too many pairs of elements, as in general - * there are very many structurally equal subtrees in a program, and - * in order to keep the computation feasible we must focus attention. - * - * Note that this relation is not expected to be symmetric -- it's - * fine to include a pair `(x, y)` but not `(y, x)`. - * In fact, not including the symmetrically implied fact will save - * half the computation time on the structural comparison. - */ - abstract predicate candidate(ControlFlowElement x, ControlFlowElement y); - - private predicate candidateInternal(ControlFlowElement x, ControlFlowElement y) { - candidate(x, y) - or - exists(ControlFlowElement xParent, ControlFlowElement yParent, int i | - candidateInternalChild(xParent, i, x, yParent) - | - y = yParent.getChild(i) - ) - } - - pragma[noinline] - private predicate candidateInternalChild( - ControlFlowElement x, int i, ControlFlowElement xChild, ControlFlowElement y - ) { - candidateInternal(x, y) and - xChild = x.getChild(i) - } - - private predicate sameByValue(Expr x, Expr y) { sameByValueAux(x, y, y.getValue()) } - - pragma[nomagic] - private predicate sameByValueAux(Expr x, Expr y, string value) { - candidateInternal(x, y) and - value = x.getValue() - } - - private ControlFlowElement getRankedChild(ControlFlowElement cfe, int rnk, int i) { - (candidateInternal(cfe, _) or candidateInternal(_, cfe)) and - i = - rank[rnk](int j | - exists(ControlFlowElement child | child = cfe.getChild(j) | - not (j = -1 and cfe.(MemberAccess).targetIsThisInstance()) - ) - ) and - result = cfe.getChild(i) - } - - pragma[nomagic] - private predicate sameByStructure0( - ControlFlowElement x, ControlFlowElement y, int elementKind, int children - ) { - candidateInternal(x, y) and - elementKind = elementKind(x) and - children = getNumberOfActualChildren(x) and - not (x.(Expr).hasValue() and y.(Expr).hasValue()) - } - - pragma[nomagic] - private predicate sameByStructure(ControlFlowElement x, ControlFlowElement y, int i) { - i = 0 and - // At least one of `x` and `y` must not have a value, they must have - // the same kind, and the same number of children - sameByStructure0(x, y, elementKind(y), getNumberOfActualChildren(y)) and - // If one of them has a reference attribute, they should both reference - // the same node - (exists(referenceAttribute(x)) implies referenceAttribute(x) = referenceAttribute(y)) and - // x is a member access on `this` iff y is - (x.(MemberAccess).targetIsThisInstance() implies y.(MemberAccess).targetIsThisInstance()) and - (y.(MemberAccess).targetIsThisInstance() implies x.(MemberAccess).targetIsThisInstance()) - or - exists(int j | sameByStructure(x, y, i - 1) | - sameInternal(getRankedChild(x, i, j), getRankedChild(y, i, j)) - ) - } - - pragma[nomagic] - private predicate sameInternal(ControlFlowElement x, ControlFlowElement y) { - sameByValue(x, y) - or - sameByStructure(x, y, getNumberOfActualChildren(x)) - } - - /** - * Holds if elements `x` and `y` structurally equal. `x` and `y` must be - * flagged as candidates for structural equality, that is, - * `candidate(x, y)` must hold. - */ - predicate same(ControlFlowElement x, ControlFlowElement y) { - candidate(x, y) and - sameInternal(x, y) - } - } + predicate same(ControlFlowElement x, ControlFlowElement y) { candidate(x, y) and sameGvn(x, y) } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll index 9e7fd92d2a4..6c6a66c4ac2 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll @@ -227,35 +227,4 @@ class ControlFlowElement extends ExprOrStmtParent, @control_flow_element { cb.getLastNode() = this.getAControlFlowNode() and cb.controls(controlled, s) } - - /** DEPRECATED: Use `controlsBlock/3` instead. */ - deprecated predicate controlsBlock(BasicBlock controlled, ConditionalSuccessor s) { - this.controlsBlock(controlled, s, _) - } - - /** - * DEPRECATED. - * - * Holds if control flow element `controlled` is controlled by this control flow - * element with conditional value `s`. That is, `controlled` can only be reached - * from the callable entry point by going via the `s` edge out of this element. - * - * This predicate is different from - * - * ```ql - * exists(ConditionBlock cb | - * cb.getLastNode() = this.getAControlFlowNode() | - * cb.controls(controlled.getAControlFlowNode().getBasicBlock(), s) - * ) - * ``` - * - * as control flow splitting is taken into account. - */ - // potentially very large predicate, so must be inlined - pragma[inline] - deprecated predicate controlsElement(ControlFlowElement controlled, ConditionalSuccessor s) { - forex(BasicBlock bb | bb = controlled.getAControlFlowNode().getBasicBlock() | - this.controlsBlock(bb, s) - ) - } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 7e9b8f7818a..2f104dae88c 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -8,7 +8,7 @@ private import dotnet private import ControlFlow::SuccessorTypes private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.commons.ComparisonTest -private import semmle.code.csharp.commons.StructuralComparison::Internal +private import semmle.code.csharp.commons.StructuralComparison as SC private import semmle.code.csharp.controlflow.BasicBlocks private import semmle.code.csharp.controlflow.internal.Completion private import semmle.code.csharp.frameworks.System @@ -1000,7 +1000,7 @@ module Internal { // The predicates in this module should be evaluated in the same stage as the CFG // construction stage. This is to avoid recomputation of pre-basic-blocks and // pre-SSA predicates - private module PreCFG { + private module PreCfg { private import semmle.code.csharp.controlflow.internal.PreBasicBlocks as PreBasicBlocks private import semmle.code.csharp.controlflow.internal.PreSsa @@ -1414,7 +1414,7 @@ module Internal { } cached - private module CachedWithCFG { + private module CachedWithCfg { private import semmle.code.csharp.Caching cached @@ -1719,10 +1719,10 @@ module Internal { } } - import CachedWithCFG + import CachedWithCfg } - import PreCFG + import PreCfg private predicate interestingDescendantCandidate(Expr e) { guardControls(e, _, _) @@ -1798,32 +1798,30 @@ module Internal { } /** - * A helper class for calculating structurally equal access/call expressions. + * Holds if access/call expression `e` (targeting declaration `target`) + * is a sub expression of a guard that controls whether basic block + * `bb` is reached. */ - private class ConditionOnExprComparisonConfig extends InternalStructuralComparisonConfiguration { - ConditionOnExprComparisonConfig() { this = "ConditionOnExprComparisonConfig" } + pragma[noinline] + private predicate candidateAux(AccessOrCallExpr e, Declaration target, BasicBlock bb) { + target = e.getTarget() and + guardControlsSub(_, bb, e) + } - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(BasicBlock bb, Declaration d | - this.candidateAux(x, d, bb) and - y = - any(AccessOrCallExpr e | - e.getAControlFlowNode().getBasicBlock() = bb and - e.getTarget() = d - ) - ) - } + private predicate candidate(AccessOrCallExpr x, AccessOrCallExpr y) { + exists(BasicBlock bb, Declaration d | + candidateAux(x, d, bb) and + y = + any(AccessOrCallExpr e | + e.getAControlFlowNode().getBasicBlock() = bb and + e.getTarget() = d + ) + ) + } - /** - * Holds if access/call expression `e` (targeting declaration `target`) - * is a sub expression of a guard that controls whether basic block - * `bb` is reached. - */ - pragma[noinline] - private predicate candidateAux(AccessOrCallExpr e, Declaration target, BasicBlock bb) { - target = e.getTarget() and - guardControlsSub(_, bb, e) - } + private predicate same(AccessOrCallExpr x, AccessOrCallExpr y) { + candidate(x, y) and + SC::sameGvn(x, y) } cached @@ -1849,7 +1847,7 @@ module Internal { pragma[nomagic] private predicate guardControlsSubSame(Guard g, BasicBlock bb, ControlGuardDescendant sub) { guardControlsSub(g, bb, sub) and - any(ConditionOnExprComparisonConfig c).same(sub, _) + same(sub, _) } pragma[nomagic] @@ -1862,7 +1860,7 @@ module Internal { guardedBB = guardedCfn.getBasicBlock() and guardControls(g, guardedBB, v) and guardControlsSubSame(g, guardedBB, sub) and - any(ConditionOnExprComparisonConfig c).same(sub, guarded) + same(sub, guarded) } pragma[nomagic] diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll index e7ae2e489a2..47fcd24883c 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll @@ -744,7 +744,7 @@ cached private module Cached { /** * If needed, call this predicate from `ControlFlowGraphImplSpecific.qll` in order to - * force a stage-dependency on the `ControlFlowGraphImplShared.qll` stage and therby + * force a stage-dependency on the `ControlFlowGraphImplShared.qll` stage and thereby * collapsing the two stages. */ cached 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 b6b0c95ddc0..02fb893cb7f 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -511,13 +511,6 @@ module FinallySplitting { predicate isEntryNode() { first(try.getFinally(), this) } } - /** A control flow element that does not belong to a `finally` block. */ - private class NonFinallyControlFlowElement extends ControlFlowElement { - NonFinallyControlFlowElement() { - not this = any(Statements::TryStmtTree t).getAFinallyDescendant() - } - } - /** * A split for elements belonging to a `finally` block, which determines how to * continue execution after leaving the `finally` block. For example, in 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 76da2fb62ef..154ab9423b9 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll @@ -26,9 +26,6 @@ private newtype TSuccessorType = class SuccessorType extends TSuccessorType { /** Gets a textual representation of successor type. */ string toString() { none() } - - /** Holds if this successor type matches completion `c`. */ - deprecated predicate matchesCompletion(Completion c) { this = c.getAMatchingSuccessorType() } } /** Provides different types of control flow successor types. */ diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll index 19bf1d4f27d..eed0d050735 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll @@ -287,20 +287,6 @@ private module SsaDefReaches { ) } - /** - * Holds if the SSA definition of `v` at `def` reaches uncertain SSA definition - * `redef` in the same basic block, without crossing another SSA definition of `v`. - */ - predicate ssaDefReachesUncertainDefWithinBlock( - SourceVariable v, Definition def, UncertainWriteDefinition redef - ) { - exists(BasicBlock bb, int rnk, int i | - ssaDefReachesRank(bb, def, rnk, v) and - rnk = ssaRefRank(bb, i, v, SsaDef()) - 1 and - redef.definesAt(v, bb, i) - ) - } - /** * Same as `ssaRefRank()`, but restricted to a particular SSA definition `def`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll index 80d1f40c199..9e8baa291ca 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll @@ -86,6 +86,7 @@ private import internal.FlowSummaryImplSpecific */ private module Frameworks { private import semmle.code.csharp.frameworks.EntityFramework + private import semmle.code.csharp.frameworks.Generated private import semmle.code.csharp.frameworks.JsonNET private import semmle.code.csharp.frameworks.microsoft.extensions.Primitives private import semmle.code.csharp.frameworks.microsoft.VisualBasic @@ -162,10 +163,17 @@ private predicate sinkModel(string row) { any(SinkModelCsv s).row(row) } private predicate summaryModel(string row) { any(SummaryModelCsv s).row(row) } +bindingset[input] +private predicate getKind(string input, string kind, boolean generated) { + input.splitAt(":", 0) = "generated" and kind = input.splitAt(":", 1) and generated = true + or + not input.matches("%:%") and kind = input and generated = false +} + /** Holds if a source model exists for the given parameters. */ predicate sourceModel( string namespace, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind + string output, string kind, boolean generated ) { exists(string row | sourceModel(row) and @@ -177,14 +185,14 @@ predicate sourceModel( row.splitAt(";", 4) = signature and row.splitAt(";", 5) = ext and row.splitAt(";", 6) = output and - row.splitAt(";", 7) = kind + exists(string k | row.splitAt(";", 7) = k and getKind(k, kind, generated)) ) } /** Holds if a sink model exists for the given parameters. */ predicate sinkModel( string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind + string input, string kind, boolean generated ) { exists(string row | sinkModel(row) and @@ -196,14 +204,14 @@ predicate sinkModel( row.splitAt(";", 4) = signature and row.splitAt(";", 5) = ext and row.splitAt(";", 6) = input and - row.splitAt(";", 7) = kind + exists(string k | row.splitAt(";", 7) = k and getKind(k, kind, generated)) ) } /** Holds if a summary model exists for the given parameters. */ predicate summaryModel( string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind + string input, string output, string kind, boolean generated ) { exists(string row | summaryModel(row) and @@ -216,14 +224,14 @@ predicate summaryModel( row.splitAt(";", 5) = ext and row.splitAt(";", 6) = input and row.splitAt(";", 7) = output and - row.splitAt(";", 8) = kind + exists(string k | row.splitAt(";", 8) = k and getKind(k, kind, generated)) ) } private predicate relevantNamespace(string namespace) { - sourceModel(namespace, _, _, _, _, _, _, _) or - sinkModel(namespace, _, _, _, _, _, _, _) or - summaryModel(namespace, _, _, _, _, _, _, _, _) + sourceModel(namespace, _, _, _, _, _, _, _, _) or + sinkModel(namespace, _, _, _, _, _, _, _, _) or + summaryModel(namespace, _, _, _, _, _, _, _, _, _) } private predicate namespaceLink(string shortns, string longns) { @@ -251,25 +259,25 @@ predicate modelCoverage(string namespace, int namespaces, string kind, string pa part = "source" and n = strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string output | + string ext, string output, boolean generated | canonicalNamespaceLink(namespace, subns) and - sourceModel(subns, type, subtypes, name, signature, ext, output, kind) + sourceModel(subns, type, subtypes, name, signature, ext, output, kind, generated) ) or part = "sink" and n = strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input | + string ext, string input, boolean generated | canonicalNamespaceLink(namespace, subns) and - sinkModel(subns, type, subtypes, name, signature, ext, input, kind) + sinkModel(subns, type, subtypes, name, signature, ext, input, kind, generated) ) or part = "summary" and n = strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input, string output | + string ext, string input, string output, boolean generated | canonicalNamespaceLink(namespace, subns) and - summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind) + summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, generated) ) ) } @@ -279,11 +287,11 @@ module CsvValidation { /** Holds if some row in a CSV-based flow model appears to contain typos. */ query predicate invalidModelRow(string msg) { exists(string pred, string namespace, string type, string name, string signature, string ext | - sourceModel(namespace, type, _, name, signature, ext, _, _) and pred = "source" + sourceModel(namespace, type, _, name, signature, ext, _, _, _) and pred = "source" or - sinkModel(namespace, type, _, name, signature, ext, _, _) and pred = "sink" + sinkModel(namespace, type, _, name, signature, ext, _, _, _) and pred = "sink" or - summaryModel(namespace, type, _, name, signature, ext, _, _, _) and pred = "summary" + summaryModel(namespace, type, _, name, signature, ext, _, _, _, _) and pred = "summary" | not namespace.regexpMatch("[a-zA-Z0-9_\\.]+") and msg = "Dubious namespace \"" + namespace + "\" in " + pred + " model." @@ -302,9 +310,9 @@ module CsvValidation { ) or exists(string pred, AccessPath input, string part | - sinkModel(_, _, _, _, _, _, input, _) and pred = "sink" + sinkModel(_, _, _, _, _, _, input, _, _) and pred = "sink" or - summaryModel(_, _, _, _, _, _, input, _, _) and pred = "summary" + summaryModel(_, _, _, _, _, _, input, _, _, _) and pred = "summary" | ( invalidSpecComponent(input, part) and @@ -319,9 +327,9 @@ module CsvValidation { ) or exists(string pred, string output, string part | - sourceModel(_, _, _, _, _, _, output, _) and pred = "source" + sourceModel(_, _, _, _, _, _, output, _, _) and pred = "source" or - summaryModel(_, _, _, _, _, _, _, output, _) and pred = "summary" + summaryModel(_, _, _, _, _, _, _, output, _, _) and pred = "summary" | invalidSpecComponent(output, part) and not part = "" and @@ -351,20 +359,23 @@ module CsvValidation { ) ) or - exists(string row, string kind | summaryModel(row) | - kind = row.splitAt(";", 8) and + exists(string row, string k, string kind | summaryModel(row) | + k = row.splitAt(";", 8) and + getKind(k, kind, _) and not kind = ["taint", "value"] and msg = "Invalid kind \"" + kind + "\" in summary model." ) or - exists(string row, string kind | sinkModel(row) | - kind = row.splitAt(";", 7) and + exists(string row, string k, string kind | sinkModel(row) | + k = row.splitAt(";", 7) and + getKind(k, kind, _) and not kind = ["code", "sql", "xss", "remote", "html"] and msg = "Invalid kind \"" + kind + "\" in sink model." ) or - exists(string row, string kind | sourceModel(row) | - kind = row.splitAt(";", 7) and + exists(string row, string k, string kind | sourceModel(row) | + k = row.splitAt(";", 7) and + getKind(k, kind, _) and not kind = "local" and msg = "Invalid kind \"" + kind + "\" in source model." ) @@ -374,9 +385,9 @@ module CsvValidation { private predicate elementSpec( string namespace, string type, boolean subtypes, string name, string signature, string ext ) { - sourceModel(namespace, type, subtypes, name, signature, ext, _, _) or - sinkModel(namespace, type, subtypes, name, signature, ext, _, _) or - summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _) + sourceModel(namespace, type, subtypes, name, signature, ext, _, _, _) or + sinkModel(namespace, type, subtypes, name, signature, ext, _, _, _) or + summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) } private predicate elementSpec( @@ -502,6 +513,11 @@ Element interpretElement( ) } +/** + * Holds if `c` has a `generated` summary. + */ +predicate hasSummary(Callable c, boolean generated) { summaryElement(c, _, _, _, generated) } + cached private module Cached { /** diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll index 56bbc76331b..08a9a8a5421 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll @@ -1,6 +1,7 @@ /** Provides classes and predicates for defining flow summaries. */ import csharp +private import dotnet private import internal.FlowSummaryImpl as Impl private import internal.DataFlowDispatch as DataFlowDispatch @@ -138,28 +139,6 @@ private class RecordConstructorFlow extends SummarizedCallable { } } -private class SummarizedCallableDefaultClearsContent extends Impl::Public::SummarizedCallable { - SummarizedCallableDefaultClearsContent() { - this instanceof Impl::Public::SummarizedCallable or none() - } - - // By default, we assume that all stores into arguments are definite - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - exists(SummaryComponentStack output, SummaryComponent target | - this.propagatesFlow(_, output, _) and - output.drop(_) = - SummaryComponentStack::push(SummaryComponent::content(content), - SummaryComponentStack::singleton(target)) and - not content instanceof DataFlow::ElementContent - | - target = SummaryComponent::argument(pos.getPosition()) - or - target = SummaryComponent::qualifier() and - pos.isThisParameter() - ) - } -} - class RequiredSummaryComponentStack = Impl::Public::RequiredSummaryComponentStack; private class RecordConstructorFlowRequiredSummaryComponentStack extends RequiredSummaryComponentStack { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll index 2a58cba6209..b919d143a39 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll @@ -111,13 +111,6 @@ private predicate evenlyDivisibleExpr(Expr e, int factor) { ) } -/** - * Holds if `rix` is the number of input edges to `phi`. - */ -private predicate maxPhiInputRank(SsaPhiNode phi, int rix) { - rix = max(int r | rankedPhiInput(phi, _, _, r)) -} - /** * Gets the remainder of `val` modulo `mod`. * diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll index 80b7d5d6d36..e900b36a023 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll @@ -427,11 +427,6 @@ module Ssa { not result instanceof PhiNode } - /** - * DEPRECATED: Use `definesAt/3` instead. - */ - deprecated predicate definesAt(ControlFlow::BasicBlock bb, int i) { this.definesAt(_, bb, i) } - /** * Gets the syntax element associated with this SSA definition, if any. * This is either an expression, for example `x = 0`, a parameter, or a @@ -655,14 +650,6 @@ module Ssa { override Location getLocation() { result = this.getQualifierDefinition().getLocation() } } - /** - * An SSA definition that has no actual semantics, but simply serves to - * merge or filter data flow. - * - * Phi nodes are the canonical (and currently only) example. - */ - deprecated class PseudoDefinition = PhiNode; - /** * An SSA phi node, that is, a pseudo definition for a variable at a point * in the flow graph where otherwise two or more definitions for the variable diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll index 8e126868cc1..076e12f2671 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll @@ -42,9 +42,7 @@ module AccessPath { * Parses a lower-bounded interval `n..` and gets the lower bound. */ bindingset[arg] - private int parseLowerBound(string arg) { - result = arg.regexpCapture("(-?\\d+)\\.\\.", 1).toInt() - } + int parseLowerBound(string arg) { result = arg.regexpCapture("(-?\\d+)\\.\\.", 1).toInt() } /** * Parses an integer constant or interval (bounded or unbounded) that explicitly @@ -151,7 +149,7 @@ class AccessPath extends string instanceof AccessPath::Range { * An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths. */ class AccessPathToken extends string { - AccessPathToken() { this = getRawToken(any(AccessPath path), _) } + AccessPathToken() { this = getRawToken(_, _) } private string getPart(int part) { result = this.regexpCapture("([^\\[]+)(?:\\[([^\\]]*)\\])?", part) @@ -169,9 +167,16 @@ class AccessPathToken extends string { /** Gets the `n`th argument to this token, such as `x` or `y` from `Member[x,y]`. */ string getArgument(int n) { result = this.getArgumentList().splitAt(",", n).trim() } + /** Gets the `n`th argument to this `name` token, such as `x` or `y` from `Member[x,y]`. */ + pragma[nomagic] + string getArgument(string name, int n) { name = this.getName() and result = this.getArgument(n) } + /** Gets an argument to this token, such as `x` or `y` from `Member[x,y]`. */ string getAnArgument() { result = this.getArgument(_) } + /** Gets an argument to this `name` token, such as `x` or `y` from `Member[x,y]`. */ + string getAnArgument(string name) { result = this.getArgument(name, _) } + /** Gets the number of arguments to this token, such as 2 for `Member[x,y]` or zero for `ReturnValue`. */ int getNumArgument() { result = count(int n | exists(this.getArgument(n))) } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ContentDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ContentDataFlow.qll new file mode 100644 index 00000000000..2bdb56b2aa6 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ContentDataFlow.qll @@ -0,0 +1,529 @@ +/** + * Provides classes for performing global (inter-procedural) + * content-sensitive data flow analyses. + */ + +private import DataFlowImplCommon + +module ContentDataFlow { + private import DataFlowImplSpecific::Private + private import DataFlowImplSpecific::Private as DataFlowPrivate + private import DataFlowImplForContentDataFlow as DF + + class Node = DF::Node; + + class FlowFeature = DF::FlowFeature; + + class ContentSet = DF::ContentSet; + + predicate stageStats = DF::stageStats/8; + + /** + * A configuration of interprocedural data flow analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the global data flow library must define its own unique extension + * of this abstract class. To create a configuration, extend this class with + * a subclass whose characteristic predicate is a unique singleton string. + * For example, write + * + * ```ql + * class MyAnalysisConfiguration extends ContentDataFlowConfiguration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isBarrier`. + * // Optionally override `isAdditionalFlowStep`. + * // Optionally override `getAFeature`. + * // Optionally override `accessPathLimit`. + * // Optionally override `isRelevantContent`. + * } + * ``` + * + * Unlike `DataFlow::Configuration` (on which this class is based), we allow + * for data to be stored (possibly nested) inside contents of sources and sinks. + * We track flow paths of the form + * + * ``` + * source --value-->* node + * (--read--> node --value-->* node)* + * --(non-value|value)-->* node + * (--store--> node --value-->* node)* + * --value-->* sink + * ``` + * + * where `--value-->` is a value-preserving flow step, `--read-->` is a read + * step, `--store-->` is a store step, and `--(non-value)-->` is a + * non-value-preserving flow step. + * + * That is, first a sequence of 0 or more reads, followed by 0 or more additional + * steps, followed by 0 or more stores, with value-preserving steps allowed in + * between all other steps. + */ + abstract class Configuration extends string { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant data flow source. + */ + abstract predicate isSource(Node source); + + /** + * Holds if `sink` is a relevant data flow sink. + */ + abstract predicate isSink(Node sink); + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + */ + predicate isAdditionalFlowStep(Node node1, Node node2) { none() } + + /** Holds if data flow into `node` is prohibited. */ + predicate isBarrier(Node node) { none() } + + /** + * Gets a data flow configuration feature to add restrictions to the set of + * valid flow paths. + * + * - `FeatureHasSourceCallContext`: + * Assume that sources have some existing call context to disallow + * conflicting return-flow directly following the source. + * - `FeatureHasSinkCallContext`: + * Assume that sinks have some existing call context to disallow + * conflicting argument-to-parameter flow directly preceding the sink. + * - `FeatureEqualSourceSinkCallContext`: + * Implies both of the above and additionally ensures that the entire flow + * path preserves the call context. + */ + FlowFeature getAFeature() { none() } + + /** Gets a limit on the number of reads out of sources and number of stores into sinks. */ + int accessPathLimit() { result = DataFlowPrivate::accessPathLimit() } + + /** Holds if `c` is relevant for reads out of sources or stores into sinks. */ + predicate isRelevantContent(ContentSet c) { any() } + + /** + * Holds if data stored inside `sourceAp` on `source` flows to `sinkAp` inside `sink` + * for this configuration. `preservesValue` indicates whether any of the additional + * flow steps defined by `isAdditionalFlowStep` are needed. + * + * For the source access path, `sourceAp`, the top of the stack represents the content + * that was last read from. That is, if `sourceAp` is `Field1.Field2` (with `Field1` + * being the top of the stack), then there is flow from `source.Field2.Field1`. + * + * For the sink access path, `sinkAp`, the top of the stack represents the content + * that was last stored into. That is, if `sinkAp` is `Field1.Field2` (with `Field1` + * being the top of the stack), then there is flow into `sink.Field1.Field2`. + */ + final predicate hasFlow( + Node source, AccessPath sourceAp, Node sink, AccessPath sinkAp, boolean preservesValue + ) { + exists(DF::PathNode pathSource, DF::PathNode pathSink | + this.(ConfigurationAdapter).hasFlowPath(pathSource, pathSink) and + nodeReaches(pathSource, TAccessPathNil(), TAccessPathNil(), pathSink, sourceAp, sinkAp) and + source = pathSource.getNode() and + sink = pathSink.getNode() + | + pathSink.getState().(InitState).decode(preservesValue) + or + pathSink.getState().(ReadState).decode(_, preservesValue) + or + pathSink.getState().(StoreState).decode(_, preservesValue) + ) + } + } + + /** A flow state representing no reads or stores. */ + private class InitState extends DF::FlowState { + private boolean preservesValue_; + + InitState() { this = "Init(" + preservesValue_ + ")" and preservesValue_ in [false, true] } + + predicate decode(boolean preservesValue) { preservesValue = preservesValue_ } + } + + /** A flow state representing that content has been stored into. */ + private class StoreState extends DF::FlowState { + private boolean preservesValue_; + private int size_; + + StoreState() { + preservesValue_ in [false, true] and + size_ in [1 .. any(Configuration c).accessPathLimit()] and + this = "StoreState(" + size_ + "," + preservesValue_ + ")" + } + + predicate decode(int size, boolean preservesValue) { + size = size_ and preservesValue = preservesValue_ + } + } + + /** A flow state representing that content has been read from. */ + private class ReadState extends DF::FlowState { + private boolean preservesValue_; + private int size_; + + ReadState() { + preservesValue_ in [false, true] and + size_ in [1 .. any(Configuration c).accessPathLimit()] and + this = "ReadState(" + size_ + "," + preservesValue_ + ")" + } + + predicate decode(int size, boolean preservesValue) { + size = size_ and preservesValue = preservesValue_ + } + } + + private predicate storeStep( + Node node1, DF::FlowState state1, ContentSet c, Node node2, StoreState state2, + Configuration config + ) { + exists(boolean preservesValue, int size | + storeSet(node1, c, node2, _, _) and + config.isRelevantContent(c) and + state2.decode(size + 1, preservesValue) + | + state1.(InitState).decode(preservesValue) and size = 0 + or + state1.(ReadState).decode(_, preservesValue) and size = 0 + or + state1.(StoreState).decode(size, preservesValue) + ) + } + + private predicate readStep( + Node node1, DF::FlowState state1, ContentSet c, Node node2, ReadState state2, + Configuration config + ) { + exists(int size | + readSet(node1, c, node2) and + config.isRelevantContent(c) and + state2.decode(size + 1, true) + | + state1.(InitState).decode(true) and + size = 0 + or + state1.(ReadState).decode(size, true) + ) + } + + private predicate additionalStep( + Node node1, DF::FlowState state1, Node node2, DF::FlowState state2, Configuration config + ) { + config.isAdditionalFlowStep(node1, node2) and + ( + state1 instanceof InitState and + state2.(InitState).decode(false) + or + exists(int size | + state1.(ReadState).decode(size, _) and + state2.(ReadState).decode(size, false) + ) + ) + } + + private class ConfigurationAdapter extends DF::Configuration { + private Configuration c; + + ConfigurationAdapter() { this = c } + + final override predicate isSource(Node source, DF::FlowState state) { + c.isSource(source) and + state.(InitState).decode(true) + } + + final override predicate isSink(Node sink, DF::FlowState state) { + c.isSink(sink) and + ( + state instanceof InitState or + state instanceof StoreState or + state instanceof ReadState + ) + } + + final override predicate isAdditionalFlowStep( + Node node1, DF::FlowState state1, Node node2, DF::FlowState state2 + ) { + storeStep(node1, state1, _, node2, state2, this) or + readStep(node1, state1, _, node2, state2, this) or + additionalStep(node1, state1, node2, state2, this) + } + + final override predicate isBarrier(Node node) { c.isBarrier(node) } + + final override FlowFeature getAFeature() { result = c.getAFeature() } + + // needed to record reads/stores inside summarized callables + final override predicate includeHiddenNodes() { any() } + } + + private newtype TAccessPath = + TAccessPathNil() or + TAccessPathCons(ContentSet head, AccessPath tail) { + nodeReachesStore(_, _, _, _, head, _, tail) + or + nodeReachesRead(_, _, _, _, head, tail, _) + } + + /** An access path. */ + class AccessPath extends TAccessPath { + /** Gets the head of this access path, if any. */ + ContentSet getHead() { this = TAccessPathCons(result, _) } + + /** Gets the tail of this access path, if any. */ + AccessPath getTail() { this = TAccessPathCons(_, result) } + + /** + * Gets a textual representation of this access path. + * + * Elements are dot-separated, and the head of the stack is + * rendered first. + */ + string toString() { + this = TAccessPathNil() and + result = "" + or + exists(ContentSet head, AccessPath tail | + this = TAccessPathCons(head, tail) and + result = head + "." + tail + ) + } + } + + // important to use `edges` and not `PathNode::getASuccessor()`, as the latter + // is not pruned for reachability + private predicate pathSucc = DF::PathGraph::edges/2; + + /** + * Provides a big-step flow relation, where flow stops at read/store steps that + * must be recorded, and flow via `subpaths` such that reads/stores inside + * summarized callables can be recorded as well. + */ + private module BigStepFlow { + private predicate reachesSink(DF::PathNode node) { + any(ConfigurationAdapter config).isSink(node.getNode(), node.getState()) + or + exists(DF::PathNode mid | + pathSucc(node, mid) and + reachesSink(mid) + ) + } + + /** + * Holds if the flow step `pred -> succ` should not be allowed to be included + * in the big-step relation. + */ + pragma[nomagic] + private predicate excludeStep(DF::PathNode pred, DF::PathNode succ) { + pathSucc(pred, succ) and + ( + // we need to record reads/stores inside summarized callables + DF::PathGraph::subpaths(pred, _, _, succ) + or + // only allow flow into a summarized callable, as part of the big-step + // relation, when flow can reach a sink without going back out + DF::PathGraph::subpaths(pred, succ, _, _) and + not reachesSink(succ) + or + // needed to record store steps + storeStep(pred.getNode(), pred.getState(), _, succ.getNode(), succ.getState(), + pred.getConfiguration()) + or + // needed to record read steps + readStep(pred.getNode(), pred.getState(), _, succ.getNode(), succ.getState(), + pred.getConfiguration()) + ) + } + + pragma[nomagic] + private DataFlowCallable getEnclosingCallableImpl(DF::PathNode node) { + result = getNodeEnclosingCallable(node.getNode()) + } + + pragma[inline] + private DataFlowCallable getEnclosingCallable(DF::PathNode node) { + pragma[only_bind_into](result) = getEnclosingCallableImpl(pragma[only_bind_out](node)) + } + + pragma[nomagic] + private predicate bigStepEntry(DF::PathNode node) { + node.getConfiguration() instanceof Configuration and + ( + any(ConfigurationAdapter config).isSource(node.getNode(), node.getState()) + or + excludeStep(_, node) + or + DF::PathGraph::subpaths(_, node, _, _) + ) + } + + pragma[nomagic] + private predicate bigStepExit(DF::PathNode node) { + node.getConfiguration() instanceof Configuration and + ( + bigStepEntry(node) + or + any(ConfigurationAdapter config).isSink(node.getNode(), node.getState()) + or + excludeStep(node, _) + or + DF::PathGraph::subpaths(_, _, node, _) + ) + } + + pragma[nomagic] + private predicate step(DF::PathNode pred, DF::PathNode succ) { + pathSucc(pred, succ) and + not excludeStep(pred, succ) + } + + pragma[nomagic] + private predicate stepRec(DF::PathNode pred, DF::PathNode succ) { + step(pred, succ) and + not bigStepEntry(pred) + } + + private predicate stepRecPlus(DF::PathNode n1, DF::PathNode n2) = fastTC(stepRec/2)(n1, n2) + + /** + * Holds if there is flow `pathSucc+(pred) = succ`, and such a flow path does + * not go through any reads/stores that need to be recorded, or summarized + * steps. + */ + pragma[nomagic] + private predicate bigStep(DF::PathNode pred, DF::PathNode succ) { + exists(DF::PathNode mid | + bigStepEntry(pred) and + step(pred, mid) + | + succ = mid + or + stepRecPlus(mid, succ) + ) and + bigStepExit(succ) + } + + pragma[nomagic] + predicate bigStepNotLocal(DF::PathNode pred, DF::PathNode succ) { + bigStep(pred, succ) and + not getEnclosingCallable(pred) = getEnclosingCallable(succ) + } + + pragma[nomagic] + predicate bigStepMaybeLocal(DF::PathNode pred, DF::PathNode succ) { + bigStep(pred, succ) and + getEnclosingCallable(pred) = getEnclosingCallable(succ) + } + } + + /** + * Holds if `source` can reach `node`, having read `reads` from the source and + * written `stores` into `node`. + * + * `source` is either a source from a configuration, in which case `scReads` and + * `scStores` are always empty, or it is the parameter of a summarized callable, + * in which case `scReads` and `scStores` record the reads/stores for a summary + * context, that is, the reads/stores for an argument that can reach the parameter. + */ + pragma[nomagic] + private predicate nodeReaches( + DF::PathNode source, AccessPath scReads, AccessPath scStores, DF::PathNode node, + AccessPath reads, AccessPath stores + ) { + exists(ConfigurationAdapter config | + node = source and + reads = scReads and + stores = scStores + | + config.hasFlowPath(source, _) and + scReads = TAccessPathNil() and + scStores = TAccessPathNil() + or + // the argument in a sub path can be reached, so we start flow from the sub path + // parameter, while recording the read/store summary context + exists(DF::PathNode arg | + nodeReachesSubpathArg(_, _, _, arg, scReads, scStores) and + DF::PathGraph::subpaths(arg, source, _, _) + ) + ) + or + exists(DF::PathNode mid | + nodeReaches(source, scReads, scStores, mid, reads, stores) and + BigStepFlow::bigStepMaybeLocal(mid, node) + ) + or + exists(DF::PathNode mid | + nodeReaches(source, scReads, scStores, mid, reads, stores) and + BigStepFlow::bigStepNotLocal(mid, node) and + // when flow is not local, we cannot flow back out, so we may stop + // flow early when computing summary flow + any(ConfigurationAdapter config).hasFlowPath(source, _) and + scReads = TAccessPathNil() and + scStores = TAccessPathNil() + ) + or + // store step + exists(AccessPath storesMid, ContentSet c | + nodeReachesStore(source, scReads, scStores, node, c, reads, storesMid) and + stores = TAccessPathCons(c, storesMid) + ) + or + // read step + exists(AccessPath readsMid, ContentSet c | + nodeReachesRead(source, scReads, scStores, node, c, readsMid, stores) and + reads = TAccessPathCons(c, readsMid) + ) + or + // flow-through step; match outer stores/reads with inner store/read summary contexts + exists(DF::PathNode mid, AccessPath innerScReads, AccessPath innerScStores | + nodeReachesSubpathArg(source, scReads, scStores, mid, innerScReads, innerScStores) and + subpathArgReachesOut(mid, innerScReads, innerScStores, node, reads, stores) + ) + } + + pragma[nomagic] + private predicate nodeReachesStore( + DF::PathNode source, AccessPath scReads, AccessPath scStores, DF::PathNode node, ContentSet c, + AccessPath reads, AccessPath stores + ) { + exists(DF::PathNode mid | + nodeReaches(source, scReads, scStores, mid, reads, stores) and + storeStep(mid.getNode(), mid.getState(), c, node.getNode(), node.getState(), + node.getConfiguration()) and + pathSucc(mid, node) + ) + } + + pragma[nomagic] + private predicate nodeReachesRead( + DF::PathNode source, AccessPath scReads, AccessPath scStores, DF::PathNode node, ContentSet c, + AccessPath reads, AccessPath stores + ) { + exists(DF::PathNode mid | + nodeReaches(source, scReads, scStores, mid, reads, stores) and + readStep(mid.getNode(), mid.getState(), c, node.getNode(), node.getState(), + node.getConfiguration()) and + pathSucc(mid, node) + ) + } + + pragma[nomagic] + private predicate nodeReachesSubpathArg( + DF::PathNode source, AccessPath scReads, AccessPath scStores, DF::PathNode arg, + AccessPath reads, AccessPath stores + ) { + nodeReaches(source, scReads, scStores, arg, reads, stores) and + DF::PathGraph::subpaths(arg, _, _, _) + } + + pragma[nomagic] + private predicate subpathArgReachesOut( + DF::PathNode arg, AccessPath scReads, AccessPath scStores, DF::PathNode out, AccessPath reads, + AccessPath stores + ) { + exists(DF::PathNode source, DF::PathNode ret | + nodeReaches(source, scReads, scStores, ret, reads, stores) and + DF::PathGraph::subpaths(arg, source, ret, out) + ) + } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index 2f04ba350f4..d35b741fb0c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -12,14 +12,6 @@ private import semmle.code.csharp.dispatch.RuntimeCallable private import semmle.code.csharp.frameworks.system.Collections private import semmle.code.csharp.frameworks.system.collections.Generic -private predicate summarizedCallable(DataFlowCallable c) { - c instanceof FlowSummary::SummarizedCallable - or - FlowSummaryImpl::Private::summaryReturnNode(_, TJumpReturnKind(c, _)) - or - c = interpretElement(_, _, _, _, _, _) -} - /** * Gets a source declaration of callable `c` that has a body or has * a flow summary. @@ -29,9 +21,6 @@ private predicate summarizedCallable(DataFlowCallable c) { */ DotNet::Callable getCallableForDataFlow(DotNet::Callable c) { exists(DotNet::Callable unboundDecl | unboundDecl = c.getUnboundDeclaration() | - summarizedCallable(unboundDecl) and - result = unboundDecl - or result.hasBody() and if unboundDecl.getFile().fromSource() then @@ -81,17 +70,46 @@ newtype TReturnKind = v = def.getSourceVariable().getAssignable() ) } or - TJumpReturnKind(DataFlowCallable target, ReturnKind rk) { - rk instanceof NormalReturnKind and + TJumpReturnKind(Callable target, ReturnKind rk) { + target.isUnboundDeclaration() and ( - target instanceof Constructor or - not target.getReturnType() instanceof VoidType + rk instanceof NormalReturnKind and + ( + target instanceof Constructor or + not target.getReturnType() instanceof VoidType + ) + or + exists(target.getParameter(rk.(OutRefReturnKind).getPosition())) ) - or - exists(target.getParameter(rk.(OutRefReturnKind).getPosition())) } +/** + * A summarized callable where the summary should be used for dataflow analysis. + */ +class DataFlowSummarizedCallable instanceof FlowSummary::SummarizedCallable { + DataFlowSummarizedCallable() { + not this.fromSource() + or + this.fromSource() and not this.isAutoGenerated() + } + + string toString() { result = super.toString() } +} + private module Cached { + /** + * The following heuristic is used to rank when to use source code or when to use summaries for DataFlowCallables. + * 1. Use hand written summaries. + * 2. Use source code. + * 3. Use auto generated summaries. + */ + cached + newtype TDataFlowCallable = + TDotNetCallable(DotNet::Callable c) { + c.isUnboundDeclaration() and not c instanceof DataFlowSummarizedCallable + } or + TSummarizedCallable(DataFlowSummarizedCallable sc) + cached newtype TDataFlowCall = TNonDelegateCall(ControlFlow::Nodes::ElementNode cfn, DispatchCall dc) { @@ -108,7 +126,7 @@ private module Cached { // No need to include calls that are compiled from source not call.getImplementation().getMethod().compiledFromSource() } or - TSummaryCall(FlowSummary::SummarizedCallable c, Node receiver) { + TSummaryCall(FlowSummaryImpl::Public::SummarizedCallable c, Node receiver) { FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) } @@ -144,7 +162,7 @@ private module DispatchImpl { * call is a delegate call, or if the qualifier accesses a parameter of * the enclosing callable `c` (including the implicit `this` parameter). */ - predicate mayBenefitFromCallContext(NonDelegateDataFlowCall call, Callable c) { + predicate mayBenefitFromCallContext(NonDelegateDataFlowCall call, DataFlowCallable c) { c = call.getEnclosingCallable() and call.getDispatchCall().mayBenefitFromCallContext() } @@ -154,7 +172,7 @@ private module DispatchImpl { * restricted to those `call`s for which a context might make a difference. */ DataFlowCallable viableImplInCallContext(NonDelegateDataFlowCall call, DataFlowCall ctx) { - result = + result.getUnderlyingCallable() = call.getDispatchCall() .getADynamicTargetInCallContext(ctx.(NonDelegateDataFlowCall).getDispatchCall()) .getUnboundDeclaration() @@ -233,13 +251,13 @@ class ImplicitCapturedReturnKind extends ReturnKind, TImplicitCapturedReturnKind * one API entry point and out of another. */ class JumpReturnKind extends ReturnKind, TJumpReturnKind { - private DataFlowCallable target; + private Callable target; private ReturnKind rk; JumpReturnKind() { this = TJumpReturnKind(target, rk) } /** Gets the target of the jump. */ - DataFlowCallable getTarget() { result = target } + Callable getTarget() { result = target } /** Gets the return kind of the target. */ ReturnKind getTargetReturnKind() { result = rk } @@ -247,8 +265,24 @@ class JumpReturnKind extends ReturnKind, TJumpReturnKind { override string toString() { result = "jump to " + target } } -class DataFlowCallable extends DotNet::Callable { - DataFlowCallable() { this.isUnboundDeclaration() } +/** A callable used for data flow. */ +class DataFlowCallable extends TDataFlowCallable { + /** Get the underlying source code callable, if any. */ + DotNet::Callable asCallable() { this = TDotNetCallable(result) } + + /** Get the underlying summarized callable, if any. */ + FlowSummary::SummarizedCallable asSummarizedCallable() { this = TSummarizedCallable(result) } + + /** Get the underlying callable. */ + DotNet::Callable getUnderlyingCallable() { + result = this.asCallable() or result = this.asSummarizedCallable() + } + + /** Gets a textual representation of this dataflow callable. */ + string toString() { result = this.getUnderlyingCallable().toString() } + + /** Get the location of this dataflow callable. */ + Location getLocation() { result = this.getUnderlyingCallable().getLocation() } } /** A call relevant for data flow. */ @@ -306,18 +340,32 @@ class NonDelegateDataFlowCall extends DataFlowCall, TNonDelegateCall { DispatchCall getDispatchCall() { result = dc } override DataFlowCallable getARuntimeTarget() { - result = getCallableForDataFlow(dc.getADynamicTarget()) + result.asCallable() = getCallableForDataFlow(dc.getADynamicTarget()) or - result = dc.getAStaticTarget().getUnboundDeclaration() and - summarizedCallable(result) and - not result instanceof RuntimeCallable + exists(Callable c, boolean static | + result.asSummarizedCallable() = c and + c = this.getATarget(static) + | + static = false + or + static = true and not c instanceof RuntimeCallable + ) + } + + /** Gets a static or dynamic target of this call. */ + Callable getATarget(boolean static) { + result = dc.getADynamicTarget().getUnboundDeclaration() and static = false + or + result = dc.getAStaticTarget().getUnboundDeclaration() and static = true } override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } override DataFlow::ExprNode getNode() { result.getControlFlowNode() = cfn } - override DataFlowCallable getEnclosingCallable() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallable() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override string toString() { result = cfn.toString() } @@ -345,7 +393,9 @@ class ExplicitDelegateLikeDataFlowCall extends DelegateDataFlowCall, TExplicitDe override DataFlow::ExprNode getNode() { result.getControlFlowNode() = cfn } - override DataFlowCallable getEnclosingCallable() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallable() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override string toString() { result = cfn.toString() } @@ -363,13 +413,15 @@ class TransitiveCapturedDataFlowCall extends DataFlowCall, TTransitiveCapturedCa TransitiveCapturedDataFlowCall() { this = TTransitiveCapturedCall(cfn, target) } - override DataFlowCallable getARuntimeTarget() { result = target } + override DataFlowCallable getARuntimeTarget() { result.getUnderlyingCallable() = target } override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } override DataFlow::ExprNode getNode() { none() } - override DataFlowCallable getEnclosingCallable() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallable() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override string toString() { result = "[transitive] " + cfn.toString() } @@ -384,14 +436,16 @@ class CilDataFlowCall extends DataFlowCall, TCilCall { override DataFlowCallable getARuntimeTarget() { // There is no dispatch library for CIL, so do not consider overrides for now - result = getCallableForDataFlow(call.getTarget()) + result.getUnderlyingCallable() = getCallableForDataFlow(call.getTarget()) } override ControlFlow::Nodes::ElementNode getControlFlowNode() { none() } override DataFlow::ExprNode getNode() { result.getExpr() = call } - override DataFlowCallable getEnclosingCallable() { result = call.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallable() { + result.getUnderlyingCallable() = call.getEnclosingCallable() + } override string toString() { result = call.toString() } @@ -406,7 +460,7 @@ class CilDataFlowCall extends DataFlowCall, TCilCall { * the method `Select`. */ class SummaryCall extends DelegateDataFlowCall, TSummaryCall { - private FlowSummary::SummarizedCallable c; + private FlowSummaryImpl::Public::SummarizedCallable c; private Node receiver; SummaryCall() { this = TSummaryCall(c, receiver) } @@ -422,7 +476,7 @@ class SummaryCall extends DelegateDataFlowCall, TSummaryCall { override DataFlow::Node getNode() { none() } - override DataFlowCallable getEnclosingCallable() { result = c } + override DataFlowCallable getEnclosingCallable() { result.asSummarizedCallable() = c } override string toString() { result = "[summary] call to " + receiver + " in " + c } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index fb806910898..fb773ea89f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll index fb806910898..fb773ea89f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll index fb806910898..fb773ea89f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll index fb806910898..fb773ea89f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll index fb806910898..fb773ea89f8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll @@ -94,15 +94,19 @@ abstract class Configuration extends string { predicate isBarrierGuard(BarrierGuard guard) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. */ predicate isAdditionalFlowStep(Node node1, Node node2) { none() } /** - * Holds if the additional flow step from `node1` to `node2` must be taken - * into account in the analysis. This step is only applicable in `state1` and - * updates the flow state to `state2`. + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. */ predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { none() @@ -112,7 +116,7 @@ abstract class Configuration extends string { * Holds if an arbitrary number of implicit read steps of content `c` may be * taken at `node`. */ - predicate allowImplicitRead(Node node, Content c) { none() } + predicate allowImplicitRead(Node node, ContentSet c) { none() } /** * Gets the virtual dispatch branching limit when calculating field flow. @@ -166,6 +170,14 @@ abstract class Configuration extends string { */ int explorationLimit() { none() } + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + /** * Holds if there is a partial data flow path from `source` to `node`. The * approximate distance between `node` and the closest source is `dist` and @@ -345,9 +357,13 @@ private predicate fullBarrier(NodeEx node, Configuration config) { pragma[nomagic] private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { - exists(Node n | - node.asNode() = n and + exists(Node n | node.asNode() = n | config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) ) } @@ -477,8 +493,9 @@ private predicate additionalJumpStateStep( ) } -private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { - read(node1.asNode(), c, node2.asNode()) and +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and stepFilter(node1, node2, config) or exists(Node n | @@ -488,6 +505,37 @@ private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration conf ) } +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] private predicate store( NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config ) { @@ -565,9 +613,9 @@ private module Stage1 { ) or // read - exists(Content c | - fwdFlowRead(c, node, cc, config) and - fwdFlowConsCand(c, config) + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) ) or // flow into a callable @@ -591,10 +639,10 @@ private module Stage1 { private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } pragma[nomagic] - private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { exists(NodeEx mid | fwdFlow(mid, cc, config) and - read(mid, c, node, config) + readSet(mid, c, node, config) ) } @@ -612,6 +660,16 @@ private module Stage1 { ) } + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + pragma[nomagic] private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { exists(RetNodeEx ret | @@ -704,9 +762,9 @@ private module Stage1 { ) or // read - exists(NodeEx mid, Content c | - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and revFlow(mid, toReturn, pragma[only_bind_into](config)) ) or @@ -732,10 +790,10 @@ private module Stage1 { */ pragma[nomagic] private predicate revFlowConsCand(Content c, Configuration config) { - exists(NodeEx mid, NodeEx node | + exists(NodeEx mid, NodeEx node, ContentSet cs | fwdFlow(node, pragma[only_bind_into](config)) and - read(node, c, mid, config) and - fwdFlowConsCand(c, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) ) } @@ -754,7 +812,8 @@ private module Stage1 { * Holds if `c` is the target of both a read and a store in the flow covered * by `revFlow`. */ - private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { revFlowConsCand(c, conf) and revFlowStore(c, _, _, conf) } @@ -853,8 +912,8 @@ private module Stage1 { pragma[nomagic] predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and - revFlow(n2, pragma[only_bind_into](config)) and - read(n1, c, n2, pragma[only_bind_into](config)) + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) } pragma[nomagic] @@ -864,7 +923,10 @@ private module Stage1 { predicate revFlow( NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config ) { - revFlow(node, toReturn, config) and exists(state) and exists(returnAp) and exists(ap) + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) } private predicate throughFlowNodeCand(NodeEx node, Configuration config) { @@ -1110,8 +1172,8 @@ private module Stage2 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } bindingset[node1, state1, config] bindingset[node2, state2, config] @@ -1139,11 +1201,26 @@ private module Stage2 { private predicate flowIntoCall = flowIntoCallNodeCand1/5; + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + bindingset[node, state, ap, config] private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { - PrevStage::revFlowState(state, config) and + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and exists(ap) and - not stateBarrier(node, state, config) + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) } bindingset[ap, contentType] @@ -1198,7 +1275,7 @@ private module Stage2 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -1566,7 +1643,7 @@ private module Stage2 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -1604,10 +1681,24 @@ private module Stage2 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -1698,7 +1789,8 @@ private module LocalFlowBigStep { private class FlowCheckNode extends NodeEx { FlowCheckNode() { castNode(this.asNode()) or - clearsContentCached(this.asNode(), _) + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) } } @@ -1706,18 +1798,31 @@ private module LocalFlowBigStep { * Holds if `node` can be the first node in a maximal subsequence of local * flow steps in a dataflow path. */ - predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { Stage2::revFlow(node, state, config) and ( - sourceNode(node, state, config) or - jumpStep(_, node, config) or - additionalJumpStep(_, node, config) or - additionalJumpStateStep(_, _, node, state, config) or - node instanceof ParamNodeEx or - node.asNode() instanceof OutNodeExt or - store(_, _, node, _, config) or - read(_, _, node, config) or + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) ) } @@ -1731,12 +1836,15 @@ private module LocalFlowBigStep { additionalJumpStep(node, next, config) or flowIntoCallNodeCand1(_, node, next, config) or flowOutOfCallNodeCand1(_, node, next, config) or - store(node, _, next, _, config) or - read(node, _, next, config) + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) ) or exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state ) or Stage2::revFlow(node, state, config) and @@ -1770,42 +1878,40 @@ private module LocalFlowBigStep { */ pragma[nomagic] private predicate localFlowStepPlus( - NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, - DataFlowType t, Configuration config, LocalCallContext cc + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc ) { not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and ( - localFlowEntry(node1, pragma[only_bind_into](state1), pragma[only_bind_into](config)) and + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and ( localFlowStepNodeCand1(node1, node2, config) and - state1 = state2 and preservesValue = true and - t = node1.getDataFlowType() // irrelevant dummy value + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) or - additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and preservesValue = false and t = node2.getDataFlowType() ) and node1 != node2 and cc.relevantFor(node1.getEnclosingCallable()) and - not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) or exists(NodeEx mid | - localFlowStepPlus(node1, state1, mid, pragma[only_bind_into](state2), preservesValue, t, + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, pragma[only_bind_into](config), cc) and localFlowStepNodeCand1(mid, node2, config) and not mid instanceof FlowCheckNode and - Stage2::revFlow(node2, pragma[only_bind_into](state2), pragma[only_bind_into](config)) + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) ) or - exists(NodeEx mid, FlowState st | - localFlowStepPlus(node1, state1, mid, st, _, _, pragma[only_bind_into](config), cc) and - additionalLocalFlowStepNodeCand2(mid, st, node2, state2, config) and + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and not mid instanceof FlowCheckNode and preservesValue = false and - t = node2.getDataFlowType() and - Stage2::revFlow(node2, state2, pragma[only_bind_into](config)) + t = node2.getDataFlowType() ) ) } @@ -1819,9 +1925,19 @@ private module LocalFlowBigStep { NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, AccessPathFrontNil apf, Configuration config, LocalCallContext callContext ) { - localFlowStepPlus(node1, state1, node2, state2, preservesValue, apf.getType(), config, - callContext) and - localFlowExit(node2, state2, config) + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) } } @@ -1879,8 +1995,8 @@ private module Stage3 { bindingset[call, c, innercc] private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } private predicate localStep( NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, @@ -1894,7 +2010,34 @@ private module Stage3 { private predicate flowIntoCall = flowIntoCallNodeCand2/5; pragma[nomagic] - private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } pragma[nomagic] private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } @@ -1903,8 +2046,13 @@ private module Stage3 { private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { exists(state) and exists(config) and - not clear(node, ap) and - if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) } bindingset[ap, contentType] @@ -1963,7 +2111,7 @@ private module Stage3 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -2331,7 +2479,7 @@ private module Stage3 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -2369,10 +2517,24 @@ private module Stage3 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -2693,9 +2855,8 @@ private module Stage4 { if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() } - bindingset[node, cc, config] - private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { - localFlowEntry(node, _, config) and + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { result = getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), node.getEnclosingCallable()) @@ -2791,7 +2952,7 @@ private module Stage4 { or exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | fwdFlow(mid, state0, cc, argAp, ap0, config) and - localCc = getLocalCc(mid, cc, config) + localCc = getLocalCc(mid, cc) | localStep(mid, state0, node, state, true, _, config, localCc) and ap = ap0 @@ -3159,7 +3320,7 @@ private module Stage4 { Configuration config ) { exists(Ap ap2, Content c | - store(node1, tc, node2, contentType, config) and + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and revFlowConsCand(ap2, c, ap1, config) ) @@ -3197,10 +3358,24 @@ private module Stage4 { storeStepFwd(_, ap, tc, _, _, config) } - predicate consCand(TypedContent tc, Ap ap, Configuration config) { + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { storeStepCand(_, ap, tc, _, _, config) } + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + pragma[noinline] private predicate parameterFlow( ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config @@ -3269,17 +3444,28 @@ private Configuration unbindConf(Configuration conf) { exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) } -private predicate nodeMayUseSummary( - NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config ) { - exists(DataFlowCallable c, AccessPathApprox apa0 | - Stage4::parameterMayFlowThrough(_, c, apa, _) and + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and Stage4::revFlow(n, state, true, _, apa0, config) and Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and n.getEnclosingCallable() = c ) } +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + private newtype TSummaryCtx = TSummaryCtxNone() or TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { @@ -3475,7 +3661,7 @@ private newtype TPathNode = * of dereference operations needed to get from the value in the node to the * tracked object. The final type indicates the type of the tracked object. */ -abstract private class AccessPath extends TAccessPath { +private class AccessPath extends TAccessPath { /** Gets the head of this access path, if any. */ abstract TypedContent getHead(); @@ -3690,11 +3876,14 @@ abstract private class PathNodeImpl extends PathNode { abstract NodeEx getNodeEx(); predicate isHidden() { - hiddenNode(this.getNodeEx().asNode()) and - not this.isSource() and - not this instanceof PathNodeSink - or - this.getNodeEx() instanceof TNodeImplicitRead + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) } private string ppAp() { @@ -4171,10 +4360,16 @@ private module Subpaths { exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | localFlowBigStep(n1, _, n2, _, _, _, _, _) or store(n1, _, n2, _, _) or - read(n1, _, n2, _) + readSet(n1, _, n2, _) ) } + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + /** * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through * a subpath between `par` and `ret` with the connecting edges `arg -> par` and @@ -4182,15 +4377,13 @@ private module Subpaths { */ predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | - pragma[only_bind_into](arg).getASuccessor() = par and - pragma[only_bind_into](arg).getASuccessor() = out0 and - subpaths03(arg, p, localStepToHidden*(ret), o, sout, apout) and + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and not ret.isHidden() and - par.getNodeEx() = p and - out0.getNodeEx() = o and - out0.getState() = sout and - out0.getAp() = apout and - (out = out0 or out = out0.projectToSink()) + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() ) } @@ -4526,7 +4719,11 @@ private module FlowExploration { or exists(PartialPathNodeRev mid | revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and - not clearsContentCached(node.asNode(), ap.getHead()) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() @@ -4542,7 +4739,11 @@ private module FlowExploration { partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and not fullBarrier(node, config) and not stateBarrier(node, state, config) and - not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and if node.asNode() instanceof CastingNode then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() @@ -4976,6 +5177,7 @@ private module FlowExploration { ) } + pragma[nomagic] private predicate revPartialPathStep( PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll index 50dcb8901ea..95b34f15dad 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll @@ -216,10 +216,9 @@ private module LambdaFlow { or // jump step exists(Node mid, DataFlowType t0 | - revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and + revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and toReturn = false and - toJump = true and - lastCall = TDataFlowCallNone() + toJump = true | jumpStepCached(node, mid) and t = t0 @@ -305,7 +304,7 @@ cached private module Cached { /** * If needed, call this predicate from `DataFlowImplSpecific.qll` in order to - * force a stage-dependency on the `DataFlowImplCommon.qll` stage and therby + * force a stage-dependency on the `DataFlowImplCommon.qll` stage and thereby * collapsing the two stages. */ cached @@ -326,7 +325,10 @@ private module Cached { predicate jumpStepCached(Node node1, Node node2) { jumpStep(node1, node2) } cached - predicate clearsContentCached(Node n, Content c) { clearsContent(n, c) } + predicate clearsContentCached(Node n, ContentSet c) { clearsContent(n, c) } + + cached + predicate expectsContentCached(Node n, ContentSet c) { expectsContent(n, c) } cached predicate isUnreachableInCallCached(Node n, DataFlowCall call) { isUnreachableInCall(n, call) } @@ -373,7 +375,7 @@ private module Cached { // For reads, `x.f`, we want to check that the tracked type after the read (which // is obtained by popping the head of the access path stack) is compatible with // the type of `x.f`. - read(_, _, n) + readSet(_, _, n) } cached @@ -469,7 +471,7 @@ private module Cached { // read exists(Node mid | parameterValueFlowCand(p, mid, false) and - read(mid, _, node) and + readSet(mid, _, node) and read = true ) or @@ -657,8 +659,10 @@ private module Cached { * Holds if `arg` flows to `out` through a call using only * value-preserving steps and a single read step, not taking call * contexts into account, thus representing a getter-step. + * + * This predicate is exposed for testing only. */ - predicate getterStep(ArgNode arg, Content c, Node out) { + predicate getterStep(ArgNode arg, ContentSet c, Node out) { argumentValueFlowsThrough(arg, TReadStepTypesSome(_, c, _), out) } @@ -781,8 +785,12 @@ private module Cached { parameterValueFlow(p, n.getPreUpdateNode(), TReadStepTypesNone()) } - private predicate store( - Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + cached + predicate readSet(Node node1, ContentSet c, Node node2) { readStep(node1, c, node2) } + + cached + predicate storeSet( + Node node1, ContentSet c, Node node2, DataFlowType contentType, DataFlowType containerType ) { storeStep(node1, c, node2) and contentType = getNodeDataFlowType(node1) and @@ -794,14 +802,19 @@ private module Cached { | argumentValueFlowsThrough(n2, TReadStepTypesSome(containerType, c, contentType), n1) or - read(n2, c, n1) and + readSet(n2, c, n1) and contentType = getNodeDataFlowType(n1) and containerType = getNodeDataFlowType(n2) ) } - cached - predicate read(Node node1, Content c, Node node2) { readStep(node1, c, node2) } + private predicate store( + Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + ) { + exists(ContentSet cs | + c = cs.getAStoreContent() and storeSet(node1, cs, node2, contentType, containerType) + ) + } /** * Holds if data can flow from `node1` to `node2` via a direct assignment to @@ -932,16 +945,16 @@ class CastingNode extends Node { } private predicate readStepWithTypes( - Node n1, DataFlowType container, Content c, Node n2, DataFlowType content + Node n1, DataFlowType container, ContentSet c, Node n2, DataFlowType content ) { - read(n1, c, n2) and + readSet(n1, c, n2) and container = getNodeDataFlowType(n1) and content = getNodeDataFlowType(n2) } private newtype TReadStepTypesOption = TReadStepTypesNone() or - TReadStepTypesSome(DataFlowType container, Content c, DataFlowType content) { + TReadStepTypesSome(DataFlowType container, ContentSet c, DataFlowType content) { readStepWithTypes(_, container, c, _, content) } @@ -950,7 +963,7 @@ private class ReadStepTypesOption extends TReadStepTypesOption { DataFlowType getContainerType() { this = TReadStepTypesSome(result, _, _) } - Content getContent() { this = TReadStepTypesSome(_, result, _) } + ContentSet getContent() { this = TReadStepTypesSome(_, result, _) } DataFlowType getContentType() { this = TReadStepTypesSome(_, _, result) } @@ -1325,8 +1338,6 @@ abstract class AccessPathFront extends TAccessPathFront { abstract boolean toBoolNonEmpty(); TypedContent getHead() { this = TFrontHead(result) } - - predicate isClearedAt(Node n) { clearsContentCached(n, this.getHead().getContent()) } } class AccessPathFrontNil extends AccessPathFront, TFrontNil { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll new file mode 100644 index 00000000000..fb773ea89f8 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll @@ -0,0 +1,5389 @@ +/** + * Provides an implementation of global (interprocedural) data flow. This file + * re-exports the local (intraprocedural) data flow analysis from + * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed + * through the `Configuration` class. This file exists in several identical + * copies, allowing queries to use multiple `Configuration` classes that depend + * on each other without introducing mutual recursion among those configurations. + */ + +private import DataFlowImplCommon +private import DataFlowImplSpecific::Private +import DataFlowImplSpecific::Public +import DataFlowImplCommonPublic + +/** + * A configuration of interprocedural data flow analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the global data flow library must define its own unique extension + * of this abstract class. To create a configuration, extend this class with + * a subclass whose characteristic predicate is a unique singleton string. + * For example, write + * + * ```ql + * class MyAnalysisConfiguration extends DataFlow::Configuration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isBarrier`. + * // Optionally override `isAdditionalFlowStep`. + * } + * ``` + * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and + * the edges are those data-flow steps that preserve the value of the node + * along with any additional edges defined by `isAdditionalFlowStep`. + * Specifying nodes in `isBarrier` will remove those nodes from the graph, and + * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going + * and/or out-going edges from those nodes, respectively. + * + * Then, to query whether there is flow between some `source` and `sink`, + * write + * + * ```ql + * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) + * ``` + * + * Multiple configurations can coexist, but two classes extending + * `DataFlow::Configuration` should never depend on each other. One of them + * should instead depend on a `DataFlow2::Configuration`, a + * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. + */ +abstract class Configuration extends string { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant data flow source. + */ + predicate isSource(Node source) { none() } + + /** + * Holds if `source` is a relevant data flow source with the given initial + * `state`. + */ + predicate isSource(Node source, FlowState state) { none() } + + /** + * Holds if `sink` is a relevant data flow sink. + */ + predicate isSink(Node sink) { none() } + + /** + * Holds if `sink` is a relevant data flow sink accepting `state`. + */ + predicate isSink(Node source, FlowState state) { none() } + + /** + * Holds if data flow through `node` is prohibited. This completely removes + * `node` from the data flow graph. + */ + predicate isBarrier(Node node) { none() } + + /** + * Holds if data flow through `node` is prohibited when the flow state is + * `state`. + */ + predicate isBarrier(Node node, FlowState state) { none() } + + /** Holds if data flow into `node` is prohibited. */ + predicate isBarrierIn(Node node) { none() } + + /** Holds if data flow out of `node` is prohibited. */ + predicate isBarrierOut(Node node) { none() } + + /** Holds if data flow through nodes guarded by `guard` is prohibited. */ + predicate isBarrierGuard(BarrierGuard guard) { none() } + + /** + * Holds if data flow through nodes guarded by `guard` is prohibited when + * the flow state is `state` + */ + predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + */ + predicate isAdditionalFlowStep(Node node1, Node node2) { none() } + + /** + * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { + none() + } + + /** + * Holds if an arbitrary number of implicit read steps of content `c` may be + * taken at `node`. + */ + predicate allowImplicitRead(Node node, ContentSet c) { none() } + + /** + * Gets the virtual dispatch branching limit when calculating field flow. + * This can be overridden to a smaller value to improve performance (a + * value of 0 disables field flow), or a larger value to get more results. + */ + int fieldFlowBranchLimit() { result = 2 } + + /** + * Gets a data flow configuration feature to add restrictions to the set of + * valid flow paths. + * + * - `FeatureHasSourceCallContext`: + * Assume that sources have some existing call context to disallow + * conflicting return-flow directly following the source. + * - `FeatureHasSinkCallContext`: + * Assume that sinks have some existing call context to disallow + * conflicting argument-to-parameter flow directly preceding the sink. + * - `FeatureEqualSourceSinkCallContext`: + * Implies both of the above and additionally ensures that the entire flow + * path preserves the call context. + */ + FlowFeature getAFeature() { none() } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + */ + predicate hasFlow(Node source, Node sink) { flowsTo(source, sink, this) } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + * + * The corresponding paths are generated from the end-points and the graph + * included in the module `PathGraph`. + */ + predicate hasFlowPath(PathNode source, PathNode sink) { flowsTo(source, sink, _, _, this) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowTo(Node sink) { this.hasFlow(_, sink) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } + + /** + * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * measured in approximate number of interprocedural steps. + */ + int explorationLimit() { none() } + + /** + * Holds if hidden nodes should be included in the data flow graph. + * + * This feature should only be used for debugging or when the data flow graph + * is not visualized (for example in a `path-problem` query). + */ + predicate includeHiddenNodes() { none() } + + /** + * Holds if there is a partial data flow path from `source` to `node`. The + * approximate distance between `node` and the closest source is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards sink definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sources is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + */ + final predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + partialFlow(source, node, this) and + dist = node.getSourceDistance() + } + + /** + * Holds if there is a partial data flow path from `node` to `sink`. The + * approximate distance between `node` and the closest sink is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards source definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sinks is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + * + * Note that reverse flow has slightly lower precision than the corresponding + * forward flow, as reverse flow disregards type pruning among other features. + */ + final predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + revPartialFlow(node, sink, this) and + dist = node.getSinkDistance() + } +} + +/** + * This class exists to prevent mutual recursion between the user-overridden + * member predicates of `Configuration` and the rest of the data-flow library. + * Good performance cannot be guaranteed in the presence of such recursion, so + * it should be replaced by using more than one copy of the data flow library. + */ +abstract private class ConfigurationRecursionPrevention extends Configuration { + bindingset[this] + ConfigurationRecursionPrevention() { any() } + + override predicate hasFlow(Node source, Node sink) { + strictcount(Node n | this.isSource(n)) < 0 + or + strictcount(Node n | this.isSource(n, _)) < 0 + or + strictcount(Node n | this.isSink(n)) < 0 + or + strictcount(Node n | this.isSink(n, _)) < 0 + or + strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 + or + strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 + or + super.hasFlow(source, sink) + } +} + +private newtype TNodeEx = + TNodeNormal(Node n) or + TNodeImplicitRead(Node n, boolean hasRead) { + any(Configuration c).allowImplicitRead(n, _) and hasRead = [false, true] + } + +private class NodeEx extends TNodeEx { + string toString() { + result = this.asNode().toString() + or + exists(Node n | this.isImplicitReadNode(n, _) | result = n.toString() + " [Ext]") + } + + Node asNode() { this = TNodeNormal(result) } + + predicate isImplicitReadNode(Node n, boolean hasRead) { this = TNodeImplicitRead(n, hasRead) } + + Node projectToNode() { this = TNodeNormal(result) or this = TNodeImplicitRead(result, _) } + + pragma[nomagic] + private DataFlowCallable getEnclosingCallable0() { + nodeEnclosingCallable(this.projectToNode(), result) + } + + pragma[inline] + DataFlowCallable getEnclosingCallable() { + pragma[only_bind_out](this).getEnclosingCallable0() = pragma[only_bind_into](result) + } + + pragma[nomagic] + private DataFlowType getDataFlowType0() { nodeDataFlowType(this.asNode(), result) } + + pragma[inline] + DataFlowType getDataFlowType() { + pragma[only_bind_out](this).getDataFlowType0() = pragma[only_bind_into](result) + } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.projectToNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +private class ArgNodeEx extends NodeEx { + ArgNodeEx() { this.asNode() instanceof ArgNode } +} + +private class ParamNodeEx extends NodeEx { + ParamNodeEx() { this.asNode() instanceof ParamNode } + + predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { + this.asNode().(ParamNode).isParameterOf(c, pos) + } + + ParameterPosition getPosition() { this.isParameterOf(_, result) } + + predicate allowParameterReturnInSelf() { allowParameterReturnInSelfCached(this.asNode()) } +} + +private class RetNodeEx extends NodeEx { + RetNodeEx() { this.asNode() instanceof ReturnNodeExt } + + ReturnPosition getReturnPosition() { result = getReturnPosition(this.asNode()) } + + ReturnKindExt getKind() { result = this.asNode().(ReturnNodeExt).getKind() } +} + +private predicate inBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierIn(n) + | + config.isSource(n) or config.isSource(n, _) + ) +} + +private predicate outBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierOut(n) + | + config.isSink(n) or config.isSink(n, _) + ) +} + +pragma[nomagic] +private predicate fullBarrier(NodeEx node, Configuration config) { + exists(Node n | node.asNode() = n | + config.isBarrier(n) + or + config.isBarrierIn(n) and + not config.isSource(n) and + not config.isSource(n, _) + or + config.isBarrierOut(n) and + not config.isSink(n) and + not config.isSink(n, _) + or + exists(BarrierGuard g | + config.isBarrierGuard(g) and + n = g.getAGuardedNode() + ) + ) +} + +pragma[nomagic] +private predicate stateBarrier(NodeEx node, FlowState state, Configuration config) { + exists(Node n | node.asNode() = n | + config.isBarrier(n, state) + or + exists(BarrierGuard g | + config.isBarrierGuard(g, state) and + n = g.getAGuardedNode() + ) + ) +} + +pragma[nomagic] +private predicate sourceNode(NodeEx node, FlowState state, Configuration config) { + ( + config.isSource(node.asNode()) and state instanceof FlowStateEmpty + or + config.isSource(node.asNode(), state) + ) and + not fullBarrier(node, config) and + not stateBarrier(node, state, config) +} + +pragma[nomagic] +private predicate sinkNode(NodeEx node, FlowState state, Configuration config) { + ( + config.isSink(node.asNode()) and state instanceof FlowStateEmpty + or + config.isSink(node.asNode(), state) + ) and + not fullBarrier(node, config) and + not stateBarrier(node, state, config) +} + +/** Provides the relevant barriers for a step from `node1` to `node2`. */ +pragma[inline] +private predicate stepFilter(NodeEx node1, NodeEx node2, Configuration config) { + not outBarrier(node1, config) and + not inBarrier(node2, config) and + not fullBarrier(node1, config) and + not fullBarrier(node2, config) +} + +/** + * Holds if data can flow in one local step from `node1` to `node2`. + */ +private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + simpleLocalFlowStepExt(n1, n2) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.asNode() = n and + node2.isImplicitReadNode(n, false) and + not fullBarrier(node1, config) + ) +} + +/** + * Holds if the additional step from `node1` to `node2` does not jump between callables. + */ +private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, n2) and + getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.isImplicitReadNode(n, true) and + node2.asNode() = n and + not fullBarrier(node2, config) + ) +} + +private predicate additionalLocalStateStep( + NodeEx node1, FlowState s1, NodeEx node2, FlowState s2, Configuration config +) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, s1, n2, s2) and + getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) and + not stateBarrier(node1, s1, config) and + not stateBarrier(node2, s2, config) + ) +} + +/** + * Holds if data can flow from `node1` to `node2` in a way that discards call contexts. + */ +private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + jumpStepCached(n1, n2) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +/** + * Holds if the additional step from `node1` to `node2` jumps between callables. + */ +private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, n2) and + getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate additionalJumpStateStep( + NodeEx node1, FlowState s1, NodeEx node2, FlowState s2, Configuration config +) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, s1, n2, s2) and + getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) and + not stateBarrier(node1, s1, config) and + not stateBarrier(node2, s2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +pragma[nomagic] +private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) { + readSet(node1.asNode(), c, node2.asNode()) and + stepFilter(node1, node2, config) + or + exists(Node n | + node2.isImplicitReadNode(n, true) and + node1.isImplicitReadNode(n, _) and + config.allowImplicitRead(n, c) + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(ContentSet cs | + readSet(node1, cs, node2, config) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate clearsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + clearsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +// inline to reduce fan-out via `getAReadContent` +bindingset[c] +private predicate expectsContentEx(NodeEx n, Content c) { + exists(ContentSet cs | + expectsContentCached(n.asNode(), cs) and + pragma[only_bind_out](c) = pragma[only_bind_into](cs).getAReadContent() + ) +} + +pragma[nomagic] +private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) } + +pragma[nomagic] +private predicate store( + NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config +) { + store(node1.asNode(), tc, node2.asNode(), contentType) and + read(_, tc.getContent(), _, config) and + stepFilter(node1, node2, config) +} + +pragma[nomagic] +private predicate viableReturnPosOutEx(DataFlowCall call, ReturnPosition pos, NodeEx out) { + viableReturnPosOut(call, pos, out.asNode()) +} + +pragma[nomagic] +private predicate viableParamArgEx(DataFlowCall call, ParamNodeEx p, ArgNodeEx arg) { + viableParamArg(call, p.asNode(), arg.asNode()) +} + +/** + * Holds if field flow should be used for the given configuration. + */ +private predicate useFieldFlow(Configuration config) { config.fieldFlowBranchLimit() >= 1 } + +private predicate hasSourceCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSourceCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate hasSinkCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSinkCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private module Stage1 { + class ApApprox = Unit; + + class Ap = Unit; + + class ApOption = Unit; + + class Cc = boolean; + + /* Begin: Stage 1 logic. */ + /** + * Holds if `node` is reachable from a source in the configuration `config`. + * + * The Boolean `cc` records whether the node is reached through an + * argument in a call. + */ + predicate fwdFlow(NodeEx node, Cc cc, Configuration config) { + sourceNode(node, _, config) and + if hasSourceCallCtx(config) then cc = true else cc = false + or + exists(NodeEx mid | fwdFlow(mid, cc, config) | + localFlowStep(mid, node, config) or + additionalLocalFlowStep(mid, node, config) or + additionalLocalStateStep(mid, _, node, _, config) + ) + or + exists(NodeEx mid | fwdFlow(mid, _, config) and cc = false | + jumpStep(mid, node, config) or + additionalJumpStep(mid, node, config) or + additionalJumpStateStep(mid, _, node, _, config) + ) + or + // store + exists(NodeEx mid | + useFieldFlow(config) and + fwdFlow(mid, cc, config) and + store(mid, _, node, _, config) + ) + or + // read + exists(ContentSet c | + fwdFlowReadSet(c, node, cc, config) and + fwdFlowConsCandSet(c, _, config) + ) + or + // flow into a callable + exists(NodeEx arg | + fwdFlow(arg, _, config) and + viableParamArgEx(_, node, arg) and + cc = true and + not fullBarrier(node, config) + ) + or + // flow out of a callable + exists(DataFlowCall call | + fwdFlowOut(call, node, false, config) and + cc = false + or + fwdFlowOutFromArg(call, node, config) and + fwdFlowIsEntered(call, cc, config) + ) + } + + private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } + + pragma[nomagic] + private predicate fwdFlowReadSet(ContentSet c, NodeEx node, Cc cc, Configuration config) { + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + readSet(mid, c, node, config) + ) + } + + /** + * Holds if `c` is the target of a store in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node, TypedContent tc | + not fullBarrier(node, config) and + useFieldFlow(config) and + fwdFlow(mid, _, config) and + store(mid, tc, node, _, config) and + c = tc.getContent() + ) + } + + /** + * Holds if `cs` may be interpreted in a read as the target of some store + * into `c`, in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCandSet(ContentSet cs, Content c, Configuration config) { + fwdFlowConsCand(c, config) and + c = cs.getAReadContent() + } + + pragma[nomagic] + private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { + exists(RetNodeEx ret | + fwdFlow(ret, cc, config) and + ret.getReturnPosition() = pos + ) + } + + pragma[nomagic] + private predicate fwdFlowOut(DataFlowCall call, NodeEx out, Cc cc, Configuration config) { + exists(ReturnPosition pos | + fwdFlowReturnPosition(pos, cc, config) and + viableReturnPosOutEx(call, pos, out) and + not fullBarrier(out, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg(DataFlowCall call, NodeEx out, Configuration config) { + fwdFlowOut(call, out, true, config) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered(DataFlowCall call, Cc cc, Configuration config) { + exists(ArgNodeEx arg | + fwdFlow(arg, cc, config) and + viableParamArgEx(call, _, arg) + ) + } + + private predicate stateStepFwd(FlowState state1, FlowState state2, Configuration config) { + exists(NodeEx node1 | + additionalLocalStateStep(node1, state1, _, state2, config) or + additionalJumpStateStep(node1, state1, _, state2, config) + | + fwdFlow(node1, config) + ) + } + + private predicate fwdFlowState(FlowState state, Configuration config) { + sourceNode(_, state, config) + or + exists(FlowState state0 | + fwdFlowState(state0, config) and + stateStepFwd(state0, state, config) + ) + } + + /** + * Holds if `node` is part of a path from a source to a sink in the + * configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from + * the enclosing callable in order to reach a sink. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, Configuration config) { + revFlow0(node, toReturn, config) and + fwdFlow(node, config) + } + + pragma[nomagic] + private predicate revFlow0(NodeEx node, boolean toReturn, Configuration config) { + exists(FlowState state | + fwdFlow(node, pragma[only_bind_into](config)) and + sinkNode(node, state, config) and + fwdFlowState(state, pragma[only_bind_into](config)) and + if hasSinkCallCtx(config) then toReturn = true else toReturn = false + ) + or + exists(NodeEx mid | revFlow(mid, toReturn, config) | + localFlowStep(node, mid, config) or + additionalLocalFlowStep(node, mid, config) or + additionalLocalStateStep(node, _, mid, _, config) + ) + or + exists(NodeEx mid | revFlow(mid, _, config) and toReturn = false | + jumpStep(node, mid, config) or + additionalJumpStep(node, mid, config) or + additionalJumpStateStep(node, _, mid, _, config) + ) + or + // store + exists(Content c | + revFlowStore(c, node, toReturn, config) and + revFlowConsCand(c, config) + ) + or + // read + exists(NodeEx mid, ContentSet c | + readSet(node, c, mid, config) and + fwdFlowConsCandSet(c, _, pragma[only_bind_into](config)) and + revFlow(mid, toReturn, pragma[only_bind_into](config)) + ) + or + // flow into a callable + exists(DataFlowCall call | + revFlowIn(call, node, false, config) and + toReturn = false + or + revFlowInToReturn(call, node, config) and + revFlowIsReturned(call, toReturn, config) + ) + or + // flow out of a callable + exists(ReturnPosition pos | + revFlowOut(pos, config) and + node.(RetNodeEx).getReturnPosition() = pos and + toReturn = true + ) + } + + /** + * Holds if `c` is the target of a read in the flow covered by `revFlow`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node, ContentSet cs | + fwdFlow(node, pragma[only_bind_into](config)) and + readSet(node, cs, mid, config) and + fwdFlowConsCandSet(cs, c, pragma[only_bind_into](config)) and + revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate revFlowStore(Content c, NodeEx node, boolean toReturn, Configuration config) { + exists(NodeEx mid, TypedContent tc | + revFlow(mid, toReturn, pragma[only_bind_into](config)) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + store(node, tc, mid, _, config) and + c = tc.getContent() + ) + } + + /** + * Holds if `c` is the target of both a read and a store in the flow covered + * by `revFlow`. + */ + pragma[nomagic] + predicate revFlowIsReadAndStored(Content c, Configuration conf) { + revFlowConsCand(c, conf) and + revFlowStore(c, _, _, conf) + } + + pragma[nomagic] + predicate viableReturnPosOutNodeCandFwd1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config + ) { + fwdFlowReturnPosition(pos, _, config) and + viableReturnPosOutEx(call, pos, out) + } + + pragma[nomagic] + private predicate revFlowOut(ReturnPosition pos, Configuration config) { + exists(DataFlowCall call, NodeEx out | + revFlow(out, _, config) and + viableReturnPosOutNodeCandFwd1(call, pos, out, config) + ) + } + + pragma[nomagic] + predicate viableParamArgNodeCandFwd1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config + ) { + viableParamArgEx(call, p, arg) and + fwdFlow(arg, config) + } + + pragma[nomagic] + private predicate revFlowIn( + DataFlowCall call, ArgNodeEx arg, boolean toReturn, Configuration config + ) { + exists(ParamNodeEx p | + revFlow(p, toReturn, config) and + viableParamArgNodeCandFwd1(call, p, arg, config) + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn(DataFlowCall call, ArgNodeEx arg, Configuration config) { + revFlowIn(call, arg, true, config) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned(DataFlowCall call, boolean toReturn, Configuration config) { + exists(NodeEx out | + revFlow(out, toReturn, config) and + fwdFlowOutFromArg(call, out, config) + ) + } + + private predicate stateStepRev(FlowState state1, FlowState state2, Configuration config) { + exists(NodeEx node1, NodeEx node2 | + additionalLocalStateStep(node1, state1, node2, state2, config) or + additionalJumpStateStep(node1, state1, node2, state2, config) + | + revFlow(node1, _, pragma[only_bind_into](config)) and + revFlow(node2, _, pragma[only_bind_into](config)) and + fwdFlowState(state1, pragma[only_bind_into](config)) and + fwdFlowState(state2, pragma[only_bind_into](config)) + ) + } + + predicate revFlowState(FlowState state, Configuration config) { + exists(NodeEx node | + sinkNode(node, state, config) and + revFlow(node, _, pragma[only_bind_into](config)) and + fwdFlowState(state, pragma[only_bind_into](config)) + ) + or + exists(FlowState state0 | + revFlowState(state0, config) and + stateStepRev(state, state0, config) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Content c | + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + revFlow(node2, pragma[only_bind_into](config)) and + store(node1, tc, node2, contentType, config) and + c = tc.getContent() and + exists(ap1) + ) + } + + pragma[nomagic] + predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + read(n1, c, n2, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, config) } + + bindingset[node, state, config] + predicate revFlow( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow(node, toReturn, pragma[only_bind_into](config)) and + exists(state) and + exists(returnAp) and + exists(ap) + } + + private predicate throughFlowNodeCand(NodeEx node, Configuration config) { + revFlow(node, true, config) and + fwdFlow(node, true, config) and + not inBarrier(node, config) and + not outBarrier(node, config) + } + + /** Holds if flow may return from `callable`. */ + pragma[nomagic] + private predicate returnFlowCallableNodeCand( + DataFlowCallable callable, ReturnKindExt kind, Configuration config + ) { + exists(RetNodeEx ret | + throughFlowNodeCand(ret, config) and + callable = ret.getEnclosingCallable() and + kind = ret.getKind() + ) + } + + /** + * Holds if flow may enter through `p` and reach a return node making `p` a + * candidate for the origin of a summary. + */ + pragma[nomagic] + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(ReturnKindExt kind | + throughFlowNodeCand(p, config) and + returnFlowCallableNodeCand(c, kind, config) and + p.getEnclosingCallable() = c and + exists(ap) and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = p.getPosition() + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(ArgNodeEx arg, boolean toReturn | + revFlow(arg, toReturn, config) and + revFlowInToReturn(call, arg, config) and + revFlowIsReturned(call, toReturn, config) + ) + } + + predicate stats( + boolean fwd, int nodes, int fields, int conscand, int states, int tuples, Configuration config + ) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, config)) and + fields = count(Content f0 | fwdFlowConsCand(f0, config)) and + conscand = -1 and + states = count(FlowState state | fwdFlowState(state, config)) and + tuples = count(NodeEx n, boolean b | fwdFlow(n, b, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, config)) and + fields = count(Content f0 | revFlowConsCand(f0, config)) and + conscand = -1 and + states = count(FlowState state | revFlowState(state, config)) and + tuples = count(NodeEx n, boolean b | revFlow(n, b, config)) + } + /* End: Stage 1 logic. */ +} + +pragma[noinline] +private predicate localFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + localFlowStep(node1, node2, config) +} + +pragma[noinline] +private predicate additionalLocalFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + additionalLocalFlowStep(node1, node2, config) +} + +pragma[nomagic] +private predicate viableReturnPosOutNodeCand1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config +) { + Stage1::revFlow(out, config) and + Stage1::viableReturnPosOutNodeCandFwd1(call, pos, out, config) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, Configuration config +) { + viableReturnPosOutNodeCand1(call, ret.getReturnPosition(), out, config) and + Stage1::revFlow(ret, config) and + not outBarrier(ret, config) and + not inBarrier(out, config) +} + +pragma[nomagic] +private predicate viableParamArgNodeCand1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config +) { + Stage1::viableParamArgNodeCandFwd1(call, p, arg, config) and + Stage1::revFlow(arg, config) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, Configuration config +) { + viableParamArgNodeCand1(call, p, arg, config) and + Stage1::revFlow(p, config) and + not outBarrier(arg, config) and + not inBarrier(p, config) +} + +/** + * Gets the amount of forward branching on the origin of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int branch(NodeEx n1, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n1, n, conf) or flowIntoCallNodeCand1(_, n1, n, conf) + ) +} + +/** + * Gets the amount of backward branching on the target of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int join(NodeEx n2, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n, n2, conf) or flowIntoCallNodeCand1(_, n, n2, conf) + ) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. The + * `allowsFieldFlow` flag indicates whether the branching is within the limit + * specified by the configuration. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, ret, out, config) and + exists(int b, int j | + b = branch(ret, config) and + j = join(out, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. The `allowsFieldFlow` flag indicates whether + * the branching is within the limit specified by the configuration. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config +) { + flowIntoCallNodeCand1(call, arg, p, config) and + exists(int b, int j | + b = branch(arg, config) and + j = join(p, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +private module Stage2 { + module PrevStage = Stage1; + + class ApApprox = PrevStage::Ap; + + class Ap = boolean; + + class ApNil extends Ap { + ApNil() { this = false } + } + + bindingset[result, ap] + private ApApprox getApprox(Ap ap) { any() } + + private ApNil getApNil(NodeEx node) { PrevStage::revFlow(node, _) and exists(result) } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = true and exists(tc) and exists(tail) } + + pragma[inline] + private Content getHeadContent(Ap ap) { exists(result) and ap = true } + + class ApOption = BooleanOption; + + ApOption apNone() { result = TBooleanNone() } + + ApOption apSome(Ap ap) { result = TBooleanSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSiteDispatch(call, c) + then result = TSpecificCall(call) + else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } + + bindingset[node1, state1, config] + bindingset[node2, state2, config] + private predicate localStep( + NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, + ApNil ap, Configuration config, LocalCc lcc + ) { + ( + preservesValue = true and + localFlowStepNodeCand1(node1, node2, config) and + state1 = state2 + or + preservesValue = false and + additionalLocalFlowStepNodeCand1(node1, node2, config) and + state1 = state2 + or + preservesValue = false and + additionalLocalStateStep(node1, state1, node2, state2, config) + ) and + exists(ap) and + exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand1/5; + + private predicate flowIntoCall = flowIntoCallNodeCand1/5; + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + expectsContentEx(node, c) + ) + } + + bindingset[node, state, ap, config] + private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { + PrevStage::revFlowState(state, pragma[only_bind_into](config)) and + exists(ap) and + not stateBarrier(node, state, config) and + ( + notExpectsContent(node) + or + ap = true and + expectsContentCand(node, config) + ) + } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 2 logic. */ + bindingset[node, state, config] + private predicate flowCand(NodeEx node, FlowState state, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, state, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + pragma[only_bind_out](apa) = pragma[only_bind_out](result) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, state, cc, argAp, ap, config) and + flowCand(node, state, unbindApa(getApprox(ap)), config) and + filter(node, state, ap, config) + } + + pragma[nomagic] + private predicate fwdFlow0( + NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + sourceNode(node, state, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | + fwdFlow(mid, state0, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc) + | + localStep(mid, state0, node, state, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, state0, node, state, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, state, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(mid, state0, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStateStep(mid, state0, node, state, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, state, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, state, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, state, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, state, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, state, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, state, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + fwdFlow(node1, state, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, FlowState state, Cc outercc, Cc innercc, ApOption argAp, + Ap ap, Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, state, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, FlowState state, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, state, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, FlowState state, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, state, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, _, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, state, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, state, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough( + RetNodeEx ret, FlowState state, Ap ap, Configuration config + ) { + fwdFlow(ret, state, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow0(node, state, toReturn, returnAp, ap, config) and + fwdFlow(node, state, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, state, _, _, ap, config) and + sinkNode(node, state, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid, FlowState state0 | + localStep(node, state, mid, state0, true, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + localStep(node, pragma[only_bind_into](state), mid, state0, false, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, state, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), state, _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStateStep(node, state, mid, state0, config) and + revFlow(pragma[only_bind_into](mid), pragma[only_bind_into](state0), _, _, nil, + pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, state, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, state, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, state, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, state, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, state, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, FlowState state, TypedContent tc, NodeEx mid, + boolean toReturn, ApOption returnAp, Configuration config + ) { + revFlow(mid, state, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, state, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, FlowState state, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, FlowState state, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, FlowState state, CcCall ccc | + revFlowOut(call, ret, state, toReturn, returnAp, ap, config) and + fwdFlow(ret, state, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, FlowState state, Configuration config) { + revFlow(node, state, _, _, _, config) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow(node, state, toReturn, returnAp, ap, config) + } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, _, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, FlowState state, Ap ap0, ReturnKindExt kind, ParameterPosition pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), pragma[only_bind_into](state), true, apSome(_), + pragma[only_bind_into](ap0), pragma[only_bind_into](config)) and + fwdFlow(ret, state, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists( + Ap returnAp0, ArgNodeEx arg, FlowState state, boolean toReturn, ApOption returnAp, Ap ap + | + revFlow(arg, state, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats( + boolean fwd, int nodes, int fields, int conscand, int states, int tuples, Configuration config + ) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + states = count(FlowState state | fwdFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(n, state, cc, argAp, ap, config) + ) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + states = count(FlowState state | revFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, boolean b, ApOption retAp, Ap ap | + revFlow(n, state, b, retAp, ap, config) + ) + } + /* End: Stage 2 logic. */ +} + +pragma[nomagic] +private predicate flowOutOfCallNodeCand2( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlowAlias(node1, pragma[only_bind_into](config)) +} + +pragma[nomagic] +private predicate flowIntoCallNodeCand2( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config +) { + flowIntoCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlowAlias(node1, pragma[only_bind_into](config)) +} + +private module LocalFlowBigStep { + /** + * A node where some checking is required, and hence the big-step relation + * is not allowed to step over. + */ + private class FlowCheckNode extends NodeEx { + FlowCheckNode() { + castNode(this.asNode()) or + clearsContentCached(this.asNode(), _) or + expectsContentCached(this.asNode(), _) + } + } + + /** + * Holds if `node` can be the first node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + private predicate localFlowEntry(NodeEx node, FlowState state, Configuration config) { + Stage2::revFlow(node, state, config) and + ( + sourceNode(node, state, config) + or + jumpStep(_, node, config) + or + additionalJumpStep(_, node, config) + or + additionalJumpStateStep(_, _, node, state, config) + or + node instanceof ParamNodeEx + or + node.asNode() instanceof OutNodeExt + or + Stage2::storeStepCand(_, _, _, node, _, config) + or + Stage2::readStepCand(_, _, node, config) + or + node instanceof FlowCheckNode + or + exists(FlowState s | + additionalLocalStateStep(_, s, node, state, config) and + s != state + ) + ) + } + + /** + * Holds if `node` can be the last node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + private predicate localFlowExit(NodeEx node, FlowState state, Configuration config) { + exists(NodeEx next | Stage2::revFlow(next, state, config) | + jumpStep(node, next, config) or + additionalJumpStep(node, next, config) or + flowIntoCallNodeCand1(_, node, next, config) or + flowOutOfCallNodeCand1(_, node, next, config) or + Stage2::storeStepCand(node, _, _, next, _, config) or + Stage2::readStepCand(node, _, next, config) + ) + or + exists(NodeEx next, FlowState s | Stage2::revFlow(next, s, config) | + additionalJumpStateStep(node, state, next, s, config) + or + additionalLocalStateStep(node, state, next, s, config) and + s != state + ) + or + Stage2::revFlow(node, state, config) and + node instanceof FlowCheckNode + or + sinkNode(node, state, config) + } + + pragma[noinline] + private predicate additionalLocalFlowStepNodeCand2( + NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, Configuration config + ) { + additionalLocalFlowStepNodeCand1(node1, node2, config) and + state1 = state2 and + Stage2::revFlow(node1, pragma[only_bind_into](state1), _, _, false, + pragma[only_bind_into](config)) and + Stage2::revFlowAlias(node2, pragma[only_bind_into](state2), _, _, false, + pragma[only_bind_into](config)) + or + additionalLocalStateStep(node1, state1, node2, state2, config) and + Stage2::revFlow(node1, state1, _, _, false, pragma[only_bind_into](config)) and + Stage2::revFlowAlias(node2, state2, _, _, false, pragma[only_bind_into](config)) + } + + /** + * Holds if the local path from `node1` to `node2` is a prefix of a maximal + * subsequence of local flow steps in a dataflow path. + * + * This is the transitive closure of `[additional]localFlowStep` beginning + * at `localFlowEntry`. + */ + pragma[nomagic] + private predicate localFlowStepPlus( + NodeEx node1, FlowState state, NodeEx node2, boolean preservesValue, DataFlowType t, + Configuration config, LocalCallContext cc + ) { + not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and + ( + localFlowEntry(node1, pragma[only_bind_into](state), pragma[only_bind_into](config)) and + ( + localFlowStepNodeCand1(node1, node2, config) and + preservesValue = true and + t = node1.getDataFlowType() and // irrelevant dummy value + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) + or + additionalLocalFlowStepNodeCand2(node1, state, node2, state, config) and + preservesValue = false and + t = node2.getDataFlowType() + ) and + node1 != node2 and + cc.relevantFor(node1.getEnclosingCallable()) and + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) + or + exists(NodeEx mid | + localFlowStepPlus(node1, pragma[only_bind_into](state), mid, preservesValue, t, + pragma[only_bind_into](config), cc) and + localFlowStepNodeCand1(mid, node2, config) and + not mid instanceof FlowCheckNode and + Stage2::revFlow(node2, pragma[only_bind_into](state), pragma[only_bind_into](config)) + ) + or + exists(NodeEx mid | + localFlowStepPlus(node1, state, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, state, node2, state, config) and + not mid instanceof FlowCheckNode and + preservesValue = false and + t = node2.getDataFlowType() + ) + ) + } + + /** + * Holds if `node1` can step to `node2` in one or more local steps and this + * path can occur as a maximal subsequence of local steps in a dataflow path. + */ + pragma[nomagic] + predicate localFlowBigStep( + NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, + AccessPathFrontNil apf, Configuration config, LocalCallContext callContext + ) { + localFlowStepPlus(node1, state1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, state1, config) and + state1 = state2 + or + additionalLocalFlowStepNodeCand2(node1, state1, node2, state2, config) and + state1 != state2 and + preservesValue = false and + apf = TFrontNil(node2.getDataFlowType()) and + callContext.relevantFor(node1.getEnclosingCallable()) and + not exists(DataFlowCall call | call = callContext.(LocalCallContextSpecificCall).getCall() | + isUnreachableInCallCached(node1.asNode(), call) or + isUnreachableInCallCached(node2.asNode(), call) + ) + } +} + +private import LocalFlowBigStep + +private module Stage3 { + module PrevStage = Stage2; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathFront; + + class ApNil = AccessPathFrontNil; + + private ApApprox getApprox(Ap ap) { result = ap.toBoolNonEmpty() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TFrontNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result.getHead() = tc and exists(tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathFrontOption; + + ApOption apNone() { result = TAccessPathFrontNone() } + + ApOption apSome(Ap ap) { result = TAccessPathFrontSome(ap) } + + class Cc = boolean; + + class CcCall extends Cc { + CcCall() { this = true } + + /** Holds if this call context may be `call`. */ + predicate matchesCall(DataFlowCall call) { any() } + } + + class CcNoCall extends Cc { + CcNoCall() { this = false } + } + + Cc ccNone() { result = false } + + CcCall ccSomeCall() { result = true } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { any() } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } + + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { any() } + + private predicate localStep( + NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, + ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, state1, node2, state2, preservesValue, ap, config, _) and exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand2/5; + + private predicate flowIntoCall = flowIntoCallNodeCand2/5; + + pragma[nomagic] + private predicate clearSet(NodeEx node, ContentSet c, Configuration config) { + PrevStage::revFlow(node, config) and + clearsContentCached(node.asNode(), c) + } + + pragma[nomagic] + private predicate clearContent(NodeEx node, Content c, Configuration config) { + exists(ContentSet cs | + PrevStage::readStepCand(_, pragma[only_bind_into](c), _, pragma[only_bind_into](config)) and + c = cs.getAReadContent() and + clearSet(node, cs, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap, Configuration config) { + clearContent(node, ap.getHead().getContent(), config) + } + + pragma[nomagic] + private predicate expectsContentCand(NodeEx node, Ap ap, Configuration config) { + exists(Content c | + PrevStage::revFlow(node, pragma[only_bind_into](config)) and + PrevStage::readStepCand(_, c, _, pragma[only_bind_into](config)) and + expectsContentEx(node, c) and + c = ap.getHead().getContent() + ) + } + + pragma[nomagic] + private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } + + bindingset[node, state, ap, config] + private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { + exists(state) and + exists(config) and + not clear(node, ap, config) and + (if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any()) and + ( + notExpectsContent(node) + or + expectsContentCand(node, ap, config) + ) + } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { + // We need to typecheck stores here, since reverse flow through a getter + // might have a different type here compared to inside the getter. + compatibleTypes(ap.getType(), contentType) + } + + /* Begin: Stage 3 logic. */ + bindingset[node, state, config] + private predicate flowCand(NodeEx node, FlowState state, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, state, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + pragma[only_bind_out](apa) = pragma[only_bind_out](result) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, state, cc, argAp, ap, config) and + flowCand(node, state, unbindApa(getApprox(ap)), config) and + filter(node, state, ap, config) + } + + pragma[nomagic] + private predicate fwdFlow0( + NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + sourceNode(node, state, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | + fwdFlow(mid, state0, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc) + | + localStep(mid, state0, node, state, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, state0, node, state, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, state, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(mid, state0, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStateStep(mid, state0, node, state, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, state, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, state, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, state, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, state, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, state, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, state, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + fwdFlow(node1, state, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, FlowState state, Cc outercc, Cc innercc, ApOption argAp, + Ap ap, Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, state, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, FlowState state, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, state, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, FlowState state, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, state, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, _, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, state, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, state, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough( + RetNodeEx ret, FlowState state, Ap ap, Configuration config + ) { + fwdFlow(ret, state, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow0(node, state, toReturn, returnAp, ap, config) and + fwdFlow(node, state, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, state, _, _, ap, config) and + sinkNode(node, state, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid, FlowState state0 | + localStep(node, state, mid, state0, true, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + localStep(node, pragma[only_bind_into](state), mid, state0, false, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, state, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), state, _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStateStep(node, state, mid, state0, config) and + revFlow(pragma[only_bind_into](mid), pragma[only_bind_into](state0), _, _, nil, + pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, state, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, state, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, state, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, state, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, state, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, FlowState state, TypedContent tc, NodeEx mid, + boolean toReturn, ApOption returnAp, Configuration config + ) { + revFlow(mid, state, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, state, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, FlowState state, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, FlowState state, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, FlowState state, CcCall ccc | + revFlowOut(call, ret, state, toReturn, returnAp, ap, config) and + fwdFlow(ret, state, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, FlowState state, Configuration config) { + revFlow(node, state, _, _, _, config) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow(node, state, toReturn, returnAp, ap, config) + } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, _, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, FlowState state, Ap ap0, ReturnKindExt kind, ParameterPosition pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), pragma[only_bind_into](state), true, apSome(_), + pragma[only_bind_into](ap0), pragma[only_bind_into](config)) and + fwdFlow(ret, state, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists( + Ap returnAp0, ArgNodeEx arg, FlowState state, boolean toReturn, ApOption returnAp, Ap ap + | + revFlow(arg, state, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats( + boolean fwd, int nodes, int fields, int conscand, int states, int tuples, Configuration config + ) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + states = count(FlowState state | fwdFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(n, state, cc, argAp, ap, config) + ) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + states = count(FlowState state | revFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, boolean b, ApOption retAp, Ap ap | + revFlow(n, state, b, retAp, ap, config) + ) + } + /* End: Stage 3 logic. */ +} + +/** + * Holds if `argApf` is recorded as the summary context for flow reaching `node` + * and remains relevant for the following pruning stage. + */ +private predicate flowCandSummaryCtx( + NodeEx node, FlowState state, AccessPathFront argApf, Configuration config +) { + exists(AccessPathFront apf | + Stage3::revFlow(node, state, true, _, apf, config) and + Stage3::fwdFlow(node, state, any(Stage3::CcCall ccc), TAccessPathFrontSome(argApf), apf, config) + ) +} + +/** + * Holds if a length 2 access path approximation with the head `tc` is expected + * to be expensive. + */ +private predicate expensiveLen2unfolding(TypedContent tc, Configuration config) { + exists(int tails, int nodes, int apLimit, int tupleLimit | + tails = strictcount(AccessPathFront apf | Stage3::consCand(tc, apf, config)) and + nodes = + strictcount(NodeEx n, FlowState state | + Stage3::revFlow(n, state, _, _, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + or + flowCandSummaryCtx(n, state, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + ) and + accessPathApproxCostLimits(apLimit, tupleLimit) and + apLimit < tails and + tupleLimit < (tails - 1) * nodes and + not tc.forceHighPrecision() + ) +} + +private newtype TAccessPathApprox = + TNil(DataFlowType t) or + TConsNil(TypedContent tc, DataFlowType t) { + Stage3::consCand(tc, TFrontNil(t), _) and + not expensiveLen2unfolding(tc, _) + } or + TConsCons(TypedContent tc1, TypedContent tc2, int len) { + Stage3::consCand(tc1, TFrontHead(tc2), _) and + len in [2 .. accessPathLimit()] and + not expensiveLen2unfolding(tc1, _) + } or + TCons1(TypedContent tc, int len) { + len in [1 .. accessPathLimit()] and + expensiveLen2unfolding(tc, _) + } + +/** + * Conceptually a list of `TypedContent`s followed by a `DataFlowType`, but only + * the first two elements of the list and its length are tracked. If data flows + * from a source to a given node with a given `AccessPathApprox`, this indicates + * the sequence of dereference operations needed to get from the value in the node + * to the tracked object. The final type indicates the type of the tracked object. + */ +abstract private class AccessPathApprox extends TAccessPathApprox { + abstract string toString(); + + abstract TypedContent getHead(); + + abstract int len(); + + abstract DataFlowType getType(); + + abstract AccessPathFront getFront(); + + /** Gets the access path obtained by popping `head` from this path, if any. */ + abstract AccessPathApprox pop(TypedContent head); +} + +private class AccessPathApproxNil extends AccessPathApprox, TNil { + private DataFlowType t; + + AccessPathApproxNil() { this = TNil(t) } + + override string toString() { result = concat(": " + ppReprType(t)) } + + override TypedContent getHead() { none() } + + override int len() { result = 0 } + + override DataFlowType getType() { result = t } + + override AccessPathFront getFront() { result = TFrontNil(t) } + + override AccessPathApprox pop(TypedContent head) { none() } +} + +abstract private class AccessPathApproxCons extends AccessPathApprox { } + +private class AccessPathApproxConsNil extends AccessPathApproxCons, TConsNil { + private TypedContent tc; + private DataFlowType t; + + AccessPathApproxConsNil() { this = TConsNil(tc, t) } + + override string toString() { + // The `concat` becomes "" if `ppReprType` has no result. + result = "[" + tc.toString() + "]" + concat(" : " + ppReprType(t)) + } + + override TypedContent getHead() { result = tc } + + override int len() { result = 1 } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { head = tc and result = TNil(t) } +} + +private class AccessPathApproxConsCons extends AccessPathApproxCons, TConsCons { + private TypedContent tc1; + private TypedContent tc2; + private int len; + + AccessPathApproxConsCons() { this = TConsCons(tc1, tc2, len) } + + override string toString() { + if len = 2 + then result = "[" + tc1.toString() + ", " + tc2.toString() + "]" + else result = "[" + tc1.toString() + ", " + tc2.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc1 } + + override int len() { result = len } + + override DataFlowType getType() { result = tc1.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc1) } + + override AccessPathApprox pop(TypedContent head) { + head = tc1 and + ( + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + } +} + +private class AccessPathApproxCons1 extends AccessPathApproxCons, TCons1 { + private TypedContent tc; + private int len; + + AccessPathApproxCons1() { this = TCons1(tc, len) } + + override string toString() { + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc } + + override int len() { result = len } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { + head = tc and + ( + exists(TypedContent tc2 | Stage3::consCand(tc, TFrontHead(tc2), _) | + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + or + exists(DataFlowType t | + len = 1 and + Stage3::consCand(tc, TFrontNil(t), _) and + result = TNil(t) + ) + ) + } +} + +/** Gets the access path obtained by popping `tc` from `ap`, if any. */ +private AccessPathApprox pop(TypedContent tc, AccessPathApprox apa) { result = apa.pop(tc) } + +/** Gets the access path obtained by pushing `tc` onto `ap`. */ +private AccessPathApprox push(TypedContent tc, AccessPathApprox apa) { apa = pop(tc, result) } + +private newtype TAccessPathApproxOption = + TAccessPathApproxNone() or + TAccessPathApproxSome(AccessPathApprox apa) + +private class AccessPathApproxOption extends TAccessPathApproxOption { + string toString() { + this = TAccessPathApproxNone() and result = "" + or + this = TAccessPathApproxSome(any(AccessPathApprox apa | result = apa.toString())) + } +} + +private module Stage4 { + module PrevStage = Stage3; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathApprox; + + class ApNil = AccessPathApproxNil; + + private ApApprox getApprox(Ap ap) { result = ap.getFront() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = push(tc, tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathApproxOption; + + ApOption apNone() { result = TAccessPathApproxNone() } + + ApOption apSome(Ap ap) { result = TAccessPathApproxSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = LocalCallContext; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSite(call, c) then result = TSpecificCall(call) else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc] + private LocalCc getLocalCc(NodeEx node, Cc cc) { + result = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + node.getEnclosingCallable()) + } + + private predicate localStep( + NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue, + ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, state1, node2, state2, preservesValue, ap.getFront(), config, lcc) + } + + pragma[nomagic] + private predicate flowOutOfCall( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config + ) { + exists(FlowState state | + flowOutOfCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, pragma[only_bind_into](state), _, _, _, + pragma[only_bind_into](config)) and + PrevStage::revFlowAlias(node1, pragma[only_bind_into](state), _, _, _, + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowIntoCall( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config + ) { + exists(FlowState state | + flowIntoCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, pragma[only_bind_into](state), _, _, _, + pragma[only_bind_into](config)) and + PrevStage::revFlowAlias(node1, pragma[only_bind_into](state), _, _, _, + pragma[only_bind_into](config)) + ) + } + + bindingset[node, state, ap, config] + private predicate filter(NodeEx node, FlowState state, Ap ap, Configuration config) { any() } + + // Type checking is not necessary here as it has already been done in stage 3. + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 4 logic. */ + bindingset[node, state, config] + private predicate flowCand(NodeEx node, FlowState state, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, state, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + pragma[only_bind_out](apa) = pragma[only_bind_out](result) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, state, cc, argAp, ap, config) and + flowCand(node, state, unbindApa(getApprox(ap)), config) and + filter(node, state, ap, config) + } + + pragma[nomagic] + private predicate fwdFlow0( + NodeEx node, FlowState state, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + sourceNode(node, state, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, FlowState state0, Ap ap0, LocalCc localCc | + fwdFlow(mid, state0, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc) + | + localStep(mid, state0, node, state, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, state0, node, state, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, state, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(mid, state0, _, _, nil, pragma[only_bind_into](config)) and + additionalJumpStateStep(mid, state0, node, state, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, state, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, state, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, state, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, state, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, state, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, state, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, FlowState state, Cc cc, ApOption argAp, + Configuration config + ) { + fwdFlow(node1, state, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, FlowState state, Cc outercc, Cc innercc, ApOption argAp, + Ap ap, Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, state, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, FlowState state, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, state, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, FlowState state, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, state, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, _, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, state, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, state, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough( + RetNodeEx ret, FlowState state, Ap ap, Configuration config + ) { + fwdFlow(ret, state, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow0(node, state, toReturn, returnAp, ap, config) and + fwdFlow(node, state, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, state, _, _, ap, config) and + sinkNode(node, state, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid, FlowState state0 | + localStep(node, state, mid, state0, true, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, pragma[only_bind_into](state), _, _, ap, pragma[only_bind_into](config)) and + localStep(node, pragma[only_bind_into](state), mid, state0, false, _, config, _) and + revFlow(mid, state0, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, state, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), state, _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + exists(NodeEx mid, FlowState state0, ApNil nil | + fwdFlow(node, _, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStateStep(node, state, mid, state0, config) and + revFlow(pragma[only_bind_into](mid), pragma[only_bind_into](state0), _, _, nil, + pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, state, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, state, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, state, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, state, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, state, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, FlowState state, TypedContent tc, NodeEx mid, + boolean toReturn, ApOption returnAp, Configuration config + ) { + revFlow(mid, state, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, state, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, FlowState state, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, FlowState state, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, state, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, FlowState state, CcCall ccc | + revFlowOut(call, ret, state, toReturn, returnAp, ap, config) and + fwdFlow(ret, state, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + PrevStage::storeStepCand(node1, _, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, _, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, FlowState state, Configuration config) { + revFlow(node, state, _, _, _, config) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias(NodeEx node, Configuration config) { revFlow(node, _, _, _, _, config) } + + // use an alias as a workaround for bad functionality-induced joins + pragma[nomagic] + predicate revFlowAlias( + NodeEx node, FlowState state, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + revFlow(node, state, toReturn, returnAp, ap, config) + } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + private predicate revConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + private predicate validAp(Ap ap, Configuration config) { + revFlow(_, _, _, _, ap, config) and ap instanceof ApNil + or + exists(TypedContent head, Ap tail | + consCand(head, tail, config) and + ap = apCons(head, tail) + ) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + revConsCand(tc, ap, config) and + validAp(ap, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, _, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, FlowState state, Ap ap0, ReturnKindExt kind, ParameterPosition pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), pragma[only_bind_into](state), true, apSome(_), + pragma[only_bind_into](ap0), pragma[only_bind_into](config)) and + fwdFlow(ret, state, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists( + Ap returnAp0, ArgNodeEx arg, FlowState state, boolean toReturn, ApOption returnAp, Ap ap + | + revFlow(arg, state, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, state, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats( + boolean fwd, int nodes, int fields, int conscand, int states, int tuples, Configuration config + ) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + states = count(FlowState state | fwdFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, Cc cc, ApOption argAp, Ap ap | + fwdFlow(n, state, cc, argAp, ap, config) + ) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + states = count(FlowState state | revFlow(_, state, _, _, _, config)) and + tuples = + count(NodeEx n, FlowState state, boolean b, ApOption retAp, Ap ap | + revFlow(n, state, b, retAp, ap, config) + ) + } + /* End: Stage 4 logic. */ +} + +bindingset[conf, result] +private Configuration unbindConf(Configuration conf) { + exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) +} + +pragma[nomagic] +private predicate nodeMayUseSummary0( + NodeEx n, DataFlowCallable c, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, _, _) and + Stage4::revFlow(n, state, true, _, apa0, config) and + Stage4::fwdFlow(n, state, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and + n.getEnclosingCallable() = c + ) +} + +pragma[nomagic] +private predicate nodeMayUseSummary( + NodeEx n, FlowState state, AccessPathApprox apa, Configuration config +) { + exists(DataFlowCallable c | + Stage4::parameterMayFlowThrough(_, c, apa, config) and + nodeMayUseSummary0(n, c, state, apa, config) + ) +} + +private newtype TSummaryCtx = + TSummaryCtxNone() or + TSummaryCtxSome(ParamNodeEx p, FlowState state, AccessPath ap) { + exists(Configuration config | + Stage4::parameterMayFlowThrough(p, _, ap.getApprox(), config) and + Stage4::revFlow(p, state, _, _, _, config) + ) + } + +/** + * A context for generating flow summaries. This represents flow entry through + * a specific parameter with an access path of a specific shape. + * + * Summaries are only created for parameters that may flow through. + */ +abstract private class SummaryCtx extends TSummaryCtx { + abstract string toString(); +} + +/** A summary context from which no flow summary can be generated. */ +private class SummaryCtxNone extends SummaryCtx, TSummaryCtxNone { + override string toString() { result = "" } +} + +/** A summary context from which a flow summary can be generated. */ +private class SummaryCtxSome extends SummaryCtx, TSummaryCtxSome { + private ParamNodeEx p; + private FlowState s; + private AccessPath ap; + + SummaryCtxSome() { this = TSummaryCtxSome(p, s, ap) } + + ParameterPosition getParameterPos() { p.isParameterOf(_, result) } + + ParamNodeEx getParamNode() { result = p } + + override string toString() { result = p + ": " + ap } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + p.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * Gets the number of length 2 access path approximations that correspond to `apa`. + */ +private int count1to2unfold(AccessPathApproxCons1 apa, Configuration config) { + exists(TypedContent tc, int len | + tc = apa.getHead() and + len = apa.len() and + result = + strictcount(AccessPathFront apf | + Stage4::consCand(tc, any(AccessPathApprox ap | ap.getFront() = apf and ap.len() = len - 1), + config) + ) + ) +} + +private int countNodesUsingAccessPath(AccessPathApprox apa, Configuration config) { + result = + strictcount(NodeEx n, FlowState state | + Stage4::revFlow(n, state, _, _, apa, config) or nodeMayUseSummary(n, state, apa, config) + ) +} + +/** + * Holds if a length 2 access path approximation matching `apa` is expected + * to be expensive. + */ +private predicate expensiveLen1to2unfolding(AccessPathApproxCons1 apa, Configuration config) { + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = count1to2unfold(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + apLimit < aps and + tupleLimit < (aps - 1) * nodes + ) +} + +private AccessPathApprox getATail(AccessPathApprox apa, Configuration config) { + exists(TypedContent head | + apa.pop(head) = result and + Stage4::consCand(head, result, config) + ) +} + +/** + * Holds with `unfold = false` if a precise head-tail representation of `apa` is + * expected to be expensive. Holds with `unfold = true` otherwise. + */ +private predicate evalUnfold(AccessPathApprox apa, boolean unfold, Configuration config) { + if apa.getHead().forceHighPrecision() + then unfold = true + else + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = countPotentialAps(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + if apLimit < aps and tupleLimit < (aps - 1) * nodes then unfold = false else unfold = true + ) +} + +/** + * Gets the number of `AccessPath`s that correspond to `apa`. + */ +private int countAps(AccessPathApprox apa, Configuration config) { + evalUnfold(apa, false, config) and + result = 1 and + (not apa instanceof AccessPathApproxCons1 or expensiveLen1to2unfolding(apa, config)) + or + evalUnfold(apa, false, config) and + result = count1to2unfold(apa, config) and + not expensiveLen1to2unfolding(apa, config) + or + evalUnfold(apa, true, config) and + result = countPotentialAps(apa, config) +} + +/** + * Gets the number of `AccessPath`s that would correspond to `apa` assuming + * that it is expanded to a precise head-tail representation. + */ +language[monotonicAggregates] +private int countPotentialAps(AccessPathApprox apa, Configuration config) { + apa instanceof AccessPathApproxNil and result = 1 + or + result = strictsum(AccessPathApprox tail | tail = getATail(apa, config) | countAps(tail, config)) +} + +private newtype TAccessPath = + TAccessPathNil(DataFlowType t) or + TAccessPathCons(TypedContent head, AccessPath tail) { + exists(AccessPathApproxCons apa | + not evalUnfold(apa, false, _) and + head = apa.getHead() and + tail.getApprox() = getATail(apa, _) + ) + } or + TAccessPathCons2(TypedContent head1, TypedContent head2, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + not expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head1 = apa.getHead() and + head2 = getATail(apa, _).getHead() + ) + } or + TAccessPathCons1(TypedContent head, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head = apa.getHead() + ) + } + +private newtype TPathNode = + TPathNodeMid( + NodeEx node, FlowState state, CallContext cc, SummaryCtx sc, AccessPath ap, Configuration config + ) { + // A PathNode is introduced by a source ... + Stage4::revFlow(node, state, config) and + sourceNode(node, state, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap = TAccessPathNil(node.getDataFlowType()) + or + // ... or a step from an existing PathNode to another node. + exists(PathNodeMid mid | + pathStep(mid, node, state, cc, sc, ap) and + pragma[only_bind_into](config) = mid.getConfiguration() and + Stage4::revFlow(node, state, _, _, ap.getApprox(), pragma[only_bind_into](config)) + ) + } or + TPathNodeSink(NodeEx node, FlowState state, Configuration config) { + exists(PathNodeMid sink | + sink.isAtSink() and + node = sink.getNodeEx() and + state = sink.getState() and + config = sink.getConfiguration() + ) + } + +/** + * A list of `TypedContent`s followed by a `DataFlowType`. If data flows from a + * source to a given node with a given `AccessPath`, this indicates the sequence + * of dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ +private class AccessPath extends TAccessPath { + /** Gets the head of this access path, if any. */ + abstract TypedContent getHead(); + + /** Gets the tail of this access path, if any. */ + abstract AccessPath getTail(); + + /** Gets the front of this access path. */ + abstract AccessPathFront getFront(); + + /** Gets the approximation of this access path. */ + abstract AccessPathApprox getApprox(); + + /** Gets the length of this access path. */ + abstract int length(); + + /** Gets a textual representation of this access path. */ + abstract string toString(); + + /** Gets the access path obtained by popping `tc` from this access path, if any. */ + final AccessPath pop(TypedContent tc) { + result = this.getTail() and + tc = this.getHead() + } + + /** Gets the access path obtained by pushing `tc` onto this access path. */ + final AccessPath push(TypedContent tc) { this = result.pop(tc) } +} + +private class AccessPathNil extends AccessPath, TAccessPathNil { + private DataFlowType t; + + AccessPathNil() { this = TAccessPathNil(t) } + + DataFlowType getType() { result = t } + + override TypedContent getHead() { none() } + + override AccessPath getTail() { none() } + + override AccessPathFrontNil getFront() { result = TFrontNil(t) } + + override AccessPathApproxNil getApprox() { result = TNil(t) } + + override int length() { result = 0 } + + override string toString() { result = concat(": " + ppReprType(t)) } +} + +private class AccessPathCons extends AccessPath, TAccessPathCons { + private TypedContent head; + private AccessPath tail; + + AccessPathCons() { this = TAccessPathCons(head, tail) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { result = tail } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { + result = TConsNil(head, tail.(AccessPathNil).getType()) + or + result = TConsCons(head, tail.getHead(), this.length()) + or + result = TCons1(head, this.length()) + } + + override int length() { result = 1 + tail.length() } + + private string toStringImpl(boolean needsSuffix) { + exists(DataFlowType t | + tail = TAccessPathNil(t) and + needsSuffix = false and + result = head.toString() + "]" + concat(" : " + ppReprType(t)) + ) + or + result = head + ", " + tail.(AccessPathCons).toStringImpl(needsSuffix) + or + exists(TypedContent tc2, TypedContent tc3, int len | tail = TAccessPathCons2(tc2, tc3, len) | + result = head + ", " + tc2 + ", " + tc3 + ", ... (" and len > 2 and needsSuffix = true + or + result = head + ", " + tc2 + ", " + tc3 + "]" and len = 2 and needsSuffix = false + ) + or + exists(TypedContent tc2, int len | tail = TAccessPathCons1(tc2, len) | + result = head + ", " + tc2 + ", ... (" and len > 1 and needsSuffix = true + or + result = head + ", " + tc2 + "]" and len = 1 and needsSuffix = false + ) + } + + override string toString() { + result = "[" + this.toStringImpl(true) + this.length().toString() + ")]" + or + result = "[" + this.toStringImpl(false) + } +} + +private class AccessPathCons2 extends AccessPath, TAccessPathCons2 { + private TypedContent head1; + private TypedContent head2; + private int len; + + AccessPathCons2() { this = TAccessPathCons2(head1, head2, len) } + + override TypedContent getHead() { result = head1 } + + override AccessPath getTail() { + Stage4::consCand(head1, result.getApprox(), _) and + result.getHead() = head2 and + result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head1) } + + override AccessPathApproxCons getApprox() { + result = TConsCons(head1, head2, len) or + result = TCons1(head1, len) + } + + override int length() { result = len } + + override string toString() { + if len = 2 + then result = "[" + head1.toString() + ", " + head2.toString() + "]" + else + result = "[" + head1.toString() + ", " + head2.toString() + ", ... (" + len.toString() + ")]" + } +} + +private class AccessPathCons1 extends AccessPath, TAccessPathCons1 { + private TypedContent head; + private int len; + + AccessPathCons1() { this = TAccessPathCons1(head, len) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { + Stage4::consCand(head, result.getApprox(), _) and result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { result = TCons1(head, len) } + + override int length() { result = len } + + override string toString() { + if len = 1 + then result = "[" + head.toString() + "]" + else result = "[" + head.toString() + ", ... (" + len.toString() + ")]" + } +} + +/** + * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. + * Only those `PathNode`s that are reachable from a source are generated. + */ +class PathNode extends TPathNode { + /** Gets a textual representation of this element. */ + string toString() { none() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { none() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + none() + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.(PathNodeImpl).getNodeEx().projectToNode() = result } + + /** Gets the `FlowState` of this node. */ + FlowState getState() { none() } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + private PathNode getASuccessorIfHidden() { + this.(PathNodeImpl).isHidden() and + result = this.(PathNodeImpl).getASuccessorImpl() + } + + /** Gets a successor of this node, if any. */ + final PathNode getASuccessor() { + result = this.(PathNodeImpl).getASuccessorImpl().getASuccessorIfHidden*() and + not this.(PathNodeImpl).isHidden() and + not result.(PathNodeImpl).isHidden() + } + + /** Holds if this node is a source. */ + predicate isSource() { none() } +} + +abstract private class PathNodeImpl extends PathNode { + abstract PathNode getASuccessorImpl(); + + abstract NodeEx getNodeEx(); + + predicate isHidden() { + not this.getConfiguration().includeHiddenNodes() and + ( + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + ) + } + + private string ppAp() { + this instanceof PathNodeSink and result = "" + or + exists(string s | s = this.(PathNodeMid).getAp().toString() | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + this instanceof PathNodeSink and result = "" + or + result = " <" + this.(PathNodeMid).getCallContext().toString() + ">" + } + + override string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + override string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** Holds if `n` can reach a sink. */ +private predicate directReach(PathNode n) { + n instanceof PathNodeSink or directReach(n.getASuccessor()) +} + +/** Holds if `n` can reach a sink or is used in a subpath that can reach a sink. */ +private predicate reach(PathNode n) { directReach(n) or Subpaths::retReach(n) } + +/** Holds if `n1.getASuccessor() = n2` and `n2` can reach a sink. */ +private predicate pathSucc(PathNode n1, PathNode n2) { n1.getASuccessor() = n2 and directReach(n2) } + +private predicate pathSuccPlus(PathNode n1, PathNode n2) = fastTC(pathSucc/2)(n1, n2) + +/** + * Provides the query predicates needed to include a graph in a path-problem query. + */ +module PathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PathNode a, PathNode b) { a.getASuccessor() = b and reach(a) and reach(b) } + + /** Holds if `n` is a node in the graph of data flow path explanations. */ + query predicate nodes(PathNode n, string key, string val) { + reach(n) and key = "semmle.label" and val = n.toString() + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through + * a subpath between `par` and `ret` with the connecting edges `arg -> par` and + * `ret -> out` is summarized as the edge `arg -> out`. + */ + query predicate subpaths(PathNode arg, PathNode par, PathNode ret, PathNode out) { + Subpaths::subpaths(arg, par, ret, out) and + reach(arg) and + reach(par) and + reach(ret) and + reach(out) + } +} + +/** + * An intermediate flow graph node. This is a triple consisting of a `Node`, + * a `CallContext`, and a `Configuration`. + */ +private class PathNodeMid extends PathNodeImpl, TPathNodeMid { + NodeEx node; + FlowState state; + CallContext cc; + SummaryCtx sc; + AccessPath ap; + Configuration config; + + PathNodeMid() { this = TPathNodeMid(node, state, cc, sc, ap, config) } + + override NodeEx getNodeEx() { result = node } + + override FlowState getState() { result = state } + + CallContext getCallContext() { result = cc } + + SummaryCtx getSummaryCtx() { result = sc } + + AccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + private PathNodeMid getSuccMid() { + pathStep(this, result.getNodeEx(), result.getState(), result.getCallContext(), + result.getSummaryCtx(), result.getAp()) and + result.getConfiguration() = unbindConf(this.getConfiguration()) + } + + override PathNodeImpl getASuccessorImpl() { + // an intermediate step to another intermediate node + result = this.getSuccMid() + or + // a final step to a sink + result = this.getSuccMid().projectToSink() + } + + override predicate isSource() { + sourceNode(node, state, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap instanceof AccessPathNil + } + + predicate isAtSink() { + sinkNode(node, state, config) and + ap instanceof AccessPathNil and + if hasSinkCallCtx(config) + then + // For `FeatureHasSinkCallContext` the condition `cc instanceof CallContextNoCall` + // is exactly what we need to check. This also implies + // `sc instanceof SummaryCtxNone`. + // For `FeatureEqualSourceSinkCallContext` the initial call context was + // set to `CallContextSomeCall` and jumps are disallowed, so + // `cc instanceof CallContextNoCall` never holds. On the other hand, + // in this case there's never any need to enter a call except to identify + // a summary, so the condition in `pathIntoCallable` enforces this, which + // means that `sc instanceof SummaryCtxNone` holds if and only if we are + // in the call context of the source. + sc instanceof SummaryCtxNone or + cc instanceof CallContextNoCall + else any() + } + + PathNodeSink projectToSink() { + this.isAtSink() and + result.getNodeEx() = node and + result.getState() = state and + result.getConfiguration() = unbindConf(config) + } +} + +/** + * A flow graph node corresponding to a sink. This is disjoint from the + * intermediate nodes in order to uniquely correspond to a given sink by + * excluding the `CallContext`. + */ +private class PathNodeSink extends PathNodeImpl, TPathNodeSink { + NodeEx node; + FlowState state; + Configuration config; + + PathNodeSink() { this = TPathNodeSink(node, state, config) } + + override NodeEx getNodeEx() { result = node } + + override FlowState getState() { result = state } + + override Configuration getConfiguration() { result = config } + + override PathNode getASuccessorImpl() { none() } + + override predicate isSource() { sourceNode(node, state, config) } +} + +private predicate pathNode( + PathNodeMid mid, NodeEx midnode, FlowState state, CallContext cc, SummaryCtx sc, AccessPath ap, + Configuration conf, LocalCallContext localCC +) { + midnode = mid.getNodeEx() and + state = mid.getState() and + conf = mid.getConfiguration() and + cc = mid.getCallContext() and + sc = mid.getSummaryCtx() and + localCC = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + midnode.getEnclosingCallable()) and + ap = mid.getAp() +} + +/** + * Holds if data may flow from `mid` to `node`. The last step in or out of + * a callable is recorded by `cc`. + */ +pragma[nomagic] +private predicate pathStep( + PathNodeMid mid, NodeEx node, FlowState state, CallContext cc, SummaryCtx sc, AccessPath ap +) { + exists(NodeEx midnode, FlowState state0, Configuration conf, LocalCallContext localCC | + pathNode(mid, midnode, state0, cc, sc, ap, conf, localCC) and + localFlowBigStep(midnode, state0, node, state, true, _, conf, localCC) + ) + or + exists( + AccessPath ap0, NodeEx midnode, FlowState state0, Configuration conf, LocalCallContext localCC + | + pathNode(mid, midnode, state0, cc, sc, ap0, conf, localCC) and + localFlowBigStep(midnode, state0, node, state, false, ap.getFront(), conf, localCC) and + ap0 instanceof AccessPathNil + ) + or + jumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + state = mid.getState() and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + ap = mid.getAp() + or + additionalJumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + state = mid.getState() and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + mid.getAp() instanceof AccessPathNil and + ap = TAccessPathNil(node.getDataFlowType()) + or + additionalJumpStateStep(mid.getNodeEx(), mid.getState(), node, state, mid.getConfiguration()) and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + mid.getAp() instanceof AccessPathNil and + ap = TAccessPathNil(node.getDataFlowType()) + or + exists(TypedContent tc | pathStoreStep(mid, node, state, ap.pop(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + exists(TypedContent tc | pathReadStep(mid, node, state, ap.push(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + pathIntoCallable(mid, node, state, _, cc, sc, _, _) and ap = mid.getAp() + or + pathOutOfCallable(mid, node, state, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone + or + pathThroughCallable(mid, node, state, cc, ap) and sc = mid.getSummaryCtx() +} + +pragma[nomagic] +private predicate pathReadStep( + PathNodeMid mid, NodeEx node, FlowState state, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + tc = ap0.getHead() and + Stage4::readStepCand(mid.getNodeEx(), tc.getContent(), node, mid.getConfiguration()) and + state = mid.getState() and + cc = mid.getCallContext() +} + +pragma[nomagic] +private predicate pathStoreStep( + PathNodeMid mid, NodeEx node, FlowState state, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + Stage4::storeStepCand(mid.getNodeEx(), _, tc, node, _, mid.getConfiguration()) and + state = mid.getState() and + cc = mid.getCallContext() +} + +private predicate pathOutOfCallable0( + PathNodeMid mid, ReturnPosition pos, FlowState state, CallContext innercc, AccessPathApprox apa, + Configuration config +) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + state = mid.getState() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + apa = mid.getAp().getApprox() and + config = mid.getConfiguration() +} + +pragma[nomagic] +private predicate pathOutOfCallable1( + PathNodeMid mid, DataFlowCall call, ReturnKindExt kind, FlowState state, CallContext cc, + AccessPathApprox apa, Configuration config +) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + pathOutOfCallable0(mid, pos, state, innercc, apa, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) +} + +pragma[noinline] +private NodeEx getAnOutNodeFlow( + ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config +) { + result.asNode() = kind.getAnOutNode(call) and + Stage4::revFlow(result, _, _, _, apa, config) +} + +/** + * Holds if data may flow from `mid` to `out`. The last step of this path + * is a return from a callable and is recorded by `cc`, if needed. + */ +pragma[noinline] +private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, FlowState state, CallContext cc) { + exists(ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config | + pathOutOfCallable1(mid, call, kind, state, cc, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` to the `i`th argument of `call` in `cc`. + */ +pragma[noinline] +private predicate pathIntoArg( + PathNodeMid mid, ParameterPosition ppos, FlowState state, CallContext cc, DataFlowCall call, + AccessPath ap, AccessPathApprox apa, Configuration config +) { + exists(ArgNodeEx arg, ArgumentPosition apos | + pathNode(mid, arg, state, cc, _, ap, config, _) and + arg.asNode().(ArgNode).argumentOf(call, apos) and + apa = ap.getApprox() and + parameterMatch(ppos, apos) + ) +} + +pragma[nomagic] +private predicate parameterCand( + DataFlowCallable callable, ParameterPosition pos, AccessPathApprox apa, Configuration config +) { + exists(ParamNodeEx p | + Stage4::revFlow(p, _, _, _, apa, config) and + p.isParameterOf(callable, pos) + ) +} + +pragma[nomagic] +private predicate pathIntoCallable0( + PathNodeMid mid, DataFlowCallable callable, ParameterPosition pos, FlowState state, + CallContext outercc, DataFlowCall call, AccessPath ap, Configuration config +) { + exists(AccessPathApprox apa | + pathIntoArg(mid, pragma[only_bind_into](pos), state, outercc, call, ap, + pragma[only_bind_into](apa), pragma[only_bind_into](config)) and + callable = resolveCall(call, outercc) and + parameterCand(callable, pragma[only_bind_into](pos), pragma[only_bind_into](apa), + pragma[only_bind_into](config)) + ) +} + +/** + * Holds if data may flow from `mid` to `p` through `call`. The contexts + * before and after entering the callable are `outercc` and `innercc`, + * respectively. + */ +pragma[nomagic] +private predicate pathIntoCallable( + PathNodeMid mid, ParamNodeEx p, FlowState state, CallContext outercc, CallContextCall innercc, + SummaryCtx sc, DataFlowCall call, Configuration config +) { + exists(ParameterPosition pos, DataFlowCallable callable, AccessPath ap | + pathIntoCallable0(mid, callable, pos, state, outercc, call, ap, config) and + p.isParameterOf(callable, pos) and + ( + sc = TSummaryCtxSome(p, state, ap) + or + not exists(TSummaryCtxSome(p, state, ap)) and + sc = TSummaryCtxNone() and + // When the call contexts of source and sink needs to match then there's + // never any reason to enter a callable except to find a summary. See also + // the comment in `PathNodeMid::isAtSink`. + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) +} + +/** Holds if data may flow from a parameter given by `sc` to a return of kind `kind`. */ +pragma[nomagic] +private predicate paramFlowsThrough( + ReturnKindExt kind, FlowState state, CallContextCall cc, SummaryCtxSome sc, AccessPath ap, + AccessPathApprox apa, Configuration config +) { + exists(PathNodeMid mid, RetNodeEx ret, ParameterPosition pos | + pathNode(mid, ret, state, cc, sc, ap, config, _) and + kind = ret.getKind() and + apa = ap.getApprox() and + pos = sc.getParameterPos() and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + sc.getParamNode().allowParameterReturnInSelf() + ) + ) +} + +pragma[nomagic] +private predicate pathThroughCallable0( + DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, FlowState state, CallContext cc, + AccessPath ap, AccessPathApprox apa, Configuration config +) { + exists(CallContext innercc, SummaryCtx sc | + pathIntoCallable(mid, _, _, cc, innercc, sc, call, config) and + paramFlowsThrough(kind, state, innercc, sc, ap, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` through a callable to the node `out`. + * The context `cc` is restored to its value prior to entering the callable. + */ +pragma[noinline] +private predicate pathThroughCallable( + PathNodeMid mid, NodeEx out, FlowState state, CallContext cc, AccessPath ap +) { + exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config | + pathThroughCallable0(call, mid, kind, state, cc, ap, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +private module Subpaths { + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths01( + PathNodeImpl arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, FlowState sout, AccessPath apout + ) { + exists(Configuration config | + pathThroughCallable(arg, out, pragma[only_bind_into](sout), _, pragma[only_bind_into](apout)) and + pathIntoCallable(arg, par, _, _, innercc, sc, _, config) and + paramFlowsThrough(kind, pragma[only_bind_into](sout), innercc, sc, + pragma[only_bind_into](apout), _, unbindConf(config)) and + not arg.isHidden() + ) + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `sout`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths02( + PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, FlowState sout, AccessPath apout + ) { + subpaths01(arg, par, sc, innercc, kind, out, sout, apout) and + out.asNode() = kind.getAnOutNode(_) + } + + pragma[nomagic] + private Configuration getPathNodeConf(PathNode n) { result = n.getConfiguration() } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple. + */ + pragma[nomagic] + private predicate subpaths03( + PathNode arg, ParamNodeEx par, PathNodeMid ret, NodeEx out, FlowState sout, AccessPath apout + ) { + exists(SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, RetNodeEx retnode | + subpaths02(arg, par, sc, innercc, kind, out, sout, apout) and + pathNode(ret, retnode, sout, innercc, sc, apout, unbindConf(getPathNodeConf(arg)), _) and + kind = retnode.getKind() + ) + } + + private PathNodeImpl localStepToHidden(PathNodeImpl n) { + n.getASuccessorImpl() = result and + result.isHidden() and + exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | + localFlowBigStep(n1, _, n2, _, _, _, _, _) or + store(n1, _, n2, _, _) or + readSet(n1, _, n2, _) + ) + } + + pragma[nomagic] + private predicate hasSuccessor(PathNode pred, PathNodeMid succ, NodeEx succNode) { + succ = pred.getASuccessor() and + succNode = succ.getNodeEx() + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through + * a subpath between `par` and `ret` with the connecting edges `arg -> par` and + * `ret -> out` is summarized as the edge `arg -> out`. + */ + predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNode out) { + exists(ParamNodeEx p, NodeEx o, FlowState sout, AccessPath apout, PathNodeMid out0 | + pragma[only_bind_into](arg).getASuccessor() = pragma[only_bind_into](out0) and + subpaths03(pragma[only_bind_into](arg), p, localStepToHidden*(ret), o, sout, apout) and + hasSuccessor(pragma[only_bind_into](arg), par, p) and + not ret.isHidden() and + pathNode(out0, o, sout, _, _, apout, _, _) + | + out = out0 or out = out0.projectToSink() + ) + } + + /** + * Holds if `n` can reach a return node in a summarized subpath that can reach a sink. + */ + predicate retReach(PathNode n) { + exists(PathNode out | subpaths(_, _, n, out) | directReach(out) or retReach(out)) + or + exists(PathNode mid | + retReach(mid) and + n.getASuccessor() = mid and + not subpaths(_, mid, _, _) + ) + } +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +private predicate flowsTo( + PathNode flowsource, PathNodeSink flowsink, Node source, Node sink, Configuration configuration +) { + flowsource.isSource() and + flowsource.getConfiguration() = configuration and + flowsource.(PathNodeImpl).getNodeEx().asNode() = source and + (flowsource = flowsink or pathSuccPlus(flowsource, flowsink)) and + flowsink.getNodeEx().asNode() = sink +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +predicate flowsTo(Node source, Node sink, Configuration configuration) { + flowsTo(_, _, source, sink, configuration) +} + +private predicate finalStats( + boolean fwd, int nodes, int fields, int conscand, int states, int tuples +) { + fwd = true and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0)) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0)) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap)) and + states = count(FlowState state | exists(PathNodeMid pn | pn.getState() = state)) and + tuples = count(PathNode pn) + or + fwd = false and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0 and reach(pn))) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0 and reach(pn))) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap and reach(pn))) and + states = count(FlowState state | exists(PathNodeMid pn | pn.getState() = state and reach(pn))) and + tuples = count(PathNode pn | reach(pn)) +} + +/** + * INTERNAL: Only for debugging. + * + * Calculates per-stage metrics for data flow. + */ +predicate stageStats( + int n, string stage, int nodes, int fields, int conscand, int states, int tuples, + Configuration config +) { + stage = "1 Fwd" and + n = 10 and + Stage1::stats(true, nodes, fields, conscand, states, tuples, config) + or + stage = "1 Rev" and + n = 15 and + Stage1::stats(false, nodes, fields, conscand, states, tuples, config) + or + stage = "2 Fwd" and + n = 20 and + Stage2::stats(true, nodes, fields, conscand, states, tuples, config) + or + stage = "2 Rev" and + n = 25 and + Stage2::stats(false, nodes, fields, conscand, states, tuples, config) + or + stage = "3 Fwd" and + n = 30 and + Stage3::stats(true, nodes, fields, conscand, states, tuples, config) + or + stage = "3 Rev" and + n = 35 and + Stage3::stats(false, nodes, fields, conscand, states, tuples, config) + or + stage = "4 Fwd" and + n = 40 and + Stage4::stats(true, nodes, fields, conscand, states, tuples, config) + or + stage = "4 Rev" and + n = 45 and + Stage4::stats(false, nodes, fields, conscand, states, tuples, config) + or + stage = "5 Fwd" and n = 50 and finalStats(true, nodes, fields, conscand, states, tuples) + or + stage = "5 Rev" and n = 55 and finalStats(false, nodes, fields, conscand, states, tuples) +} + +private module FlowExploration { + private predicate callableStep(DataFlowCallable c1, DataFlowCallable c2, Configuration config) { + exists(NodeEx node1, NodeEx node2 | + jumpStep(node1, node2, config) + or + additionalJumpStep(node1, node2, config) + or + additionalJumpStateStep(node1, _, node2, _, config) + or + // flow into callable + viableParamArgEx(_, node2, node1) + or + // flow out of a callable + viableReturnPosOutEx(_, node1.(RetNodeEx).getReturnPosition(), node2) + | + c1 = node1.getEnclosingCallable() and + c2 = node2.getEnclosingCallable() and + c1 != c2 + ) + } + + private predicate interestingCallableSrc(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSource(n) or config.isSource(n, _) | c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSrc(mid, config) and callableStep(mid, c, config) + ) + } + + private predicate interestingCallableSink(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSink(n) or config.isSink(n, _) | c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSink(mid, config) and callableStep(c, mid, config) + ) + } + + private newtype TCallableExt = + TCallable(DataFlowCallable c, Configuration config) { + interestingCallableSrc(c, config) or + interestingCallableSink(c, config) + } or + TCallableSrc() or + TCallableSink() + + private predicate callableExtSrc(TCallableSrc src) { any() } + + private predicate callableExtSink(TCallableSink sink) { any() } + + private predicate callableExtStepFwd(TCallableExt ce1, TCallableExt ce2) { + exists(DataFlowCallable c1, DataFlowCallable c2, Configuration config | + callableStep(c1, c2, config) and + ce1 = TCallable(c1, pragma[only_bind_into](config)) and + ce2 = TCallable(c2, pragma[only_bind_into](config)) + ) + or + exists(Node n, Configuration config | + ce1 = TCallableSrc() and + (config.isSource(n) or config.isSource(n, _)) and + ce2 = TCallable(getNodeEnclosingCallable(n), config) + ) + or + exists(Node n, Configuration config | + ce2 = TCallableSink() and + (config.isSink(n) or config.isSink(n, _)) and + ce1 = TCallable(getNodeEnclosingCallable(n), config) + ) + } + + private predicate callableExtStepRev(TCallableExt ce1, TCallableExt ce2) { + callableExtStepFwd(ce2, ce1) + } + + private int distSrcExt(TCallableExt c) = + shortestDistances(callableExtSrc/1, callableExtStepFwd/2)(_, c, result) + + private int distSinkExt(TCallableExt c) = + shortestDistances(callableExtSink/1, callableExtStepRev/2)(_, c, result) + + private int distSrc(DataFlowCallable c, Configuration config) { + result = distSrcExt(TCallable(c, config)) - 1 + } + + private int distSink(DataFlowCallable c, Configuration config) { + result = distSinkExt(TCallable(c, config)) - 1 + } + + private newtype TPartialAccessPath = + TPartialNil(DataFlowType t) or + TPartialCons(TypedContent tc, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `TypedContent`s followed by a `Type`, but only the first + * element of the list and its length are tracked. If data flows from a source to + * a given node with a given `AccessPath`, this indicates the sequence of + * dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ + private class PartialAccessPath extends TPartialAccessPath { + abstract string toString(); + + TypedContent getHead() { this = TPartialCons(result, _) } + + int len() { + this = TPartialNil(_) and result = 0 + or + this = TPartialCons(_, result) + } + + DataFlowType getType() { + this = TPartialNil(result) + or + exists(TypedContent head | this = TPartialCons(head, _) | result = head.getContainerType()) + } + } + + private class PartialAccessPathNil extends PartialAccessPath, TPartialNil { + override string toString() { + exists(DataFlowType t | this = TPartialNil(t) | result = concat(": " + ppReprType(t))) + } + } + + private class PartialAccessPathCons extends PartialAccessPath, TPartialCons { + override string toString() { + exists(TypedContent tc, int len | this = TPartialCons(tc, len) | + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private newtype TRevPartialAccessPath = + TRevPartialNil() or + TRevPartialCons(Content c, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `Content`s, but only the first + * element of the list and its length are tracked. + */ + private class RevPartialAccessPath extends TRevPartialAccessPath { + abstract string toString(); + + Content getHead() { this = TRevPartialCons(result, _) } + + int len() { + this = TRevPartialNil() and result = 0 + or + this = TRevPartialCons(_, result) + } + } + + private class RevPartialAccessPathNil extends RevPartialAccessPath, TRevPartialNil { + override string toString() { result = "" } + } + + private class RevPartialAccessPathCons extends RevPartialAccessPath, TRevPartialCons { + override string toString() { + exists(Content c, int len | this = TRevPartialCons(c, len) | + if len = 1 + then result = "[" + c.toString() + "]" + else result = "[" + c.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private predicate relevantState(FlowState state) { + sourceNode(_, state, _) or + sinkNode(_, state, _) or + additionalLocalStateStep(_, state, _, _, _) or + additionalLocalStateStep(_, _, _, state, _) or + additionalJumpStateStep(_, state, _, _, _) or + additionalJumpStateStep(_, _, _, state, _) + } + + private newtype TSummaryCtx1 = + TSummaryCtx1None() or + TSummaryCtx1Param(ParamNodeEx p) + + private newtype TSummaryCtx2 = + TSummaryCtx2None() or + TSummaryCtx2Some(FlowState s) { relevantState(s) } + + private newtype TSummaryCtx3 = + TSummaryCtx3None() or + TSummaryCtx3Some(PartialAccessPath ap) + + private newtype TRevSummaryCtx1 = + TRevSummaryCtx1None() or + TRevSummaryCtx1Some(ReturnPosition pos) + + private newtype TRevSummaryCtx2 = + TRevSummaryCtx2None() or + TRevSummaryCtx2Some(FlowState s) { relevantState(s) } + + private newtype TRevSummaryCtx3 = + TRevSummaryCtx3None() or + TRevSummaryCtx3Some(RevPartialAccessPath ap) + + private newtype TPartialPathNode = + TPartialPathNodeFwd( + NodeEx node, FlowState state, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + TSummaryCtx3 sc3, PartialAccessPath ap, Configuration config + ) { + sourceNode(node, state, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() and + ap = TPartialNil(node.getDataFlowType()) and + exists(config.explorationLimit()) + or + partialPathNodeMk0(node, state, cc, sc1, sc2, sc3, ap, config) and + distSrc(node.getEnclosingCallable(), config) <= config.explorationLimit() + } or + TPartialPathNodeRev( + NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, TRevSummaryCtx3 sc3, + RevPartialAccessPath ap, Configuration config + ) { + sinkNode(node, state, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + ap = TRevPartialNil() and + exists(config.explorationLimit()) + or + exists(PartialPathNodeRev mid | + revPartialPathStep(mid, node, state, sc1, sc2, sc3, ap, config) and + not clearsContentEx(node, ap.getHead()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead()) + ) and + not fullBarrier(node, config) and + not stateBarrier(node, state, config) and + distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() + ) + } + + pragma[nomagic] + private predicate partialPathNodeMk0( + NodeEx node, FlowState state, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + TSummaryCtx3 sc3, PartialAccessPath ap, Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStep(mid, node, state, cc, sc1, sc2, sc3, ap, config) and + not fullBarrier(node, config) and + not stateBarrier(node, state, config) and + not clearsContentEx(node, ap.getHead().getContent()) and + ( + notExpectsContent(node) or + expectsContentEx(node, ap.getHead().getContent()) + ) and + if node.asNode() instanceof CastingNode + then compatibleTypes(node.getDataFlowType(), ap.getType()) + else any() + ) + } + + /** + * A `Node` augmented with a call context, an access path, and a configuration. + */ + class PartialPathNode extends TPartialPathNode { + /** Gets a textual representation of this element. */ + string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.getNodeEx().projectToNode() = result } + + FlowState getState() { none() } + + private NodeEx getNodeEx() { + result = this.(PartialPathNodeFwd).getNodeEx() or + result = this.(PartialPathNodeRev).getNodeEx() + } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + /** Gets a successor of this node, if any. */ + PartialPathNode getASuccessor() { none() } + + /** + * Gets the approximate distance to the nearest source measured in number + * of interprocedural steps. + */ + int getSourceDistance() { + result = distSrc(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + /** + * Gets the approximate distance to the nearest sink measured in number + * of interprocedural steps. + */ + int getSinkDistance() { + result = distSink(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + private string ppAp() { + exists(string s | + s = this.(PartialPathNodeFwd).getAp().toString() or + s = this.(PartialPathNodeRev).getAp().toString() + | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + result = " <" + this.(PartialPathNodeFwd).getCallContext().toString() + ">" + } + + /** Holds if this is a source in a forward-flow path. */ + predicate isFwdSource() { this.(PartialPathNodeFwd).isSource() } + + /** Holds if this is a sink in a reverse-flow path. */ + predicate isRevSink() { this.(PartialPathNodeRev).isSink() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PartialPathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PartialPathNode a, PartialPathNode b) { a.getASuccessor() = b } + } + + private class PartialPathNodeFwd extends PartialPathNode, TPartialPathNodeFwd { + NodeEx node; + FlowState state; + CallContext cc; + TSummaryCtx1 sc1; + TSummaryCtx2 sc2; + TSummaryCtx3 sc3; + PartialAccessPath ap; + Configuration config; + + PartialPathNodeFwd() { this = TPartialPathNodeFwd(node, state, cc, sc1, sc2, sc3, ap, config) } + + NodeEx getNodeEx() { result = node } + + override FlowState getState() { result = state } + + CallContext getCallContext() { result = cc } + + TSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TSummaryCtx2 getSummaryCtx2() { result = sc2 } + + TSummaryCtx3 getSummaryCtx3() { result = sc3 } + + PartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeFwd getASuccessor() { + partialPathStep(this, result.getNodeEx(), result.getState(), result.getCallContext(), + result.getSummaryCtx1(), result.getSummaryCtx2(), result.getSummaryCtx3(), result.getAp(), + result.getConfiguration()) + } + + predicate isSource() { + sourceNode(node, state, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() and + ap instanceof TPartialNil + } + } + + private class PartialPathNodeRev extends PartialPathNode, TPartialPathNodeRev { + NodeEx node; + FlowState state; + TRevSummaryCtx1 sc1; + TRevSummaryCtx2 sc2; + TRevSummaryCtx3 sc3; + RevPartialAccessPath ap; + Configuration config; + + PartialPathNodeRev() { this = TPartialPathNodeRev(node, state, sc1, sc2, sc3, ap, config) } + + NodeEx getNodeEx() { result = node } + + override FlowState getState() { result = state } + + TRevSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TRevSummaryCtx2 getSummaryCtx2() { result = sc2 } + + TRevSummaryCtx3 getSummaryCtx3() { result = sc3 } + + RevPartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeRev getASuccessor() { + revPartialPathStep(result, this.getNodeEx(), this.getState(), this.getSummaryCtx1(), + this.getSummaryCtx2(), this.getSummaryCtx3(), this.getAp(), this.getConfiguration()) + } + + predicate isSink() { + sinkNode(node, state, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + ap = TRevPartialNil() + } + } + + private predicate partialPathStep( + PartialPathNodeFwd mid, NodeEx node, FlowState state, CallContext cc, TSummaryCtx1 sc1, + TSummaryCtx2 sc2, TSummaryCtx3 sc3, PartialAccessPath ap, Configuration config + ) { + not isUnreachableInCallCached(node.asNode(), cc.(CallContextSpecificCall).getCall()) and + ( + localFlowStep(mid.getNodeEx(), node, config) and + state = mid.getState() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(mid.getNodeEx(), node, config) and + state = mid.getState() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + or + additionalLocalStateStep(mid.getNodeEx(), mid.getState(), node, state, config) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + ) + or + jumpStep(mid.getNodeEx(), node, config) and + state = mid.getState() and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(mid.getNodeEx(), node, config) and + state = mid.getState() and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + or + additionalJumpStateStep(mid.getNodeEx(), mid.getState(), node, state, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + or + partialPathStoreStep(mid, _, _, node, ap) and + state = mid.getState() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + config = mid.getConfiguration() + or + exists(PartialAccessPath ap0, TypedContent tc | + partialPathReadStep(mid, ap0, tc, node, cc, config) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + apConsFwd(ap, tc, ap0, config) + ) + or + partialPathIntoCallable(mid, node, state, _, cc, sc1, sc2, sc3, _, ap, config) + or + partialPathOutOfCallable(mid, node, state, cc, ap, config) and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + sc3 = TSummaryCtx3None() + or + partialPathThroughCallable(mid, node, state, cc, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() + } + + bindingset[result, i] + private int unbindInt(int i) { pragma[only_bind_out](i) = pragma[only_bind_out](result) } + + pragma[inline] + private predicate partialPathStoreStep( + PartialPathNodeFwd mid, PartialAccessPath ap1, TypedContent tc, NodeEx node, + PartialAccessPath ap2 + ) { + exists(NodeEx midNode, DataFlowType contentType | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + store(midNode, tc, node, contentType, mid.getConfiguration()) and + ap2.getHead() = tc and + ap2.len() = unbindInt(ap1.len() + 1) and + compatibleTypes(ap1.getType(), contentType) + ) + } + + pragma[nomagic] + private predicate apConsFwd( + PartialAccessPath ap1, TypedContent tc, PartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStoreStep(mid, ap1, tc, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate partialPathReadStep( + PartialPathNodeFwd mid, PartialAccessPath ap, TypedContent tc, NodeEx node, CallContext cc, + Configuration config + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + read(midNode, tc.getContent(), node, pragma[only_bind_into](config)) and + ap.getHead() = tc and + pragma[only_bind_into](config) = mid.getConfiguration() and + cc = mid.getCallContext() + ) + } + + private predicate partialPathOutOfCallable0( + PartialPathNodeFwd mid, ReturnPosition pos, FlowState state, CallContext innercc, + PartialAccessPath ap, Configuration config + ) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + state = mid.getState() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + ap = mid.getAp() and + config = mid.getConfiguration() + } + + pragma[nomagic] + private predicate partialPathOutOfCallable1( + PartialPathNodeFwd mid, DataFlowCall call, ReturnKindExt kind, FlowState state, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + partialPathOutOfCallable0(mid, pos, state, innercc, ap, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) + } + + private predicate partialPathOutOfCallable( + PartialPathNodeFwd mid, NodeEx out, FlowState state, CallContext cc, PartialAccessPath ap, + Configuration config + ) { + exists(ReturnKindExt kind, DataFlowCall call | + partialPathOutOfCallable1(mid, call, kind, state, cc, ap, config) + | + out.asNode() = kind.getAnOutNode(call) + ) + } + + pragma[noinline] + private predicate partialPathIntoArg( + PartialPathNodeFwd mid, ParameterPosition ppos, FlowState state, CallContext cc, + DataFlowCall call, PartialAccessPath ap, Configuration config + ) { + exists(ArgNode arg, ArgumentPosition apos | + arg = mid.getNodeEx().asNode() and + state = mid.getState() and + cc = mid.getCallContext() and + arg.argumentOf(call, apos) and + ap = mid.getAp() and + config = mid.getConfiguration() and + parameterMatch(ppos, apos) + ) + } + + pragma[nomagic] + private predicate partialPathIntoCallable0( + PartialPathNodeFwd mid, DataFlowCallable callable, ParameterPosition pos, FlowState state, + CallContext outercc, DataFlowCall call, PartialAccessPath ap, Configuration config + ) { + partialPathIntoArg(mid, pos, state, outercc, call, ap, config) and + callable = resolveCall(call, outercc) + } + + private predicate partialPathIntoCallable( + PartialPathNodeFwd mid, ParamNodeEx p, FlowState state, CallContext outercc, + CallContextCall innercc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, TSummaryCtx3 sc3, + DataFlowCall call, PartialAccessPath ap, Configuration config + ) { + exists(ParameterPosition pos, DataFlowCallable callable | + partialPathIntoCallable0(mid, callable, pos, state, outercc, call, ap, config) and + p.isParameterOf(callable, pos) and + sc1 = TSummaryCtx1Param(p) and + sc2 = TSummaryCtx2Some(state) and + sc3 = TSummaryCtx3Some(ap) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) + } + + pragma[nomagic] + private predicate paramFlowsThroughInPartialPath( + ReturnKindExt kind, FlowState state, CallContextCall cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + TSummaryCtx3 sc3, PartialAccessPath ap, Configuration config + ) { + exists(PartialPathNodeFwd mid, RetNodeEx ret | + mid.getNodeEx() = ret and + kind = ret.getKind() and + state = mid.getState() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + config = mid.getConfiguration() and + ap = mid.getAp() + ) + } + + pragma[noinline] + private predicate partialPathThroughCallable0( + DataFlowCall call, PartialPathNodeFwd mid, ReturnKindExt kind, FlowState state, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(CallContext innercc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, TSummaryCtx3 sc3 | + partialPathIntoCallable(mid, _, _, cc, innercc, sc1, sc2, sc3, call, _, config) and + paramFlowsThroughInPartialPath(kind, state, innercc, sc1, sc2, sc3, ap, config) + ) + } + + private predicate partialPathThroughCallable( + PartialPathNodeFwd mid, NodeEx out, FlowState state, CallContext cc, PartialAccessPath ap, + Configuration config + ) { + exists(DataFlowCall call, ReturnKindExt kind | + partialPathThroughCallable0(call, mid, kind, state, cc, ap, config) and + out.asNode() = kind.getAnOutNode(call) + ) + } + + pragma[nomagic] + private predicate revPartialPathStep( + PartialPathNodeRev mid, NodeEx node, FlowState state, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, + TRevSummaryCtx3 sc3, RevPartialAccessPath ap, Configuration config + ) { + localFlowStep(node, mid.getNodeEx(), config) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(node, mid.getNodeEx(), config) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + additionalLocalStateStep(node, state, mid.getNodeEx(), mid.getState(), config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + jumpStep(node, mid.getNodeEx(), config) and + state = mid.getState() and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(node, mid.getNodeEx(), config) and + state = mid.getState() and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + additionalJumpStateStep(node, state, mid.getNodeEx(), mid.getState(), config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + revPartialPathReadStep(mid, _, _, node, ap) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + config = mid.getConfiguration() + or + exists(RevPartialAccessPath ap0, Content c | + revPartialPathStoreStep(mid, ap0, c, node, config) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + apConsRev(ap, c, ap0, config) + ) + or + exists(ParamNodeEx p | + mid.getNodeEx() = p and + viableParamArgEx(_, p, node) and + state = mid.getState() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + sc3 = TRevSummaryCtx3None() and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + or + exists(ReturnPosition pos | + revPartialPathIntoReturn(mid, pos, state, sc1, sc2, sc3, _, ap, config) and + pos = getReturnPosition(node.asNode()) + ) + or + revPartialPathThroughCallable(mid, node, state, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() + } + + pragma[inline] + private predicate revPartialPathReadStep( + PartialPathNodeRev mid, RevPartialAccessPath ap1, Content c, NodeEx node, + RevPartialAccessPath ap2 + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + read(node, c, midNode, mid.getConfiguration()) and + ap2.getHead() = c and + ap2.len() = unbindInt(ap1.len() + 1) + ) + } + + pragma[nomagic] + private predicate apConsRev( + RevPartialAccessPath ap1, Content c, RevPartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeRev mid | + revPartialPathReadStep(mid, ap1, c, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathStoreStep( + PartialPathNodeRev mid, RevPartialAccessPath ap, Content c, NodeEx node, Configuration config + ) { + exists(NodeEx midNode, TypedContent tc | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + store(node, tc, midNode, _, config) and + ap.getHead() = c and + config = mid.getConfiguration() and + tc.getContent() = c + ) + } + + pragma[nomagic] + private predicate revPartialPathIntoReturn( + PartialPathNodeRev mid, ReturnPosition pos, FlowState state, TRevSummaryCtx1Some sc1, + TRevSummaryCtx2Some sc2, TRevSummaryCtx3Some sc3, DataFlowCall call, RevPartialAccessPath ap, + Configuration config + ) { + exists(NodeEx out | + mid.getNodeEx() = out and + mid.getState() = state and + viableReturnPosOutEx(call, pos, out) and + sc1 = TRevSummaryCtx1Some(pos) and + sc2 = TRevSummaryCtx2Some(state) and + sc3 = TRevSummaryCtx3Some(ap) and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathFlowsThrough( + ArgumentPosition apos, FlowState state, TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, + TRevSummaryCtx3Some sc3, RevPartialAccessPath ap, Configuration config + ) { + exists(PartialPathNodeRev mid, ParamNodeEx p, ParameterPosition ppos | + mid.getNodeEx() = p and + mid.getState() = state and + p.getPosition() = ppos and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc3 = mid.getSummaryCtx3() and + ap = mid.getAp() and + config = mid.getConfiguration() and + parameterMatch(ppos, apos) + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable0( + DataFlowCall call, PartialPathNodeRev mid, ArgumentPosition pos, FlowState state, + RevPartialAccessPath ap, Configuration config + ) { + exists(TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, TRevSummaryCtx3Some sc3 | + revPartialPathIntoReturn(mid, _, _, sc1, sc2, sc3, call, _, config) and + revPartialPathFlowsThrough(pos, state, sc1, sc2, sc3, ap, config) + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable( + PartialPathNodeRev mid, ArgNodeEx node, FlowState state, RevPartialAccessPath ap, + Configuration config + ) { + exists(DataFlowCall call, ArgumentPosition pos | + revPartialPathThroughCallable0(call, mid, pos, state, ap, config) and + node.asNode().(ArgNode).argumentOf(call, pos) + ) + } +} + +import FlowExploration + +private predicate partialFlow( + PartialPathNode source, PartialPathNode node, Configuration configuration +) { + source.getConfiguration() = configuration and + source.isFwdSource() and + node = source.getASuccessor+() +} + +private predicate revPartialFlow( + PartialPathNode node, PartialPathNode sink, Configuration configuration +) { + sink.getConfiguration() = configuration and + sink.isRevSink() and + node.getASuccessor+() = sink +} 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 87593b2dcd3..3d013a504c5 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -19,7 +19,7 @@ private import semmle.code.csharp.frameworks.system.Collections private import semmle.code.csharp.frameworks.system.threading.Tasks /** Gets the callable in which this node occurs. */ -DataFlowCallable nodeGetEnclosingCallable(Node n) { result = n.getEnclosingCallable() } +DataFlowCallable nodeGetEnclosingCallable(NodeImpl n) { result = n.getEnclosingCallableImpl() } /** Holds if `p` is a `ParameterNode` of `c` with position `pos`. */ predicate isParameterNode(ParameterNodeImpl p, DataFlowCallable c, ParameterPosition pos) { @@ -65,9 +65,9 @@ abstract class NodeImpl extends Node { private class ExprNodeImpl extends ExprNode, NodeImpl { override DataFlowCallable getEnclosingCallableImpl() { - result = this.getExpr().(CIL::Expr).getEnclosingCallable() + result.getUnderlyingCallable() = this.getExpr().(CIL::Expr).getEnclosingCallable() or - result = this.getControlFlowNodeImpl().getEnclosingCallable() + result.getUnderlyingCallable() = this.getControlFlowNodeImpl().getEnclosingCallable() } override DotNet::Type getTypeImpl() { @@ -421,7 +421,8 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) { or exists(Ssa::Definition def | LocalFlow::localSsaFlowStepUseUse(def, nodeFrom, nodeTo) and - not FlowSummaryImpl::Private::Steps::summaryClearsContentArg(nodeFrom, _) and + not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, + any(DataFlowSummarizedCallable sc)) and not LocalFlow::usesInstanceField(def) ) or @@ -506,10 +507,10 @@ private predicate fieldOrPropertyStore(Expr e, Content c, Expr src, Expr q, bool f instanceof InstanceFieldOrProperty or exists( - FlowSummary::SummarizedCallable callable, + FlowSummaryImpl::Public::SummarizedCallable sc, FlowSummaryImpl::Public::SummaryComponentStack input | - callable.propagatesFlow(input, _, _) and + sc.propagatesFlow(input, _, _) and input.contains(FlowSummary::SummaryComponent::content(f.getContent())) ) ) @@ -693,9 +694,12 @@ private module Cached { not def.(Ssa::ExplicitDefinition).getADefinition() instanceof AssignableDefinitions::ImplicitParameterDefinition } or - TExplicitParameterNode(DotNet::Parameter p) { p = any(DataFlowCallable c).getAParameter() } or + TExplicitParameterNode(DotNet::Parameter p) { + p = any(DataFlowCallable dfc).asCallable().getAParameter() + } or TInstanceParameterNode(Callable c) { - c.isUnboundDeclaration() and not c.(Modifiable).isStatic() + c = any(DataFlowCallable dfc).asCallable() and + not c.(Modifiable).isStatic() } or TYieldReturnNode(ControlFlow::Nodes::ElementNode cfn) { any(Callable c).canYieldReturn(cfn.getElement()) @@ -736,9 +740,12 @@ private module Cached { ) ) } or - TSummaryNode(FlowSummary::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) { + TSummaryNode(DataFlowSummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) { FlowSummaryImpl::Private::summaryNodeRange(c, state) } or + TSummaryParameterNode(DataFlowSummarizedCallable c, ParameterPosition pos) { + FlowSummaryImpl::Private::summaryParameterNodeRange(c, pos) + } or TParamsArgumentNode(ControlFlow::Node callCfn) { callCfn = any(Call c | isParamsArg(c, _, _)).getAControlFlowNode() } @@ -760,7 +767,8 @@ private module Cached { or // Simple flow through library code is included in the exposed local // step relation, even though flow is technically inter-procedural - FlowSummaryImpl::Private::Steps::summaryThroughStep(nodeFrom, nodeTo, true) + FlowSummaryImpl::Private::Steps::summaryThroughStepValue(nodeFrom, nodeTo, + any(DataFlowSummarizedCallable sc)) } cached @@ -810,11 +818,7 @@ predicate nodeIsHidden(Node n) { def instanceof Ssa::ImplicitCallDefinition ) or - exists(Parameter p | p = n.(ParameterNode).getParameter() | - not p.fromSource() - or - p.getCallable() instanceof FlowSummary::SummarizedCallable - ) + exists(Parameter p | p = n.(ParameterNode).getParameter() | not p.fromSource()) or n = TInstanceParameterNode(any(Callable c | @@ -831,6 +835,8 @@ predicate nodeIsHidden(Node n) { or n instanceof SummaryNode or + n instanceof SummaryParameterNode + or n instanceof ParamsArgumentNode or n.asExpr() = any(WithExpr we).getInitializer() @@ -845,7 +851,9 @@ class SsaDefinitionNode extends NodeImpl, TSsaDefinitionNode { /** Gets the underlying SSA definition. */ Ssa::Definition getDefinition() { result = def } - override DataFlowCallable getEnclosingCallableImpl() { result = def.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = def.getEnclosingCallable() + } override Type getTypeImpl() { result = def.getSourceVariable().getType() } @@ -877,10 +885,12 @@ private module ParameterNodes { } override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { - c.getParameter(pos.getPosition()) = parameter + c.asCallable().getParameter(pos.getPosition()) = parameter } - override DataFlowCallable getEnclosingCallableImpl() { result = parameter.getCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = parameter.getCallable() + } override DotNet::Type getTypeImpl() { result = parameter.getType() } @@ -901,10 +911,12 @@ private module ParameterNodes { Callable getCallable() { result = callable } override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { - callable = c and pos.isThisParameter() + callable = c.asCallable() and pos.isThisParameter() } - override DataFlowCallable getEnclosingCallableImpl() { result = callable } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = callable + } override Type getTypeImpl() { result = callable.getDeclaringType() } @@ -951,9 +963,35 @@ private module ParameterNodes { override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { pos.isImplicitCapturedParameterPosition(def.getSourceVariable().getAssignable()) and - c = this.getEnclosingCallable() + c.getUnderlyingCallable() = this.getEnclosingCallable() } } + + /** A parameter for a library callable with a flow summary. */ + class SummaryParameterNode extends ParameterNodeImpl, TSummaryParameterNode { + private FlowSummaryImpl::Public::SummarizedCallable sc; + private ParameterPosition pos_; + + SummaryParameterNode() { this = TSummaryParameterNode(sc, pos_) } + + override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { + sc = c.asSummarizedCallable() and pos = pos_ + } + + override DataFlowCallable getEnclosingCallableImpl() { result.asSummarizedCallable() = sc } + + override Type getTypeImpl() { + exists(int i | pos_.getPosition() = i and result = sc.getParameter(i).getType()) + or + pos_.isThisParameter() and result = sc.getDeclaringType() + } + + override ControlFlow::Node getControlFlowNodeImpl() { none() } + + override EmptyLocation getLocationImpl() { any() } + + override string toStringImpl() { result = "parameter " + pos_ + " of " + sc } + } } import ParameterNodes @@ -964,6 +1002,9 @@ class ArgumentNode extends Node instanceof ArgumentNodeImpl { final predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { super.argumentOf(call, pos) } + + /** Gets the call in which this node is an argument. */ + DataFlowCall getCall() { this.argumentOf(result, _) } } abstract private class ArgumentNodeImpl extends Node { @@ -1036,7 +1077,9 @@ private module ArgumentNodes { call.getControlFlowNode() = cfn } - override DataFlowCallable getEnclosingCallableImpl() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override Type getTypeImpl() { result = v.getType() } @@ -1063,7 +1106,9 @@ private module ArgumentNodes { override ControlFlow::Node getControlFlowNodeImpl() { result = cfn } - override DataFlowCallable getEnclosingCallableImpl() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override Type getTypeImpl() { result = cfn.getElement().(Expr).getType() } @@ -1100,7 +1145,9 @@ private module ArgumentNodes { pos.getPosition() = this.getParameter().getPosition() } - override DataFlowCallable getEnclosingCallableImpl() { result = callCfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = callCfn.getEnclosingCallable() + } override Type getTypeImpl() { result = this.getParameter().getType() } @@ -1179,7 +1226,9 @@ private module ReturnNodes { override NormalReturnKind getKind() { any() } - override DataFlowCallable getEnclosingCallableImpl() { result = yrs.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = yrs.getEnclosingCallable() + } override Type getTypeImpl() { result = yrs.getEnclosingCallable().getReturnType() } @@ -1203,7 +1252,9 @@ private module ReturnNodes { override NormalReturnKind getKind() { any() } - override DataFlowCallable getEnclosingCallableImpl() { result = expr.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = expr.getEnclosingCallable() + } override Type getTypeImpl() { result = expr.getEnclosingCallable().getReturnType() } @@ -1405,12 +1456,12 @@ import OutNodes /** A data-flow node used to model flow summaries. */ class SummaryNode extends NodeImpl, TSummaryNode { - private FlowSummary::SummarizedCallable c; + private FlowSummaryImpl::Public::SummarizedCallable c; private FlowSummaryImpl::Private::SummaryNodeState state; SummaryNode() { this = TSummaryNode(c, state) } - override DataFlowCallable getEnclosingCallableImpl() { result = c } + override DataFlowCallable getEnclosingCallableImpl() { result.asSummarizedCallable() = c } override DataFlowType getDataFlowType() { result = FlowSummaryImpl::Private::summaryNodeType(this) @@ -1461,7 +1512,10 @@ private class InstanceFieldOrProperty extends FieldOrProperty { InstanceFieldOrProperty() { not this.isStatic() } } -private class FieldOrPropertyAccess extends AssignableAccess, QualifiableExpr { +/** + * An access to a field or a property. + */ +class FieldOrPropertyAccess extends AssignableAccess, QualifiableExpr { FieldOrPropertyAccess() { this.getTarget() instanceof FieldOrProperty } } @@ -1498,9 +1552,9 @@ predicate jumpStep(Node pred, Node succ) { flr.hasNonlocalValue() ) or - exists(JumpReturnKind jrk, DataFlowCall call | + exists(JumpReturnKind jrk, NonDelegateDataFlowCall call | FlowSummaryImpl::Private::summaryReturnNode(pred, jrk) and - viableCallable(call) = jrk.getTarget() and + jrk.getTarget() = call.getATarget(_) and succ = getAnOutNode(call, jrk.getTargetReturnKind()) ) } @@ -1708,6 +1762,14 @@ predicate clearsContent(Node n, Content c) { ) } +/** + * Holds if the value that is being tracked is expected to be stored inside content `c` + * at node `n`. + */ +predicate expectsContent(Node n, ContentSet c) { + FlowSummaryImpl::Private::Steps::summaryExpectsContent(n, c) +} + /** * Holds if the node `n` is unreachable when the call context is `call`. */ @@ -1840,7 +1902,9 @@ private module PostUpdateNodes { .hasExprPath(_, cfn, _, call.getControlFlowNode()) } - override DataFlowCallable getEnclosingCallableImpl() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override DotNet::Type getTypeImpl() { result = oc.getType() } @@ -1858,7 +1922,9 @@ private module PostUpdateNodes { override ExprNode getPreUpdateNode() { cfn = result.getControlFlowNode() } - override DataFlowCallable getEnclosingCallableImpl() { result = cfn.getEnclosingCallable() } + override DataFlowCallable getEnclosingCallableImpl() { + result.getUnderlyingCallable() = cfn.getEnclosingCallable() + } override Type getTypeImpl() { result = cfn.getElement().(Expr).getType() } @@ -1946,11 +2012,12 @@ class LambdaCallKind = Unit; /** Holds if `creation` is an expression that creates a delegate for `c`. */ predicate lambdaCreation(ExprNode creation, LambdaCallKind kind, DataFlowCallable c) { exists(Expr e | e = creation.getExpr() | - c = e.(AnonymousFunctionExpr) + c.getUnderlyingCallable() = e.(AnonymousFunctionExpr) or - c = e.(CallableAccess).getTarget().getUnboundDeclaration() + c.getUnderlyingCallable() = e.(CallableAccess).getTarget().getUnboundDeclaration() or - c = e.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration() + c.getUnderlyingCallable() = + e.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration() ) and kind = TMkUnit() } @@ -2026,3 +2093,54 @@ abstract class SyntheticField extends string { /** Gets the type of this synthetic field. */ Type getType() { result instanceof ObjectType } } + +/** + * Holds if the the content `c` is a container. + */ +predicate containerContent(DataFlow::Content c) { c instanceof DataFlow::ElementContent } + +/** Gets the string representation of the parameters of `c`. */ +string parameterQualifiedTypeNamesToString(DotNet::Callable c) { + result = + concat(Parameter p, int i | + p = c.getParameter(i) + | + p.getType().getQualifiedName(), "," order by i + ) +} + +/** + * A module containing predicates related to generating models as data. + */ +module Csv { + /** Holds if the summary should apply for all overrides of `c`. */ + predicate isBaseCallableOrPrototype(DotNet::Callable c) { + c.getDeclaringType() instanceof Interface + or + exists(Modifiable m | m = [c.(Modifiable), c.(Accessor).getDeclaration()] | + m.isAbstract() + or + c.getDeclaringType().(Modifiable).isAbstract() and m.(Virtualizable).isVirtual() + ) + } + + /** Gets a string representing whether the summary should apply for all overrides of `c`. */ + private string getCallableOverride(DotNet::Callable c) { + if isBaseCallableOrPrototype(c) then result = "true" else result = "false" + } + + /** Computes the first 6 columns for CSV rows of `c`. */ + string asPartialModel(DotNet::Callable c) { + exists(string namespace, string type, string name | + c.getDeclaringType().hasQualifiedName(namespace, type) and + c.hasQualifiedName(_, name) and + result = + namespace + ";" // + + type + ";" // + + getCallableOverride(c) + ";" // + + name + ";" // + + "(" + parameterQualifiedTypeNamesToString(c) + ")" + ";" // + + /* ext + */ ";" // + ) + } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index b6d749e18fd..388179eeb8e 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -40,8 +40,8 @@ class Node extends TNode { final DotNet::Type getType() { result = this.(NodeImpl).getTypeImpl() } /** Gets the enclosing callable of this node. */ - final DataFlowCallable getEnclosingCallable() { - result = this.(NodeImpl).getEnclosingCallableImpl() + final Callable getEnclosingCallable() { + result = this.(NodeImpl).getEnclosingCallableImpl().getUnderlyingCallable() } /** Gets the control flow node corresponding to this node, if any. */ @@ -103,7 +103,7 @@ class ParameterNode extends Node instanceof ParameterNodeImpl { DotNet::Parameter getParameter() { exists(DataFlowCallable c, ParameterPosition ppos | super.isParameterOf(c, ppos) and - result = c.getParameter(ppos.getPosition()) + result = c.getUnderlyingCallable().getParameter(ppos.getPosition()) ) } @@ -204,12 +204,6 @@ class Content extends TContent { /** Gets the location of this content. */ Location getLocation() { none() } - - /** Gets the type of the object containing this content. */ - deprecated Gvn::GvnType getContainerType() { none() } - - /** Gets the type of this content. */ - deprecated Gvn::GvnType getType() { none() } } /** A reference to a field. */ @@ -224,12 +218,6 @@ class FieldContent extends Content, TFieldContent { override string toString() { result = "field " + f.getName() } override Location getLocation() { result = f.getLocation() } - - deprecated override Gvn::GvnType getContainerType() { - result = Gvn::getGlobalValueNumber(f.getDeclaringType()) - } - - deprecated override Gvn::GvnType getType() { result = Gvn::getGlobalValueNumber(f.getType()) } } /** A reference to a synthetic field. */ @@ -256,12 +244,6 @@ class PropertyContent extends Content, TPropertyContent { override string toString() { result = "property " + p.getName() } override Location getLocation() { result = p.getLocation() } - - deprecated override Gvn::GvnType getContainerType() { - result = Gvn::getGlobalValueNumber(p.getDeclaringType()) - } - - deprecated override Gvn::GvnType getType() { result = Gvn::getGlobalValueNumber(p.getType()) } } /** A reference to an element in a collection. */ @@ -270,3 +252,23 @@ class ElementContent extends Content, TElementContent { override Location getLocation() { result instanceof EmptyLocation } } + +/** + * An entity that represents a set of `Content`s. + * + * The set may be interpreted differently depending on whether it is + * stored into (`getAStoreContent`) or read from (`getAReadContent`). + */ +class ContentSet instanceof Content { + /** Gets a content that may be stored into when storing into this set. */ + Content getAStoreContent() { result = this } + + /** Gets a content that may be read from when reading from this set. */ + Content getAReadContent() { result = this } + + /** Gets a textual representation of this content set. */ + string toString() { result = super.toString() } + + /** Gets the location of this content set. */ + Location getLocation() { result = super.getLocation() } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index e59c96a5c17..d907032547d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -24,7 +24,11 @@ module Public { class SummaryComponent extends TSummaryComponent { /** Gets a textual representation of this summary component. */ string toString() { - exists(Content c | this = TContentSummaryComponent(c) and result = c.toString()) + exists(ContentSet c | this = TContentSummaryComponent(c) and result = c.toString()) + or + exists(ContentSet c | this = TWithoutContentSummaryComponent(c) and result = "without " + c) + or + exists(ContentSet c | this = TWithContentSummaryComponent(c) and result = "with " + c) or exists(ArgumentPosition pos | this = TParameterSummaryComponent(pos) and result = "parameter " + pos @@ -41,7 +45,13 @@ module Public { /** Provides predicates for constructing summary components. */ module SummaryComponent { /** Gets a summary component for content `c`. */ - SummaryComponent content(Content c) { result = TContentSummaryComponent(c) } + SummaryComponent content(ContentSet c) { result = TContentSummaryComponent(c) } + + /** Gets a summary component where data is not allowed to be stored in `c`. */ + SummaryComponent withoutContent(ContentSet c) { result = TWithoutContentSummaryComponent(c) } + + /** Gets a summary component where data must be stored in `c`. */ + SummaryComponent withContent(ContentSet c) { result = TWithContentSummaryComponent(c) } /** Gets a summary component for a parameter at position `pos`. */ SummaryComponent parameter(ArgumentPosition pos) { result = TParameterSummaryComponent(pos) } @@ -185,7 +195,10 @@ module Public { } /** A callable with a flow summary. */ - abstract class SummarizedCallable extends DataFlowCallable { + abstract class SummarizedCallable extends SummarizedCallableBase { + bindingset[this] + SummarizedCallable() { any() } + /** * Holds if data may flow from `input` to `output` through this callable. * @@ -216,9 +229,16 @@ module Public { /** * Holds if values stored inside `content` are cleared on objects passed as * arguments at position `pos` to this callable. + * + * TODO: Remove once all languages support `WithoutContent` tokens. */ pragma[nomagic] - predicate clearsContent(ParameterPosition pos, Content content) { none() } + predicate clearsContent(ParameterPosition pos, ContentSet content) { none() } + + /** + * Holds if the summary is auto generated. + */ + predicate isAutoGenerated() { none() } } } @@ -231,10 +251,12 @@ module Private { import AccessPathSyntax newtype TSummaryComponent = - TContentSummaryComponent(Content c) or + TContentSummaryComponent(ContentSet c) or TParameterSummaryComponent(ArgumentPosition pos) or TArgumentSummaryComponent(ParameterPosition pos) or - TReturnSummaryComponent(ReturnKind rk) + TReturnSummaryComponent(ReturnKind rk) or + TWithoutContentSummaryComponent(ContentSet c) or + TWithContentSummaryComponent(ContentSet c) private TParameterSummaryComponent thisParam() { result = TParameterSummaryComponent(instanceParameterPosition()) @@ -296,6 +318,23 @@ module Private { SummaryComponentStack::singleton(TArgumentSummaryComponent(_))) and preservesValue = preservesValue1.booleanAnd(preservesValue2) ) + or + exists(ParameterPosition ppos, ContentSet cs | + c.clearsContent(ppos, cs) and + input = SummaryComponentStack::push(SummaryComponent::withoutContent(cs), output) and + output = SummaryComponentStack::argument(ppos) and + preservesValue = true + ) + } + + private class MkClearStack extends RequiredSummaryComponentStack { + override predicate required(SummaryComponent head, SummaryComponentStack tail) { + exists(SummarizedCallable sc, ParameterPosition ppos, ContentSet cs | + sc.clearsContent(ppos, cs) and + head = SummaryComponent::withoutContent(cs) and + tail = SummaryComponentStack::argument(ppos) + ) + } } /** @@ -378,10 +417,7 @@ module Private { private newtype TSummaryNodeState = TSummaryNodeInputState(SummaryComponentStack s) { inputState(_, s) } or - TSummaryNodeOutputState(SummaryComponentStack s) { outputState(_, s) } or - TSummaryNodeClearsContentState(ParameterPosition pos, boolean post) { - any(SummarizedCallable sc).clearsContent(pos, _) and post in [false, true] - } + TSummaryNodeOutputState(SummaryComponentStack s) { outputState(_, s) } /** * A state used to break up (complex) flow summaries into atomic flow steps. @@ -428,12 +464,6 @@ module Private { this = TSummaryNodeOutputState(s) and result = "to write: " + s ) - or - exists(ParameterPosition pos, boolean post, string postStr | - this = TSummaryNodeClearsContentState(pos, post) and - (if post = true then postStr = " (post)" else postStr = "") and - result = "clear: " + pos + postStr - ) } } @@ -457,11 +487,6 @@ module Private { not parameterReadState(c, state, _) or state.isOutputState(c, _) - or - exists(ParameterPosition pos | - c.clearsContent(pos, _) and - state = TSummaryNodeClearsContentState(pos, _) - ) } pragma[noinline] @@ -471,7 +496,7 @@ module Private { or exists(ParameterPosition pos | parameterReadState(c, state, pos) and - result.(ParamNode).isParameterOf(c, pos) + result.(ParamNode).isParameterOf(inject(c), pos) ) ) } @@ -497,8 +522,6 @@ module Private { parameterReadState(c, _, pos) or isParameterPostUpdate(_, c, pos) - or - c.clearsContent(pos, _) } private predicate callbackOutput( @@ -506,7 +529,7 @@ module Private { ) { any(SummaryNodeState state).isInputState(c, s) and s.head() = TReturnSummaryComponent(rk) and - receiver = summaryNodeInputState(c, s.drop(1)) + receiver = summaryNodeInputState(c, s.tail()) } private predicate callbackInput( @@ -514,7 +537,7 @@ module Private { ) { any(SummaryNodeState state).isOutputState(c, s) and s.head() = TParameterSummaryComponent(pos) and - receiver = summaryNodeInputState(c, s.drop(1)) + receiver = summaryNodeInputState(c, s.tail()) } /** Holds if a call targeting `receiver` should be synthesized inside `c`. */ @@ -540,21 +563,27 @@ module Private { exists(SummarizedCallable c, SummaryComponentStack s, SummaryComponent head | head = s.head() | n = summaryNodeInputState(c, s) and ( - exists(Content cont | - head = TContentSummaryComponent(cont) and result = getContentType(cont) + exists(ContentSet cont | result = getContentType(cont) | + head = TContentSummaryComponent(cont) or + head = TWithContentSummaryComponent(cont) + ) + or + exists(ContentSet cont | + head = TWithoutContentSummaryComponent(cont) and + result = getNodeType(summaryNodeInputState(c, s.tail())) ) or exists(ReturnKind rk | head = TReturnSummaryComponent(rk) and result = getCallbackReturnType(getNodeType(summaryNodeInputState(pragma[only_bind_out](c), - s.drop(1))), rk) + s.tail())), rk) ) ) or n = summaryNodeOutputState(c, s) and ( - exists(Content cont | + exists(ContentSet cont | head = TContentSummaryComponent(cont) and result = getContentType(cont) ) or @@ -567,16 +596,10 @@ module Private { exists(ArgumentPosition pos | head = TParameterSummaryComponent(pos) | result = getCallbackParameterType(getNodeType(summaryNodeInputState(pragma[only_bind_out](c), - s.drop(1))), pos) + s.tail())), pos) ) ) ) - or - exists(SummarizedCallable c, ParameterPosition pos, ParamNode p | - n = summaryNode(c, TSummaryNodeClearsContentState(pos, false)) and - p.isParameterOf(c, pos) and - result = getNodeType(p) - ) } /** Holds if summary node `out` contains output of kind `rk` from call `c`. */ @@ -601,10 +624,7 @@ module Private { predicate summaryPostUpdateNode(Node post, Node pre) { exists(SummarizedCallable c, ParameterPosition pos | isParameterPostUpdate(post, c, pos) and - pre.(ParamNode).isParameterOf(c, pos) - or - pre = summaryNode(c, TSummaryNodeClearsContentState(pos, false)) and - post = summaryNode(c, TSummaryNodeClearsContentState(pos, true)) + pre.(ParamNode).isParameterOf(inject(c), pos) ) or exists(SummarizedCallable callable, SummaryComponentStack s | @@ -627,9 +647,7 @@ module Private { * node, and back out to `p`. */ predicate summaryAllowParameterReturnInSelf(ParamNode p) { - exists(SummarizedCallable c, ParameterPosition ppos | p.isParameterOf(c, ppos) | - c.clearsContent(ppos, _) - or + exists(SummarizedCallable c, ParameterPosition ppos | p.isParameterOf(inject(c), ppos) | exists(SummaryComponentStack inputContents, SummaryComponentStack outputContents | summary(c, inputContents, outputContents, _) and inputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) and @@ -658,9 +676,10 @@ module Private { preservesValue = false and not summary(c, inputContents, outputContents, true) ) or - exists(SummarizedCallable c, ParameterPosition pos | - pred.(ParamNode).isParameterOf(c, pos) and - succ = summaryNode(c, TSummaryNodeClearsContentState(pos, _)) and + exists(SummarizedCallable c, SummaryComponentStack s | + pred = summaryNodeInputState(c, s.tail()) and + succ = summaryNodeInputState(c, s) and + s.head() = [SummaryComponent::withContent(_), SummaryComponent::withoutContent(_)] and preservesValue = true ) } @@ -669,9 +688,9 @@ module Private { * Holds if there is a read step of content `c` from `pred` to `succ`, which * is synthesized from a flow summary. */ - predicate summaryReadStep(Node pred, Content c, Node succ) { + predicate summaryReadStep(Node pred, ContentSet c, Node succ) { exists(SummarizedCallable sc, SummaryComponentStack s | - pred = summaryNodeInputState(sc, s.drop(1)) and + pred = summaryNodeInputState(sc, s.tail()) and succ = summaryNodeInputState(sc, s) and SummaryComponent::content(c) = s.head() ) @@ -681,10 +700,10 @@ module Private { * Holds if there is a store step of content `c` from `pred` to `succ`, which * is synthesized from a flow summary. */ - predicate summaryStoreStep(Node pred, Content c, Node succ) { + predicate summaryStoreStep(Node pred, ContentSet c, Node succ) { exists(SummarizedCallable sc, SummaryComponentStack s | pred = summaryNodeOutputState(sc, s) and - succ = summaryNodeOutputState(sc, s.drop(1)) and + succ = summaryNodeOutputState(sc, s.tail()) and SummaryComponent::content(c) = s.head() ) } @@ -708,10 +727,23 @@ module Private { * `a` on line 2 to the post-update node for `a` on that line (via an intermediate * node where field `b` is cleared). */ - predicate summaryClearsContent(Node n, Content c) { - exists(SummarizedCallable sc, ParameterPosition pos | - n = summaryNode(sc, TSummaryNodeClearsContentState(pos, true)) and - sc.clearsContent(pos, c) + predicate summaryClearsContent(Node n, ContentSet c) { + exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | + n = summaryNode(sc, state) and + state.isInputState(sc, stack) and + stack.head() = SummaryComponent::withoutContent(c) + ) + } + + /** + * Holds if the value that is being tracked is expected to be stored inside + * content `c` at `n`. + */ + predicate summaryExpectsContent(Node n, ContentSet c) { + exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | + n = summaryNode(sc, state) and + state.isInputState(sc, stack) and + stack.head() = SummaryComponent::withContent(c) ) } @@ -719,55 +751,79 @@ module Private { private predicate viableParam( DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos, ParamNode p ) { - p.isParameterOf(sc, ppos) and - sc = viableCallable(call) - } - - /** - * Holds if values stored inside content `c` are cleared inside a - * callable to which `arg` is an argument. - * - * In such cases, it is important to prevent use-use flow out of - * `arg` (see comment for `summaryClearsContent`). - */ - predicate summaryClearsContentArg(ArgNode arg, Content c) { - exists(DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos | - argumentPositionMatch(call, arg, ppos) and - viableParam(call, sc, ppos, _) and - sc.clearsContent(ppos, c) + exists(DataFlowCallable c | + c = inject(sc) and + p.isParameterOf(c, ppos) and + c = viableCallable(call) ) } pragma[nomagic] - private ParamNode summaryArgParam0(DataFlowCall call, ArgNode arg) { - exists(ParameterPosition ppos, SummarizedCallable sc | + private ParamNode summaryArgParam0(DataFlowCall call, ArgNode arg, SummarizedCallable sc) { + exists(ParameterPosition ppos | argumentPositionMatch(call, arg, ppos) and viableParam(call, sc, ppos, result) ) } + /** + * Holds if use-use flow starting from `arg` should be prohibited. + * + * This is the case when `arg` is the argument of a call that targets a + * flow summary where the corresponding parameter either clears contents + * or expects contents. + */ pragma[nomagic] - private ParamNode summaryArgParam(ArgNode arg, ReturnKindExt rk, OutNodeExt out) { - exists(DataFlowCall call | - result = summaryArgParam0(call, arg) and - out = rk.getAnOutNode(call) + predicate prohibitsUseUseFlow(ArgNode arg, SummarizedCallable sc) { + exists(ParamNode p, Node mid, ParameterPosition ppos, Node ret | + p = summaryArgParam0(_, arg, sc) and + p.isParameterOf(_, ppos) and + summaryLocalStep(p, mid, true) and + summaryLocalStep(mid, ret, true) and + isParameterPostUpdate(ret, _, ppos) + | + summaryClearsContent(mid, _) or + summaryExpectsContent(mid, _) + ) + } + + bindingset[ret] + private ParamNode summaryArgParam( + ArgNode arg, ReturnNodeExt ret, OutNodeExt out, SummarizedCallable sc + ) { + exists(DataFlowCall call, ReturnKindExt rk | + result = summaryArgParam0(call, arg, sc) and + ret.getKind() = pragma[only_bind_into](rk) and + out = pragma[only_bind_into](rk).getAnOutNode(call) ) } /** - * Holds if `arg` flows to `out` using a simple flow summary, that is, a flow - * summary without reads and stores. + * Holds if `arg` flows to `out` using a simple value-preserving flow + * summary, that is, a flow summary without reads and stores. * * NOTE: This step should not be used in global data-flow/taint-tracking, but may * be useful to include in the exposed local data-flow/taint-tracking relations. */ - predicate summaryThroughStep(ArgNode arg, Node out, boolean preservesValue) { - exists(ReturnKindExt rk, ReturnNodeExt ret | - summaryLocalStep(summaryArgParam(arg, rk, out), ret, preservesValue) and - ret.getKind() = rk + predicate summaryThroughStepValue(ArgNode arg, Node out, SummarizedCallable sc) { + exists(ReturnKind rk, ReturnNode ret, DataFlowCall call | + summaryLocalStep(summaryArgParam0(call, arg, sc), ret, true) and + ret.getKind() = pragma[only_bind_into](rk) and + out = getAnOutNode(call, pragma[only_bind_into](rk)) ) } + /** + * Holds if `arg` flows to `out` using a simple flow summary involving taint + * step, that is, a flow summary without reads and stores. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryThroughStepTaint(ArgNode arg, Node out, SummarizedCallable sc) { + exists(ReturnNodeExt ret | summaryLocalStep(summaryArgParam(arg, ret, out, sc), ret, false)) + } + /** * Holds if there is a read(+taint) of `c` from `arg` to `out` using a * flow summary. @@ -775,11 +831,10 @@ module Private { * NOTE: This step should not be used in global data-flow/taint-tracking, but may * be useful to include in the exposed local data-flow/taint-tracking relations. */ - predicate summaryGetterStep(ArgNode arg, Content c, Node out) { - exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret | - summaryReadStep(summaryArgParam(arg, rk, out), c, mid) and - summaryLocalStep(mid, ret, _) and - ret.getKind() = rk + predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { + exists(Node mid, ReturnNodeExt ret | + summaryReadStep(summaryArgParam(arg, ret, out, sc), c, mid) and + summaryLocalStep(mid, ret, _) ) } @@ -790,11 +845,10 @@ module Private { * NOTE: This step should not be used in global data-flow/taint-tracking, but may * be useful to include in the exposed local data-flow/taint-tracking relations. */ - predicate summarySetterStep(ArgNode arg, Content c, Node out) { - exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret | - summaryLocalStep(summaryArgParam(arg, rk, out), mid, _) and - summaryStoreStep(mid, c, ret) and - ret.getKind() = rk + predicate summarySetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { + exists(Node mid, ReturnNodeExt ret | + summaryLocalStep(summaryArgParam(arg, ret, out, sc), mid, _) and + summaryStoreStep(mid, c, ret) ) } } @@ -806,10 +860,10 @@ module Private { module External { /** Holds if `spec` is a relevant external specification. */ private predicate relevantSpec(string spec) { - summaryElement(_, spec, _, _) or - summaryElement(_, _, spec, _) or - sourceElement(_, spec, _) or - sinkElement(_, spec, _) + summaryElement(_, spec, _, _, _) or + summaryElement(_, _, spec, _, _) or + sourceElement(_, spec, _, _) or + sinkElement(_, spec, _, _) } private class AccessPathRange extends AccessPath::Range { @@ -875,13 +929,27 @@ module Private { } private class SummarizedCallableExternal extends SummarizedCallable { - SummarizedCallableExternal() { summaryElement(this, _, _, _) } + SummarizedCallableExternal() { summaryElement(this, _, _, _, _) } + + private predicate relevantSummaryElementGenerated( + AccessPath inSpec, AccessPath outSpec, string kind + ) { + summaryElement(this, inSpec, outSpec, kind, true) and + not summaryElement(this, _, _, _, false) and + not this.clearsContent(_, _) + } + + private predicate relevantSummaryElement(AccessPath inSpec, AccessPath outSpec, string kind) { + summaryElement(this, inSpec, outSpec, kind, false) + or + this.relevantSummaryElementGenerated(inSpec, outSpec, kind) + } override predicate propagatesFlow( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { exists(AccessPath inSpec, AccessPath outSpec, string kind | - summaryElement(this, inSpec, outSpec, kind) and + this.relevantSummaryElement(inSpec, outSpec, kind) and interpretSpec(inSpec, input) and interpretSpec(outSpec, output) | @@ -890,6 +958,8 @@ module Private { kind = "taint" and preservesValue = false ) } + + override predicate isAutoGenerated() { this.relevantSummaryElementGenerated(_, _, _) } } /** Holds if component `c` of specification `spec` cannot be parsed. */ @@ -910,7 +980,7 @@ module Private { private predicate sourceElementRef(InterpretNode ref, AccessPath output, string kind) { exists(SourceOrSinkElement e | - sourceElement(e, output, kind) and + sourceElement(e, output, kind, _) and if outputNeedsReference(output.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() @@ -919,7 +989,7 @@ module Private { private predicate sinkElementRef(InterpretNode ref, AccessPath input, string kind) { exists(SourceOrSinkElement e | - sinkElement(e, input, kind) and + sinkElement(e, input, kind, _) and if inputNeedsReference(input.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() @@ -1025,7 +1095,7 @@ module Private { /** Provides a query predicate for outputting a set of relevant flow summaries. */ module TestOutput { /** A flow summary to include in the `summary/3` query predicate. */ - abstract class RelevantSummarizedCallable extends SummarizedCallable { + abstract class RelevantSummarizedCallable instanceof SummarizedCallable { /** Gets the string representation of this callable used by `summary/1`. */ abstract string getCallableCsv(); @@ -1033,8 +1103,10 @@ module Private { predicate relevantSummary( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { - this.propagatesFlow(input, output, preservesValue) + super.propagatesFlow(input, output, preservesValue) } + + string toString() { result = super.toString() } } /** Render the kind in the format used in flow summaries. */ @@ -1044,9 +1116,13 @@ module Private { preservesValue = false and result = "taint" } + private string renderGenerated(RelevantSummarizedCallable c) { + if c.(SummarizedCallable).isAutoGenerated() then result = "generated:" else result = "" + } + /** * A query predicate for outputting flow summaries in semi-colon separated format in QL tests. - * The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind", + * The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;(generated:)?kind", * ext is hardcoded to empty. */ query predicate summary(string csv) { @@ -1056,8 +1132,8 @@ module Private { | c.relevantSummary(input, output, preservesValue) and csv = - c.getCallableCsv() + ";;" + getComponentStackCsv(input) + ";" + - getComponentStackCsv(output) + ";" + renderKind(preservesValue) + c.getCallableCsv() + getComponentStackCsv(input) + ";" + getComponentStackCsv(output) + + ";" + renderGenerated(c) + renderKind(preservesValue) ) } } @@ -1071,19 +1147,21 @@ module Private { */ module RenderSummarizedCallable { /** A summarized callable to include in the graph. */ - abstract class RelevantSummarizedCallable extends SummarizedCallable { } + abstract class RelevantSummarizedCallable instanceof SummarizedCallable { + string toString() { result = super.toString() } + } private newtype TNodeOrCall = MkNode(Node n) { exists(RelevantSummarizedCallable c | n = summaryNode(c, _) or - n.(ParamNode).isParameterOf(c, _) + n.(ParamNode).isParameterOf(inject(c), _) ) } or MkCall(DataFlowCall call) { call = summaryDataFlowCall(_) and - call.getEnclosingCallable() instanceof RelevantSummarizedCallable + call.getEnclosingCallable() = inject(any(RelevantSummarizedCallable c)) } private class NodeOrCall extends TNodeOrCall { @@ -1123,7 +1201,7 @@ module Private { if preservesValue = true then value = "value" else value = "taint" ) or - exists(Content c | + exists(ContentSet c | Private::Steps::summaryReadStep(a.asNode(), c, b.asNode()) and value = "read (" + c + ")" or @@ -1133,6 +1211,10 @@ module Private { Private::Steps::summaryClearsContent(a.asNode(), c) and b = a and value = "clear (" + c + ")" + or + Private::Steps::summaryExpectsContent(a.asNode(), c) and + b = a and + value = "expect (" + c + ")" ) or summaryPostUpdateNode(b.asNode(), a.asNode()) and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll index 0d34fa5b68c..7fa9df72ba2 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll @@ -3,6 +3,7 @@ */ private import csharp +private import dotnet private import semmle.code.csharp.frameworks.system.linq.Expressions private import DataFlowDispatch private import DataFlowPrivate @@ -12,6 +13,13 @@ private import FlowSummaryImpl::Private private import FlowSummaryImpl::Public private import semmle.code.csharp.Unification private import semmle.code.csharp.dataflow.ExternalFlow +private import semmle.code.csharp.dataflow.FlowSummary as FlowSummary + +class SummarizedCallableBase extends Callable { + SummarizedCallableBase() { this.isUnboundDeclaration() } +} + +DataFlowCallable inject(SummarizedCallable c) { result.asSummarizedCallable() = c } /** Gets the parameter position of the instance parameter. */ ArgumentPosition instanceParameterPosition() { none() } // disables implicit summary flow to `this` for callbacks @@ -36,7 +44,7 @@ DataFlowType getContentType(Content c) { ) } -private DataFlowType getReturnTypeBase(DataFlowCallable c, ReturnKind rk) { +private DataFlowType getReturnTypeBase(DotNet::Callable c, ReturnKind rk) { exists(Type t | result = Gvn::getGlobalValueNumber(t) | rk instanceof NormalReturnKind and ( @@ -85,39 +93,42 @@ DataFlowType getCallbackReturnType(DataFlowType t, ReturnKind rk) { /** * Holds if an external flow summary exists for `c` with input specification - * `input`, output specification `output`, and kind `kind`. + * `input`, output specification `output`, kind `kind`, and a flag `generated` + * stating whether the summary is autogenerated. */ -predicate summaryElement(DataFlowCallable c, string input, string output, string kind) { +predicate summaryElement(Callable c, string input, string output, string kind, boolean generated) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext | - summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind) and + summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, generated) and c = interpretElement(namespace, type, subtypes, name, signature, ext) ) } /** * Holds if an external source specification exists for `e` with output specification - * `output` and kind `kind`. + * `output`, kind `kind`, and a flag `generated` stating whether the source specification is + * autogenerated. */ -predicate sourceElement(Element e, string output, string kind) { +predicate sourceElement(Element e, string output, string kind, boolean generated) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext | - sourceModel(namespace, type, subtypes, name, signature, ext, output, kind) and + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, generated) and e = interpretElement(namespace, type, subtypes, name, signature, ext) ) } /** - * Holds if an external sink specification exists for `n` with input specification - * `input` and kind `kind`. + * Holds if an external sink specification exists for `e` with input specification + * `input`, kind `kind` and a flag `generated` stating whether the sink specification is + * autogenerated. */ -predicate sinkElement(Element e, string input, string kind) { +predicate sinkElement(Element e, string input, string kind, boolean generated) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext | - sinkModel(namespace, type, subtypes, name, signature, ext, input, kind) and + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, generated) and e = interpretElement(namespace, type, subtypes, name, signature, ext) ) } @@ -214,10 +225,10 @@ class InterpretNode extends TInterpretNode { DataFlowCall asCall() { this = TDataFlowCall_(result) } /** Gets the callable that this node corresponds to, if any. */ - DataFlowCallable asCallable() { result = this.asElement() } + DataFlowCallable asCallable() { result.getUnderlyingCallable() = this.asElement() } /** Gets the target of this call, if any. */ - Callable getCallTarget() { result = viableCallable(this.asCall()) } + Callable getCallTarget() { result = this.asCall().(NonDelegateDataFlowCall).getATarget(_) } /** Gets a textual representation of this node. */ string toString() { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll index 19bf1d4f27d..eed0d050735 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll @@ -287,20 +287,6 @@ private module SsaDefReaches { ) } - /** - * Holds if the SSA definition of `v` at `def` reaches uncertain SSA definition - * `redef` in the same basic block, without crossing another SSA definition of `v`. - */ - predicate ssaDefReachesUncertainDefWithinBlock( - SourceVariable v, Definition def, UncertainWriteDefinition redef - ) { - exists(BasicBlock bb, int rnk, int i | - ssaDefReachesRank(bb, def, rnk, v) and - rnk = ssaRefRank(bb, i, v, SsaDef()) - 1 and - redef.definesAt(v, bb, i) - ) - } - /** * Same as `ssaRefRank()`, but restricted to a particular SSA definition `def`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll index 2f07de27afd..a929e23a942 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll @@ -3,7 +3,6 @@ private import csharp private import AssignableDefinitions private import SsaImpl as SsaImpl -private import semmle.code.csharp.dataflow.SSA class BasicBlock = ControlFlow::BasicBlock; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index f2e99db0663..268c5cd49df 100755 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -2,6 +2,7 @@ private import csharp private import TaintTrackingPublic private import FlowSummaryImpl as FlowSummaryImpl private import semmle.code.csharp.Caching +private import semmle.code.csharp.dataflow.internal.DataFlowDispatch private import semmle.code.csharp.dataflow.internal.DataFlowPrivate private import semmle.code.csharp.dataflow.internal.ControlFlowReachability private import semmle.code.csharp.dispatch.Dispatch @@ -31,8 +32,6 @@ predicate defaultTaintSanitizerGuard(DataFlow::BarrierGuard guard) { none() } bindingset[node] predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::Content c) { none() } -deprecated predicate localAdditionalTaintStep = defaultAdditionalTaintStep/2; - private CIL::DataFlowNode asCilDataFlowNode(DataFlow::Node node) { result = node.asParameter() or result = node.asExpr() @@ -119,19 +118,22 @@ private module Cached { ( // Simple flow through library code is included in the exposed local // step relation, even though flow is technically inter-procedural - FlowSummaryImpl::Private::Steps::summaryThroughStep(nodeFrom, nodeTo, false) + FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(nodeFrom, nodeTo, + any(DataFlowSummarizedCallable sc)) or // Taint collection by adding a tainted element exists(DataFlow::ElementContent c | storeStep(nodeFrom, c, nodeTo) or - FlowSummaryImpl::Private::Steps::summarySetterStep(nodeFrom, c, nodeTo) + FlowSummaryImpl::Private::Steps::summarySetterStep(nodeFrom, c, nodeTo, + any(DataFlowSummarizedCallable sc)) ) or exists(DataFlow::Content c | readStep(nodeFrom, c, nodeTo) or - FlowSummaryImpl::Private::Steps::summaryGetterStep(nodeFrom, c, nodeTo) + FlowSummaryImpl::Private::Steps::summaryGetterStep(nodeFrom, c, nodeTo, + any(DataFlowSummarizedCallable sc)) | // Taint members c = any(TaintedMember m).(FieldOrProperty).getContent() diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll index 19bf1d4f27d..eed0d050735 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll @@ -287,20 +287,6 @@ private module SsaDefReaches { ) } - /** - * Holds if the SSA definition of `v` at `def` reaches uncertain SSA definition - * `redef` in the same basic block, without crossing another SSA definition of `v`. - */ - predicate ssaDefReachesUncertainDefWithinBlock( - SourceVariable v, Definition def, UncertainWriteDefinition redef - ) { - exists(BasicBlock bb, int rnk, int i | - ssaDefReachesRank(bb, def, rnk, v) and - rnk = ssaRefRank(bb, i, v, SsaDef()) - 1 and - redef.definesAt(v, bb, i) - ) - } - /** * Same as `ssaRefRank()`, but restricted to a particular SSA definition `def`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll index 030020ede63..74aee61e690 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll @@ -43,37 +43,4 @@ module Private { predicate ssaUpdateStep = RU::ssaUpdateStep/3; Expr getABasicBlockExpr(BasicBlock bb) { result = bb.getANode() } - - private class PhiInputEdgeBlock extends BasicBlock { - PhiInputEdgeBlock() { this = any(SsaReadPositionPhiInputEdge edge).getOrigBlock() } - } - - int getId(PhiInputEdgeBlock bb) { - exists(CfgImpl::ControlFlowTree::Range_ t | CfgImpl::ControlFlowTree::idOf(t, result) | - t = bb.getFirstNode().getElement() - or - t = bb.(CS::ControlFlow::BasicBlocks::EntryBlock).getCallable() - ) - } - - private string getSplitString(PhiInputEdgeBlock bb) { - result = bb.getFirstNode().(CS::ControlFlow::Nodes::ElementNode).getSplitsString() - or - not exists(bb.getFirstNode().(CS::ControlFlow::Nodes::ElementNode).getSplitsString()) and - result = "" - } - - /** - * Holds if `inp` is an input to `phi` along `edge` and this input has index `r` - * in an arbitrary 1-based numbering of the input edges to `phi`. - */ - predicate rankedPhiInput(SsaPhiNode phi, SsaVariable inp, SsaReadPositionPhiInputEdge edge, int r) { - edge.phiInput(phi, inp) and - edge = - rank[r](SsaReadPositionPhiInputEdge e | - e.phiInput(phi, _) - | - e order by getId(e.getOrigBlock()), getSplitString(e.getOrigBlock()) - ) - } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll index 06af17094a5..5a3b4f63d9f 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll @@ -49,7 +49,7 @@ private predicate unknownSign(Expr e) { or exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat())) or - exists(CastExpr cast, Type fromtyp | + exists(CastingExpr cast, Type fromtyp | cast = e and fromtyp = cast.getSourceType() and not fromtyp instanceof NumericOrCharType diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index 9691c8dffa7..04d0816a683 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -29,6 +29,8 @@ module Private { class CastExpr = RU::ExprNode::CastExpr; + class CastingExpr = CastExpr; + class Type = CS::Type; class Expr = CS::ControlFlow::Nodes::ExprNode; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll index e450c11b5ab..08335f6680d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll @@ -3,6 +3,7 @@ */ private import SsaReadPositionSpecific +import SsaReadPositionSpecific::Public private newtype TSsaReadPosition = TSsaReadPositionBlock(BasicBlock bb) { bb = getAReadBasicBlock(_) } or @@ -55,3 +56,10 @@ class SsaReadPositionPhiInputEdge extends SsaReadPosition, TSsaReadPositionPhiIn override string toString() { result = "edge" } } + +/** + * Holds if `rix` is the number of input edges to `phi`. + */ +predicate maxPhiInputRank(SsaPhiNode phi, int rix) { + rix = max(int r | rankedPhiInput(phi, _, _, r)) +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll index 7afd9a2a33d..6b91651691d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll @@ -3,6 +3,8 @@ */ private import csharp +private import SsaReadPositionCommon +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl class SsaVariable = Ssa::Definition; @@ -14,3 +16,41 @@ class BasicBlock = ControlFlow::BasicBlock; BasicBlock getAReadBasicBlock(SsaVariable v) { result = v.getARead().getAControlFlowNode().getBasicBlock() } + +private class PhiInputEdgeBlock extends BasicBlock { + PhiInputEdgeBlock() { this = any(SsaReadPositionPhiInputEdge edge).getOrigBlock() } +} + +private int getId(PhiInputEdgeBlock bb) { + exists(CfgImpl::ControlFlowTree::Range_ t | CfgImpl::ControlFlowTree::idOf(t, result) | + t = bb.getFirstNode().getElement() + or + t = bb.(ControlFlow::BasicBlocks::EntryBlock).getCallable() + ) +} + +private string getSplitString(PhiInputEdgeBlock bb) { + result = bb.getFirstNode().(ControlFlow::Nodes::ElementNode).getSplitsString() + or + not exists(bb.getFirstNode().(ControlFlow::Nodes::ElementNode).getSplitsString()) and + result = "" +} + +/** + * Declarations to be exposed to users of SsaReadPositionCommon. + */ +module Public { + /** + * Holds if `inp` is an input to `phi` along `edge` and this input has index `r` + * in an arbitrary 1-based numbering of the input edges to `phi`. + */ + predicate rankedPhiInput(SsaPhiNode phi, SsaVariable inp, SsaReadPositionPhiInputEdge edge, int r) { + edge.phiInput(phi, inp) and + edge = + rank[r](SsaReadPositionPhiInputEdge e | + e.phiInput(phi, _) + | + e order by getId(e.getOrigBlock()), getSplitString(e.getOrigBlock()) + ) + } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll index 43555af1af9..8cf5a49bc0b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll @@ -64,13 +64,30 @@ abstract class Configuration extends DataFlow::Configuration { override predicate isSource(DataFlow::Node source) { none() } /** - * Holds if `sink` is a relevant taint sink. + * Holds if `source` is a relevant taint source with the given initial + * `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } + + /** + * Holds if `sink` is a relevant taint sink * * The smaller this predicate is, the faster `hasFlow()` will converge. */ // overridden to provide taint-tracking specific qldoc override predicate isSink(DataFlow::Node sink) { none() } + /** + * Holds if `sink` is a relevant taint sink accepting `state`. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } + /** Holds if the node `node` is a taint sanitizer. */ predicate isSanitizer(DataFlow::Node node) { none() } @@ -79,6 +96,16 @@ abstract class Configuration extends DataFlow::Configuration { defaultTaintSanitizer(node) } + /** + * Holds if the node `node` is a taint sanitizer when the flow state is + * `state`. + */ + predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } + + final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { + this.isSanitizer(node, state) + } + /** Holds if taint propagation into `node` is prohibited. */ predicate isSanitizerIn(DataFlow::Node node) { none() } @@ -97,8 +124,17 @@ abstract class Configuration extends DataFlow::Configuration { } /** - * Holds if the additional taint propagation step from `node1` to `node2` - * must be taken into account in the analysis. + * Holds if taint propagation through nodes guarded by `guard` is prohibited + * when the flow state is `state`. + */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard, DataFlow::FlowState state) { + this.isSanitizerGuard(guard, state) + } + + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } @@ -107,7 +143,25 @@ abstract class Configuration extends DataFlow::Configuration { defaultAdditionalTaintStep(node1, node2) } - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + /** + * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. + * This step is only applicable in `state1` and updates the flow state to `state2`. + */ + predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + none() + } + + final override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + this.isAdditionalTaintStep(node1, state1, node2, state2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and defaultImplicitTaintRead(node, c) } diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll index f346a660137..ffb14f1e915 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll @@ -9,7 +9,7 @@ import csharp * A callable that can be overridden or implemented. * * Unlike the class `Overridable`, this class only includes callables that - * can actually be overriden/implemented. + * can actually be overridden/implemented. */ class OverridableCallable extends Callable, Overridable { OverridableCallable() { this.isOverridableOrImplementable() } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll index a4c4ab1b670..42d8e30e25b 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll @@ -5,7 +5,6 @@ */ import Expr -import semmle.code.csharp.Callable import semmle.code.csharp.dataflow.CallContext as CallContext private import semmle.code.csharp.dataflow.internal.DelegateDataFlow private import semmle.code.csharp.dataflow.internal.DataFlowDispatch @@ -176,8 +175,8 @@ class Call extends DotNet::Call, Expr, @call { * - Line 10: The static target is `Type.InvokeMember()`, whereas the run-time targets * are both `A.M()` and `B.M()`. * - * - Line 16: There is no static target (delegate call) but the delegate `i => { }` (line - * 20) is a run-time target. + * - Line 16: There is no static target (delegate call) but the delegate `i => { }` + * (line 20) is a run-time target. */ override Callable getARuntimeTarget() { exists(DispatchCall dc | dc.getCall() = this | result = dc.getADynamicTarget()) @@ -569,7 +568,7 @@ class DelegateLikeCall extends Call, DelegateLikeCall_ { final override Callable getARuntimeTarget() { exists(ExplicitDelegateLikeDataFlowCall call | this = call.getCall() and - result = viableCallableLambda(call, _) + result = viableCallableLambda(call, _).getUnderlyingCallable() ) } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll index c3bf63b1779..b999dfbc0e7 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll @@ -3,7 +3,6 @@ */ import Expr -import semmle.code.csharp.Callable private import semmle.code.csharp.frameworks.system.linq.Expressions private import semmle.code.csharp.TypeRef @@ -435,10 +434,10 @@ class AnonymousFunctionExpr extends Expr, Callable, Modifiable, @anonymous_funct * A lambda expression, for example `(int x) => x + 1`. */ class LambdaExpr extends AnonymousFunctionExpr, @lambda_expr { - /* Holds if this lambda expression has explicit return type. */ + /** Holds if this lambda expression has explicit return type. */ predicate hasExplicitReturnType() { lambda_expr_return_type(this, _) } - /* Gets the explicit return type of this lambda expression, if any. */ + /** Gets the explicit return type of this lambda expression, if any. */ Type getExplicitReturnType() { lambda_expr_return_type(this, getTypeRef(result)) } override string toString() { result = "(...) => ..." } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index 1a869f2458c..e62b95a04cf 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -15,7 +15,6 @@ import Dynamic import Literal import LogicalOperation import semmle.code.csharp.controlflow.ControlFlowElement -import semmle.code.csharp.Callable import semmle.code.csharp.Location import semmle.code.csharp.Stmt import semmle.code.csharp.Type @@ -938,7 +937,7 @@ class ThrowExpr extends Expr, ThrowElement, @throw_expr { * For example, `new ArgumentException("i")` in * `return i != 0 ? 1 / i : throw new ArgumentException("i");`. */ - // overriden for more precise qldoc + // overridden for more precise qldoc override Expr getExpr() { result = ThrowElement.super.getExpr() } override string getAPrimaryQlClass() { result = "ThrowExpr" } @@ -1174,7 +1173,7 @@ class WithExpr extends Expr, @with_expr { /** Gets the expression on which this `with` is called. */ Expr getExpr() { result = this.getChild(0) } - /** Gets the clone method of the `record` that is targetted by this `with` expression. */ + /** Gets the clone method of the `record` that is targeted by this `with` expression. */ RecordCloneMethod getCloneMethod() { result = this.getExpr().getType().(RecordClass).getCloneMethod() } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll index f0ec251db03..e62c6c3ee94 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll @@ -88,7 +88,10 @@ module EntityFramework { } /** A flow summary for EntityFramework. */ - abstract class EFSummarizedCallable extends SummarizedCallable { } + abstract class EFSummarizedCallable extends SummarizedCallable { + bindingset[this] + EFSummarizedCallable() { any() } + } private class DbSetAddOrUpdateRequiredSummaryComponentStack extends RequiredSummaryComponentStack { override predicate required(SummaryComponent head, SummaryComponentStack tail) { @@ -258,6 +261,30 @@ module EntityFramework { } } + /** A sink method in `Microsoft.EntityFrameworkCore.RelationalQueryableExtensions` that executes SQL. */ + private class MicrosoftEntityFrameworkCoreRelationalQueryableExtensionsSinkModelCsv extends SinkModelCsv { + override predicate row(string row) { + row = + [ + "Microsoft.EntityFrameworkCore;RelationalQueryableExtensions;false;FromSqlRaw<>;(Microsoft.EntityFrameworkCore.DbSet,System.String,System.Object[]);;Argument[1];sql", + ] + } + } + + /** A sink method in `Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions` that executes SQL. */ + private class MicrosoftEntityFrameworkCoreRelationalDatabaseFacadeExtensionsSinkModelCsv extends SinkModelCsv { + override predicate row(string row) { + row = + [ + "Microsoft.EntityFrameworkCore;RelationalDatabaseFacadeExtensions;false;ExecuteSqlRaw;(Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade,System.String,System.Collections.Generic.IEnumerable);;Argument[1];sql", + "Microsoft.EntityFrameworkCore;RelationalDatabaseFacadeExtensions;false;ExecuteSqlRaw;(Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade,System.String,System.Object[]);;Argument[1];sql", + "Microsoft.EntityFrameworkCore;RelationalDatabaseFacadeExtensions;false;ExecuteSqlRawAsync;(Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade,System.String,System.Threading.CancellationToken);;Argument[1];sql", + "Microsoft.EntityFrameworkCore;RelationalDatabaseFacadeExtensions;false;ExecuteSqlRawAsync;(Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade,System.String,System.Object[]);;Argument[1];sql", + "Microsoft.EntityFrameworkCore;RelationalDatabaseFacadeExtensions;false;ExecuteSqlRawAsync;(Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade,System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[1];sql", + ] + } + } + /** Holds if `t` is compatible with a DB column type. */ private predicate isColumnType(Type t) { t instanceof SimpleType diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll index 2ffbfe6e7e1..54fa60e03f2 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll @@ -170,40 +170,6 @@ class InvalidFormatString extends StringLiteral { } } -/** Provides a dataflow configuration for format strings. */ -deprecated module FormatFlow { - private import semmle.code.csharp.dataflow.DataFlow - - private class FormatConfiguration extends DataFlow2::Configuration { - FormatConfiguration() { this = "format" } - - override predicate isSource(DataFlow::Node n) { n.asExpr() instanceof StringLiteral } - - override predicate isSink(DataFlow::Node n) { - exists(FormatCall c | n.asExpr() = c.getFormatExpr()) - } - } - - deprecated query predicate nodes = DataFlow2::PathGraph::nodes/3; - - deprecated query predicate edges = DataFlow2::PathGraph::edges/2; - - deprecated class PathNode = DataFlow2::PathNode; - - /** - * Holds if there is flow from string literal `lit` to the format string in - * `call`. `litNode` and `formatNode` are the corresponding data-flow path - * nodes. - */ - deprecated predicate hasFlowPath( - StringLiteral lit, PathNode litNode, FormatCall call, PathNode formatNode - ) { - litNode.getNode().asExpr() = lit and - formatNode.getNode().asExpr() = call.getFormatExpr() and - any(FormatConfiguration conf).hasFlowPath(litNode, formatNode) - } -} - /** * A method call to a method that formats a string, for example a call * to `string.Format()`. @@ -229,14 +195,6 @@ class FormatCall extends MethodCall { this.getArgument(this.getFirstArgument()).getType() instanceof ArrayType } - /** - * DEPRECATED: Use `FormatFlow::hasFlowPath()` instead. - * - * Gets a format string. Global data flow analysis is applied to retrieve all - * sources that can reach this method call. - */ - deprecated StringLiteral getAFormatSource() { FormatFlow::hasFlowPath(result, _, this, _) } - /** * Gets the number of supplied arguments (excluding the format string and format * provider). Does not return a value if the arguments are supplied in an array, @@ -255,11 +213,4 @@ class FormatCall extends MethodCall { index = this.getASuppliedArgument() and result = this.getArgument(this.getFirstArgument() + index) } - - /** Gets a supplied argument that is not used in the format string `src`. */ - deprecated int getAnUnusedArgument(ValidFormatString src) { - result = this.getASuppliedArgument() and - FormatFlow::hasFlowPath(src, _, this, _) and - not result = src.getAnInsert() - } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Generated.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Generated.qll new file mode 100644 index 00000000000..cba985c3161 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Generated.qll @@ -0,0 +1,9 @@ +/** + * A module importing all generated Models as Data models. + */ + +import csharp + +private module GeneratedFrameworks { + private import generated.dotnet.Runtime +} diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll index 4f914899a98..bf4a72b4174 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll @@ -24,13 +24,6 @@ private class ServiceClass extends Class { } } -/** Top-level Request DTO types */ -private class RequestDTO extends Class { - RequestDTO() { - this.getABaseType*().getABaseInterface().hasQualifiedName("ServiceStack", "IReturn") - } -} - /** Flow sources for the ServiceStack framework */ module Sources { private import semmle.code.csharp.security.dataflow.flowsources.Remote diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/generated/dotnet/Runtime.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/generated/dotnet/Runtime.qll new file mode 100644 index 00000000000..8415636ddfb --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/generated/dotnet/Runtime.qll @@ -0,0 +1,10122 @@ +/** + * THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT. + * Definitions of taint steps in the dotnetruntime framework. + */ + +import csharp +private import semmle.code.csharp.dataflow.ExternalFlow + +private class RuntimeSummaryCsv extends SummaryModelCsv { + override predicate row(string row) { + row = + [ + "JsonToItemsTaskFactory;JsonToItemsTaskFactory+CaseInsensitiveDictionaryConverter;false;Read;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory+JsonModelItemConverter;false;Read;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory+JsonToItemsTask;false;SetPropertyValue;(Microsoft.Build.Framework.TaskPropertyInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory+JsonToItemsTask;false;get_BuildEngine;();;Argument[Qualifier];ReturnValue;generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory+JsonToItemsTask;false;set_BuildEngine;(Microsoft.Build.Framework.IBuildEngine);;Argument[0];Argument[Qualifier];generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory;false;GetTaskParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "JsonToItemsTaskFactory;JsonToItemsTaskFactory;false;Initialize;(System.String,System.Collections.Generic.IDictionary,System.String,Microsoft.Build.Framework.IBuildEngine);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;Convert;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Type);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Collections.Generic.IEnumerable,System.Type,System.Collections.Generic.IEnumerable);;Argument[4].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;IsEvent;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint", + "Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint", + "Microsoft.CSharp;CSharpCodeProvider;false;CSharpCodeProvider;(System.Collections.Generic.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.CSharp;CSharpCodeProvider;false;CreateCompiler;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.CSharp;CSharpCodeProvider;false;CreateGenerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.CSharp;CSharpCodeProvider;false;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.CSharp;CSharpCodeProvider;false;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;get_AbsoluteExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;get_AbsoluteExpirationRelativeToNow;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;get_SlidingExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;set_AbsoluteExpiration;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;set_AbsoluteExpirationRelativeToNow;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryOptions;false;set_SlidingExpiration;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;AddExpirationToken;(Microsoft.Extensions.Caching.Memory.ICacheEntry,Microsoft.Extensions.Primitives.IChangeToken);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.DateTimeOffset);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetOptions;(Microsoft.Extensions.Caching.Memory.ICacheEntry,Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetOptions;(Microsoft.Extensions.Caching.Memory.ICacheEntry,Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetOptions;(Microsoft.Extensions.Caching.Memory.ICacheEntry,Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetPriority;(Microsoft.Extensions.Caching.Memory.ICacheEntry,Microsoft.Extensions.Caching.Memory.CacheItemPriority);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetSize;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.Int64);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetValue;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.Object);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetValue;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.Object);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheEntryExtensions;false;SetValue;(Microsoft.Extensions.Caching.Memory.ICacheEntry,System.Object);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheExtensions;false;Set<>;(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.Object,TItem);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheExtensions;false;Set<>;(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.Object,TItem,Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheExtensions;false;Set<>;(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.Object,TItem,Microsoft.Extensions.Primitives.IChangeToken);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheExtensions;false;Set<>;(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.Object,TItem,System.DateTimeOffset);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;CacheExtensions;false;Set<>;(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.Object,TItem,System.TimeSpan);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCache;false;CreateEntry;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCache;false;MemoryCache;(Microsoft.Extensions.Options.IOptions,Microsoft.Extensions.Logging.ILoggerFactory);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;AddExpirationToken;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,Microsoft.Extensions.Primitives.IChangeToken);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.DateTimeOffset);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.DateTimeOffset);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.DateTimeOffset);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetPriority;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,Microsoft.Extensions.Caching.Memory.CacheItemPriority);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetSize;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.Int64);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[1];Argument[0];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryExtensions;false;SetSlidingExpiration;(Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;get_AbsoluteExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;get_AbsoluteExpirationRelativeToNow;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;get_Size;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;get_SlidingExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;set_AbsoluteExpiration;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;set_AbsoluteExpirationRelativeToNow;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;set_Size;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheEntryOptions;false;set_SlidingExpiration;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheOptions;false;get_SizeLimit;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Caching.Memory;MemoryCacheOptions;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Caching.Memory;MemoryCacheOptions;false;set_SizeLimit;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration.EnvironmentVariables;EnvironmentVariablesConfigurationProvider;false;EnvironmentVariablesConfigurationProvider;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration.EnvironmentVariables;EnvironmentVariablesConfigurationProvider;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration.Memory;MemoryConfigurationProvider;false;MemoryConfigurationProvider;(Microsoft.Extensions.Configuration.Memory.MemoryConfigurationSource);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration.Memory;MemoryConfigurationSource;false;Build;(Microsoft.Extensions.Configuration.IConfigurationBuilder);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration.UserSecrets;PathHelper;false;GetSecretsPathFromSecretsId;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration.Xml;XmlDocumentDecryptor;false;CreateDecryptingXmlReader;(System.IO.Stream,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ChainedBuilderExtensions;false;AddConfiguration;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.Configuration.IConfiguration);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ChainedBuilderExtensions;false;AddConfiguration;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.Configuration.IConfiguration,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ChainedConfigurationProvider;false;GetChildKeys;(System.Collections.Generic.IEnumerable,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ChainedConfigurationProvider;false;GetReloadToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ChainedConfigurationProvider;false;TryGet;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;CommandLineConfigurationExtensions;false;AddCommandLine;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String[]);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;CommandLineConfigurationExtensions;false;AddCommandLine;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String[],System.Collections.Generic.IDictionary);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;Get;(Microsoft.Extensions.Configuration.IConfiguration,System.Type);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;Get<>;(Microsoft.Extensions.Configuration.IConfiguration);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue;(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue;(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.String,System.Object);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue;(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.String,System.Object);;Argument[3];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue<>;(Microsoft.Extensions.Configuration.IConfiguration,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue<>;(Microsoft.Extensions.Configuration.IConfiguration,System.String,T);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBinder;false;GetValue<>;(Microsoft.Extensions.Configuration.IConfiguration,System.String,T);;Argument[2];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationBuilder;false;Add;(Microsoft.Extensions.Configuration.IConfigurationSource);;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Configuration;ConfigurationExtensions;false;GetConnectionString;(Microsoft.Extensions.Configuration.IConfiguration,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationExtensions;false;GetRequiredSection;(Microsoft.Extensions.Configuration.IConfiguration,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationExtensions;false;GetRequiredSection;(Microsoft.Extensions.Configuration.IConfiguration,System.String);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;Add;(Microsoft.Extensions.Configuration.IConfigurationSource);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;Add;(Microsoft.Extensions.Configuration.IConfigurationSource);;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;Build;();;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;GetReloadToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;GetSection;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;GetSection;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationManager;false;get_Sources;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationPath;false;Combine;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationPath;false;Combine;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationPath;false;GetParentPath;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationPath;false;GetSectionKey;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationProvider;false;GetReloadToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationProvider;true;GetChildKeys;(System.Collections.Generic.IEnumerable,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;ConfigurationRoot;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;GetReloadToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;GetSection;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;GetSection;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRoot;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationRootExtensions;false;GetDebugView;(Microsoft.Extensions.Configuration.IConfigurationRoot);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;ConfigurationSection;(Microsoft.Extensions.Configuration.IConfigurationRoot,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;ConfigurationSection;(Microsoft.Extensions.Configuration.IConfigurationRoot,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;ConfigurationSection;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;EnvironmentVariablesExtensions;false;AddEnvironmentVariables;(Microsoft.Extensions.Configuration.IConfigurationBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;EnvironmentVariablesExtensions;false;AddEnvironmentVariables;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;FileConfigurationExtensions;false;SetBasePath;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;FileConfigurationExtensions;false;SetFileProvider;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.FileProviders.IFileProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;IniConfigurationExtensions;false;AddIniFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.FileProviders.IFileProvider,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;IniConfigurationExtensions;false;AddIniFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;IniConfigurationExtensions;false;AddIniFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;IniConfigurationExtensions;false;AddIniFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;IniConfigurationExtensions;false;AddIniStream;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;JsonConfigurationExtensions;false;AddJsonFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.FileProviders.IFileProvider,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;JsonConfigurationExtensions;false;AddJsonFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;JsonConfigurationExtensions;false;AddJsonFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;JsonConfigurationExtensions;false;AddJsonFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;JsonConfigurationExtensions;false;AddJsonStream;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;MemoryConfigurationBuilderExtensions;false;AddInMemoryCollection;(Microsoft.Extensions.Configuration.IConfigurationBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;MemoryConfigurationBuilderExtensions;false;AddInMemoryCollection;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Reflection.Assembly);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Reflection.Assembly,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Reflection.Assembly,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets<>;(Microsoft.Extensions.Configuration.IConfigurationBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets<>;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;UserSecretsConfigurationExtensions;false;AddUserSecrets<>;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;XmlConfigurationExtensions;false;AddXmlFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,Microsoft.Extensions.FileProviders.IFileProvider,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;XmlConfigurationExtensions;false;AddXmlFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;XmlConfigurationExtensions;false;AddXmlFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;XmlConfigurationExtensions;false;AddXmlFile;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.String,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Configuration;XmlConfigurationExtensions;false;AddXmlStream;(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Add;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;RemoveAll;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;RemoveAll<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Replace;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Replace;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;Replace;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;TryAdd;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;TryAdd;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;TryAddEnumerable;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor);;Argument[1];Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Extensions;ServiceCollectionDescriptorExtensions;false;TryAddEnumerable;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[0].Element;generated:taint", + "Microsoft.Extensions.DependencyInjection.Specification.Fakes;ClassWithNestedReferencesToProvider;false;ClassWithNestedReferencesToProvider;(System.IServiceProvider);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyInjection.Specification.Fakes;FakeDisposableCallbackService;false;FakeDisposableCallbackService;(Microsoft.Extensions.DependencyInjection.Specification.Fakes.FakeDisposeCallback);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyInjection;ActivatorUtilities;false;GetServiceOrCreateInstance;(System.IServiceProvider,System.Type);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ActivatorUtilities;false;GetServiceOrCreateInstance<>;(System.IServiceProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;AsyncServiceScope;false;AsyncServiceScope;(Microsoft.Extensions.DependencyInjection.IServiceScope);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyInjection;AsyncServiceScope;false;get_ServiceProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;DefaultServiceProviderFactory;false;CreateBuilder;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;DefaultServiceProviderFactory;false;DefaultServiceProviderFactory;(Microsoft.Extensions.DependencyInjection.ServiceProviderOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;AddHttpMessageHandler<>;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;AddTypedClient<,>;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;AddTypedClient<>;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;ConfigurePrimaryHttpMessageHandler<>;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;RedactLoggedHeaders;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientBuilderExtensions;false;SetHandlerLifetime;(Microsoft.Extensions.DependencyInjection.IHttpClientBuilder,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;HttpClientFactoryServiceCollectionExtensions;false;AddHttpClient;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;LoggingServiceCollectionExtensions;false;AddLogging;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;MemoryCacheServiceCollectionExtensions;false;AddDistributedMemoryCache;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;MemoryCacheServiceCollectionExtensions;false;AddMemoryCache;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsBuilderConfigurationExtensions;false;Bind<>;(Microsoft.Extensions.Options.OptionsBuilder,Microsoft.Extensions.Configuration.IConfiguration);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsBuilderDataAnnotationsExtensions;false;ValidateDataAnnotations<>;(Microsoft.Extensions.Options.OptionsBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsBuilderExtensions;false;ValidateOnStart<>;(Microsoft.Extensions.Options.OptionsBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsConfigurationServiceCollectionExtensions;false;Configure<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Configuration.IConfiguration);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsConfigurationServiceCollectionExtensions;false;Configure<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String,Microsoft.Extensions.Configuration.IConfiguration);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsServiceCollectionExtensions;false;AddOptions;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsServiceCollectionExtensions;false;ConfigureOptions;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Object);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsServiceCollectionExtensions;false;ConfigureOptions;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;OptionsServiceCollectionExtensions;false;ConfigureOptions<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionHostedServiceExtensions;false;AddHostedService<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddScoped;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddScoped;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddScoped<,>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddScoped<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type,System.Object);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton<,>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddSingleton<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection,TService);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddTransient;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddTransient;(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddTransient<,>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceCollectionServiceExtensions;false;AddTransient<>;(Microsoft.Extensions.DependencyInjection.IServiceCollection);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceProviderServiceExtensions;false;GetRequiredService;(System.IServiceProvider,System.Type);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceProviderServiceExtensions;false;GetRequiredService<>;(System.IServiceProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceProviderServiceExtensions;false;GetService<>;(System.IServiceProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceProviderServiceExtensions;false;GetServices;(System.IServiceProvider,System.Type);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyInjection;ServiceProviderServiceExtensions;false;GetServices<>;(System.IServiceProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyModel.Resolution;AppBaseCompilationAssemblyResolver;false;TryResolveAssemblyPaths;(Microsoft.Extensions.DependencyModel.CompilationLibrary,System.Collections.Generic.List);;Argument[Qualifier];Argument[1].Element;generated:taint", + "Microsoft.Extensions.DependencyModel.Resolution;CompositeCompilationAssemblyResolver;false;CompositeCompilationAssemblyResolver;(Microsoft.Extensions.DependencyModel.Resolution.ICompilationAssemblyResolver[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyModel.Resolution;CompositeCompilationAssemblyResolver;false;TryResolveAssemblyPaths;(Microsoft.Extensions.DependencyModel.CompilationLibrary,System.Collections.Generic.List);;Argument[Qualifier];Argument[1].Element;generated:taint", + "Microsoft.Extensions.DependencyModel.Resolution;PackageCompilationAssemblyResolver;false;TryResolveAssemblyPaths;(Microsoft.Extensions.DependencyModel.CompilationLibrary,System.Collections.Generic.List);;Argument[Qualifier];Argument[1].Element;generated:taint", + "Microsoft.Extensions.DependencyModel.Resolution;ReferenceAssemblyPathResolver;false;TryResolveAssemblyPaths;(Microsoft.Extensions.DependencyModel.CompilationLibrary,System.Collections.Generic.List);;Argument[Qualifier];Argument[1].Element;generated:taint", + "Microsoft.Extensions.DependencyModel;CompilationLibrary;false;ResolveReferencePaths;(Microsoft.Extensions.DependencyModel.Resolution.ICompilationAssemblyResolver[]);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssembly;false;Create;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssembly;false;RuntimeAssembly;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssetGroup;false;RuntimeAssetGroup;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssetGroup;false;RuntimeAssetGroup;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssetGroup;false;get_AssetPaths;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.DependencyModel;RuntimeAssetGroup;false;get_RuntimeFiles;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileProviders.Composite;CompositeDirectoryContents;false;CompositeDirectoryContents;(System.Collections.Generic.IList,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Composite;CompositeDirectoryContents;false;CompositeDirectoryContents;(System.Collections.Generic.IList,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Internal;PhysicalDirectoryContents;false;PhysicalDirectoryContents;(System.String,Microsoft.Extensions.FileProviders.Physical.ExclusionFilters);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PhysicalDirectoryInfo;false;PhysicalDirectoryInfo;(System.IO.DirectoryInfo);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PhysicalFileInfo;false;PhysicalFileInfo;(System.IO.FileInfo);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PhysicalFileInfo;false;get_PhysicalPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PhysicalFilesWatcher;false;PhysicalFilesWatcher;(System.String,System.IO.FileSystemWatcher,System.Boolean,Microsoft.Extensions.FileProviders.Physical.ExclusionFilters);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PhysicalFilesWatcher;false;PhysicalFilesWatcher;(System.String,System.IO.FileSystemWatcher,System.Boolean,Microsoft.Extensions.FileProviders.Physical.ExclusionFilters);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders.Physical;PollingFileChangeToken;false;PollingFileChangeToken;(System.IO.FileInfo);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders;CompositeFileProvider;false;CompositeFileProvider;(Microsoft.Extensions.FileProviders.IFileProvider[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders;CompositeFileProvider;false;CompositeFileProvider;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileProviders;CompositeFileProvider;false;GetDirectoryContents;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.FileProviders;CompositeFileProvider;false;GetDirectoryContents;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileProviders;CompositeFileProvider;false;get_FileProviders;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileProviders;PhysicalFileProvider;false;GetDirectoryContents;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Abstractions;DirectoryInfoWrapper;false;GetDirectory;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Abstractions;FileInfoWrapper;false;FileInfoWrapper;(System.IO.FileInfo);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Abstractions;FileInfoWrapper;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal.PatternContexts;PatternContext<>;false;PushDataFrame;(TFrame);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal.PatternContexts;PatternContextLinear+FrameData;false;get_Stem;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal.PatternContexts;PatternContextLinear;false;CalculateStem;(Microsoft.Extensions.FileSystemGlobbing.Abstractions.FileInfoBase);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal.PatternContexts;PatternContextRagged+FrameData;false;get_Stem;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal.PatternContexts;PatternContextRagged;false;CalculateStem;(Microsoft.Extensions.FileSystemGlobbing.Abstractions.FileInfoBase);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing.Internal;MatcherContext;false;MatcherContext;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,Microsoft.Extensions.FileSystemGlobbing.Abstractions.DirectoryInfoBase,System.StringComparison);;Argument[2];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.FileSystemGlobbing;InMemoryDirectoryInfo;false;EnumerateFileSystemInfos;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing;InMemoryDirectoryInfo;false;GetDirectory;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing;InMemoryDirectoryInfo;false;GetFile;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing;InMemoryDirectoryInfo;false;get_ParentDirectory;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.FileSystemGlobbing;Matcher;false;AddExclude;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.FileSystemGlobbing;Matcher;false;AddInclude;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Hosting.Internal;ApplicationLifetime;false;ApplicationLifetime;(Microsoft.Extensions.Logging.ILogger);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Hosting.Internal;ApplicationLifetime;false;get_ApplicationStarted;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting.Internal;ApplicationLifetime;false;get_ApplicationStopped;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting.Internal;ApplicationLifetime;false;get_ApplicationStopping;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting.Systemd;ServiceState;false;ServiceState;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Hosting.Systemd;ServiceState;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting.WindowsServices;WindowsServiceLifetime;false;WaitForStartAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;BackgroundService;true;StartAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;BackgroundService;true;get_ExecuteTask;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;HostBuilder;false;UseServiceProviderFactory<>;(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Hosting;HostBuilder;false;UseServiceProviderFactory<>;(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory);;Argument[Qualifier];ReturnValue;generated:value", + "Microsoft.Extensions.Hosting;HostingHostBuilderExtensions;false;ConfigureDefaults;(Microsoft.Extensions.Hosting.IHostBuilder,System.String[]);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;HostingHostBuilderExtensions;false;UseConsoleLifetime;(Microsoft.Extensions.Hosting.IHostBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;HostingHostBuilderExtensions;false;UseContentRoot;(Microsoft.Extensions.Hosting.IHostBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;HostingHostBuilderExtensions;false;UseEnvironment;(Microsoft.Extensions.Hosting.IHostBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;SystemdHostBuilderExtensions;false;UseSystemd;(Microsoft.Extensions.Hosting.IHostBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Hosting;WindowsServiceLifetimeHostBuilderExtensions;false;UseWindowsService;(Microsoft.Extensions.Hosting.IHostBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingHttpMessageHandler;false;LoggingHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingHttpMessageHandler;false;LoggingHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger,Microsoft.Extensions.Http.HttpClientFactoryOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingHttpMessageHandler;false;LoggingHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger,Microsoft.Extensions.Http.HttpClientFactoryOptions);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingScopeHttpMessageHandler;false;LoggingScopeHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingScopeHttpMessageHandler;false;LoggingScopeHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger,Microsoft.Extensions.Http.HttpClientFactoryOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http.Logging;LoggingScopeHttpMessageHandler;false;LoggingScopeHttpMessageHandler;(Microsoft.Extensions.Logging.ILogger,Microsoft.Extensions.Http.HttpClientFactoryOptions);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http;HttpClientFactoryOptions;false;get_HandlerLifetime;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Http;HttpClientFactoryOptions;false;set_HandlerLifetime;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Http;HttpMessageHandlerBuilder;false;CreateHandlerPipeline;(System.Net.Http.HttpMessageHandler,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Http;HttpMessageHandlerBuilder;false;CreateHandlerPipeline;(System.Net.Http.HttpMessageHandler,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.Console;ConsoleLoggerProvider;false;ConsoleLoggerProvider;(Microsoft.Extensions.Options.IOptionsMonitor,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.Console;ConsoleLoggerProvider;false;CreateLogger;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.Console;ConsoleLoggerProvider;false;CreateLogger;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.Console;ConsoleLoggerProvider;false;SetScopeProvider;(Microsoft.Extensions.Logging.IExternalScopeProvider);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.Debug;DebugLoggerProvider;false;CreateLogger;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.EventLog;EventLogLoggerProvider;false;CreateLogger;(System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.EventLog;EventLogLoggerProvider;false;CreateLogger;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.EventLog;EventLogLoggerProvider;false;EventLogLoggerProvider;(Microsoft.Extensions.Logging.EventLog.EventLogSettings);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.EventLog;EventLogLoggerProvider;false;SetScopeProvider;(Microsoft.Extensions.Logging.IExternalScopeProvider);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.EventSource;EventSourceLoggerProvider;false;CreateLogger;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging.EventSource;EventSourceLoggerProvider;false;EventSourceLoggerProvider;(Microsoft.Extensions.Logging.EventSource.LoggingEventSource);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.TraceSource;TraceSourceLoggerProvider;false;TraceSourceLoggerProvider;(System.Diagnostics.SourceSwitch,System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging.TraceSource;TraceSourceLoggerProvider;false;TraceSourceLoggerProvider;(System.Diagnostics.SourceSwitch,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Logging;ConsoleLoggerExtensions;false;AddConsole;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;ConsoleLoggerExtensions;false;AddConsoleFormatter<,>;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;ConsoleLoggerExtensions;false;AddJsonConsole;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;ConsoleLoggerExtensions;false;AddSimpleConsole;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;ConsoleLoggerExtensions;false;AddSystemdConsole;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;DebugLoggerFactoryExtensions;false;AddDebug;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;EventLoggerFactoryExtensions;false;AddEventLog;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;EventLoggerFactoryExtensions;false;AddEventLog;(Microsoft.Extensions.Logging.ILoggingBuilder,Microsoft.Extensions.Logging.EventLog.EventLogSettings);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;EventSourceLoggerFactoryExtensions;false;AddEventSourceLogger;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;FilterLoggingBuilderExtensions;false;AddFilter;(Microsoft.Extensions.Logging.ILoggingBuilder,System.String,Microsoft.Extensions.Logging.LogLevel);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;FilterLoggingBuilderExtensions;false;AddFilter;(Microsoft.Extensions.Logging.LoggerFilterOptions,System.String,Microsoft.Extensions.Logging.LogLevel);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;FilterLoggingBuilderExtensions;false;AddFilter<>;(Microsoft.Extensions.Logging.ILoggingBuilder,System.String,Microsoft.Extensions.Logging.LogLevel);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;FilterLoggingBuilderExtensions;false;AddFilter<>;(Microsoft.Extensions.Logging.LoggerFilterOptions,System.String,Microsoft.Extensions.Logging.LogLevel);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;Logger<>;false;BeginScope<>;(TState);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggerExtensions;false;BeginScope;(Microsoft.Extensions.Logging.ILogger,System.String,System.Object[]);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggerExternalScopeProvider;false;Push;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggingBuilderExtensions;false;AddConfiguration;(Microsoft.Extensions.Logging.ILoggingBuilder,Microsoft.Extensions.Configuration.IConfiguration);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggingBuilderExtensions;false;AddProvider;(Microsoft.Extensions.Logging.ILoggingBuilder,Microsoft.Extensions.Logging.ILoggerProvider);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggingBuilderExtensions;false;ClearProviders;(Microsoft.Extensions.Logging.ILoggingBuilder);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;LoggingBuilderExtensions;false;SetMinimumLevel;(Microsoft.Extensions.Logging.ILoggingBuilder,Microsoft.Extensions.Logging.LogLevel);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;TraceSourceFactoryExtensions;false;AddTraceSource;(Microsoft.Extensions.Logging.ILoggingBuilder,System.Diagnostics.SourceSwitch);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;TraceSourceFactoryExtensions;false;AddTraceSource;(Microsoft.Extensions.Logging.ILoggingBuilder,System.Diagnostics.SourceSwitch,System.Diagnostics.TraceListener);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;TraceSourceFactoryExtensions;false;AddTraceSource;(Microsoft.Extensions.Logging.ILoggingBuilder,System.String);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Logging;TraceSourceFactoryExtensions;false;AddTraceSource;(Microsoft.Extensions.Logging.ILoggingBuilder,System.String,System.Diagnostics.TraceListener);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Options;ConfigurationChangeTokenSource<>;false;ConfigurationChangeTokenSource;(System.String,Microsoft.Extensions.Configuration.IConfiguration);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;ConfigurationChangeTokenSource<>;false;GetChangeToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Options;OptionsFactory<>;false;OptionsFactory;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;OptionsFactory<>;false;OptionsFactory;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>);;Argument[1].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;OptionsFactory<>;false;OptionsFactory;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable>);;Argument[2].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;OptionsManager<>;false;OptionsManager;(Microsoft.Extensions.Options.IOptionsFactory);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;OptionsMonitor<>;false;OptionsMonitor;(Microsoft.Extensions.Options.IOptionsFactory,System.Collections.Generic.IEnumerable>,Microsoft.Extensions.Options.IOptionsMonitorCache);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Options;OptionsMonitor<>;false;OptionsMonitor;(Microsoft.Extensions.Options.IOptionsFactory,System.Collections.Generic.IEnumerable>,Microsoft.Extensions.Options.IOptionsMonitorCache);;Argument[2];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Primitives;Extensions;false;Append;(System.Text.StringBuilder,Microsoft.Extensions.Primitives.StringSegment);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Primitives;StringTokenizer+Enumerator;false;Enumerator;(Microsoft.Extensions.Primitives.StringTokenizer);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(System.String,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "Microsoft.Extensions.Primitives;StringValues+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;AnsiStringMarshaller;false;AnsiStringMarshaller;(Microsoft.Interop.Utf8StringMarshaller);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ArrayMarshaller;false;ArrayMarshaller;(Microsoft.Interop.IMarshallingGenerator,Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax,System.Boolean,Microsoft.Interop.InteropGenerationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ArrayMarshaller;false;ArrayMarshaller;(Microsoft.Interop.IMarshallingGenerator,Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax,System.Boolean,Microsoft.Interop.InteropGenerationOptions);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ArrayMarshaller;false;ArrayMarshaller;(Microsoft.Interop.IMarshallingGenerator,Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax,System.Boolean,Microsoft.Interop.InteropGenerationOptions);;Argument[3];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ArrayMarshaller;false;AsNativeType;(Microsoft.Interop.TypePositionInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;AttributedMarshallingModelGeneratorFactory;false;AttributedMarshallingModelGeneratorFactory;(Microsoft.Interop.IMarshallingGeneratorFactory,Microsoft.Interop.IMarshallingGeneratorFactory,Microsoft.Interop.InteropGenerationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;AttributedMarshallingModelGeneratorFactory;false;AttributedMarshallingModelGeneratorFactory;(Microsoft.Interop.IMarshallingGeneratorFactory,Microsoft.Interop.IMarshallingGeneratorFactory,Microsoft.Interop.InteropGenerationOptions);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Interop;AttributedMarshallingModelGeneratorFactory;false;AttributedMarshallingModelGeneratorFactory;(Microsoft.Interop.IMarshallingGeneratorFactory,Microsoft.Interop.InteropGenerationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;BoolMarshallerBase;false;AsNativeType;(Microsoft.Interop.TypePositionInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;BoolMarshallerBase;false;BoolMarshallerBase;(Microsoft.CodeAnalysis.CSharp.Syntax.PredefinedTypeSyntax,System.Int32,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ByValueContentsMarshalKindValidator;false;ByValueContentsMarshalKindValidator;(Microsoft.Interop.IMarshallingGeneratorFactory);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;ConditionalStackallocMarshallingGenerator;false;GetAllocationMarkerIdentifier;(Microsoft.Interop.TypePositionInfo,Microsoft.Interop.StubCodeContext);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Interop;DllImportGenerator+IncrementalityTracker;false;get_ExecutedSteps;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;GeneratorDiagnostics;false;get_Diagnostics;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;MarshallerHelpers;false;GetCompatibleGenericTypeParameterSyntax;(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax);;Argument[0];ReturnValue;generated:taint", + "Microsoft.Interop;MarshallerHelpers;false;GetMarshallerIdentifier;(Microsoft.Interop.TypePositionInfo,Microsoft.Interop.StubCodeContext);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Interop;MarshallerHelpers;false;GetNativeSpanIdentifier;(Microsoft.Interop.TypePositionInfo,Microsoft.Interop.StubCodeContext);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Interop;MarshallingAttributeInfoParser;false;MarshallingAttributeInfoParser;(Microsoft.CodeAnalysis.Compilation,Microsoft.Interop.IGeneratorDiagnostics,Microsoft.Interop.DefaultMarshallingInfo,Microsoft.CodeAnalysis.ISymbol);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;MarshallingAttributeInfoParser;false;MarshallingAttributeInfoParser;(Microsoft.CodeAnalysis.Compilation,Microsoft.Interop.IGeneratorDiagnostics,Microsoft.Interop.DefaultMarshallingInfo,Microsoft.CodeAnalysis.ISymbol);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Interop;MarshallingAttributeInfoParser;false;MarshallingAttributeInfoParser;(Microsoft.CodeAnalysis.Compilation,Microsoft.Interop.IGeneratorDiagnostics,Microsoft.Interop.DefaultMarshallingInfo,Microsoft.CodeAnalysis.ISymbol);;Argument[2];Argument[Qualifier];generated:taint", + "Microsoft.Interop;MarshallingAttributeInfoParser;false;MarshallingAttributeInfoParser;(Microsoft.CodeAnalysis.Compilation,Microsoft.Interop.IGeneratorDiagnostics,Microsoft.Interop.DefaultMarshallingInfo,Microsoft.CodeAnalysis.ISymbol);;Argument[3];Argument[Qualifier];generated:taint", + "Microsoft.Interop;PinnableManagedValueMarshaller;false;AsNativeType;(Microsoft.Interop.TypePositionInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Interop;PinnableManagedValueMarshaller;false;PinnableManagedValueMarshaller;(Microsoft.Interop.IMarshallingGenerator);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;PlatformDefinedStringMarshaller;false;PlatformDefinedStringMarshaller;(Microsoft.Interop.IMarshallingGenerator,Microsoft.Interop.IMarshallingGenerator);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Interop;PlatformDefinedStringMarshaller;false;PlatformDefinedStringMarshaller;(Microsoft.Interop.IMarshallingGenerator,Microsoft.Interop.IMarshallingGenerator);;Argument[1];Argument[Qualifier];generated:taint", + "Microsoft.Interop;StubCodeContext;true;GetAdditionalIdentifier;(Microsoft.Interop.TypePositionInfo,System.String);;Argument[1];ReturnValue;generated:taint", + "Microsoft.Interop;StubCodeContext;true;GetAdditionalIdentifier;(Microsoft.Interop.TypePositionInfo,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.NET.Build.Tasks;RunReadyToRunCompiler;false;GenerateResponseFileCommands;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.NETCore.Platforms.BuildTasks;Extensions;false;NullAsEmpty<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "Microsoft.NETCore.Platforms.BuildTasks;RuntimeGroupCollection;false;RuntimeGroupCollection;(System.Collections.Generic.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.NETCore.Platforms.BuildTasks;RuntimeVersion;false;RuntimeVersion;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.NETCore.Platforms.BuildTasks;RuntimeVersion;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.VisualBasic;VBCodeProvider;false;CreateCompiler;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.VisualBasic;VBCodeProvider;false;CreateGenerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.VisualBasic;VBCodeProvider;false;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.VisualBasic;VBCodeProvider;false;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "Microsoft.VisualBasic;VBCodeProvider;false;VBCodeProvider;(System.Collections.Generic.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint", + "Microsoft.Win32.SafeHandles;SafeFileHandle;false;SafeFileHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Win32.SafeHandles;SafePipeHandle;false;SafePipeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Win32.SafeHandles;SafeProcessHandle;false;SafeProcessHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Win32.SafeHandles;SafeRegistryHandle;false;SafeRegistryHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Win32.SafeHandles;SafeWaitHandle;false;SafeWaitHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "Microsoft.Win32;RegistryKey;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Win32;RegistryKey;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "Microsoft.Win32;RegistryKey;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ArrayBufferWriter<>;false;GetMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ArrayBufferWriter<>;false;get_WrittenMemory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;BuffersExtensions;false;PositionOf<>;(System.Buffers.ReadOnlySequence,T);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[1];Argument[Qualifier];generated:taint", + "System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[2];Argument[Qualifier];generated:taint", + "System.Buffers;MemoryHandle;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;MemoryManager<>;true;get_Memory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>+Enumerator;false;Enumerator;(System.Buffers.ReadOnlySequence<>);;Argument[0];Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[2];Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[1];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64);;Argument[Qualifier];ReturnValue;generated:value", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[1];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;TryGet;(System.SequencePosition,System.ReadOnlyMemory,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;ReadOnlySequence<>;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;SequenceReader;(System.Buffers.ReadOnlySequence);;Argument[0];Argument[Qualifier];generated:taint", + "System.Buffers;SequenceReader<>;false;TryReadExact;(System.Int32,System.Buffers.ReadOnlySequence);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;TryReadToAny;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Buffers;SequenceReader<>;false;get_UnreadSequence;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeCompiler;false;JoinStringArray;(System.String[],System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeCompiler;false;JoinStringArray;(System.String[],System.String);;Argument[1];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeCompiler;true;GetResponseFileCmdArgs;(System.CodeDom.Compiler.CompilerParameters,System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;CreateEscapedIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;CreateGenerator;(System.IO.TextWriter);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;CreateGenerator;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;CreateValidIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromCompileUnit;(System.CodeDom.CodeCompileUnit,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromExpression;(System.CodeDom.CodeExpression,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromNamespace;(System.CodeDom.CodeNamespace,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromNamespace;(System.CodeDom.CodeNamespace,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromStatement;(System.CodeDom.CodeStatement,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromType;(System.CodeDom.CodeTypeDeclaration,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GenerateCodeFromType;(System.CodeDom.CodeTypeDeclaration,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeDomProvider;true;GetTypeOutput;(System.CodeDom.CodeTypeReference);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;CreateEscapedIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;CreateValidIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromCompileUnit;(System.CodeDom.CodeCompileUnit,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromExpression;(System.CodeDom.CodeExpression,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromNamespace;(System.CodeDom.CodeNamespace,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromNamespace;(System.CodeDom.CodeNamespace,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromStatement;(System.CodeDom.CodeStatement,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromType;(System.CodeDom.CodeTypeDeclaration,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateCodeFromType;(System.CodeDom.CodeTypeDeclaration,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GenerateTypes;(System.CodeDom.CodeNamespace);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;GetTypeOutput;(System.CodeDom.CodeTypeReference);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_CurrentClass;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_CurrentMember;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_CurrentMemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_CurrentTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;false;get_Output;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGenerator;true;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;true;GenerateCodeFromMember;(System.CodeDom.CodeTypeMember,System.IO.TextWriter,System.CodeDom.Compiler.CodeGeneratorOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGenerator;true;GenerateNamespace;(System.CodeDom.CodeNamespace);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CodeGeneratorOptions;false;get_BracingStyle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGeneratorOptions;false;get_IndentString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CodeGeneratorOptions;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;Add;(System.CodeDom.Compiler.CompilerError);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;AddRange;(System.CodeDom.Compiler.CompilerErrorCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;AddRange;(System.CodeDom.Compiler.CompilerError[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;CompilerErrorCollection;(System.CodeDom.Compiler.CompilerErrorCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;CompilerErrorCollection;(System.CodeDom.Compiler.CompilerError[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;CopyTo;(System.CodeDom.Compiler.CompilerError[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;Insert;(System.Int32,System.CodeDom.Compiler.CompilerError);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;Remove;(System.CodeDom.Compiler.CompilerError);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CompilerErrorCollection;false;set_Item;(System.Int32,System.CodeDom.Compiler.CompilerError);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerInfo;false;get_CodeDomProviderType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CompilerParameters;false;get_TempFiles;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CompilerParameters;false;set_TempFiles;(System.CodeDom.Compiler.TempFileCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;CompilerResults;false;get_CompiledAssembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;CompilerResults;false;set_CompiledAssembly;(System.Reflection.Assembly);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.IntPtr,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[2].Element;ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.IntPtr,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.IntPtr,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[4];ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.IntPtr,System.String,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[3].Element;ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[1].Element;ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[2].Element;ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.CodeDom.Compiler;Executor;false;ExecWaitWithCapture;(System.String,System.String,System.CodeDom.Compiler.TempFileCollection,System.String,System.String);;Argument[4];ReturnValue;generated:taint", + "System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Tool;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;WriteLineNoTabsAsync;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;WriteLineNoTabsAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;get_InnerWriter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;IndentedTextWriter;false;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;AddExtension;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;AddExtension;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;AddExtension;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;AddExtension;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;TempFileCollection;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;get_BasePath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom.Compiler;TempFileCollection;false;get_TempDir;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeArgumentReferenceExpression;false;CodeArgumentReferenceExpression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArgumentReferenceExpression;false;get_ParameterName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeArgumentReferenceExpression;false;set_ParameterName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.CodeDom.CodeTypeReference,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.String,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.String,System.CodeDom.CodeExpression[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.Type,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.Type,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.Type,System.CodeDom.CodeExpression[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;CodeArrayCreateExpression;(System.Type,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;get_CreateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;get_Initializers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeArrayCreateExpression;false;set_CreateType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayIndexerExpression;false;CodeArrayIndexerExpression;(System.CodeDom.CodeExpression,System.CodeDom.CodeExpression[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeArrayIndexerExpression;false;get_Indices;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttachEventStatement;false;CodeAttachEventStatement;(System.CodeDom.CodeEventReferenceExpression,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttachEventStatement;false;get_Event;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttachEventStatement;false;set_Event;(System.CodeDom.CodeEventReferenceExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgument;false;CodeAttributeArgument;(System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgument;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeArgument;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;Add;(System.CodeDom.CodeAttributeArgument);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;AddRange;(System.CodeDom.CodeAttributeArgumentCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;AddRange;(System.CodeDom.CodeAttributeArgument[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;CodeAttributeArgumentCollection;(System.CodeDom.CodeAttributeArgumentCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;CodeAttributeArgumentCollection;(System.CodeDom.CodeAttributeArgument[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;CopyTo;(System.CodeDom.CodeAttributeArgument[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;Insert;(System.Int32,System.CodeDom.CodeAttributeArgument);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;Remove;(System.CodeDom.CodeAttributeArgument);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeArgumentCollection;false;set_Item;(System.Int32,System.CodeDom.CodeAttributeArgument);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;CodeAttributeDeclaration;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeAttributeArgument[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;CodeAttributeDeclaration;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeAttributeArgument[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;CodeAttributeDeclaration;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;CodeAttributeDeclaration;(System.String,System.CodeDom.CodeAttributeArgument[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;CodeAttributeDeclaration;(System.String,System.CodeDom.CodeAttributeArgument[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeDeclaration;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;Add;(System.CodeDom.CodeAttributeDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;AddRange;(System.CodeDom.CodeAttributeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;AddRange;(System.CodeDom.CodeAttributeDeclaration[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;CodeAttributeDeclarationCollection;(System.CodeDom.CodeAttributeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;CodeAttributeDeclarationCollection;(System.CodeDom.CodeAttributeDeclaration[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;CopyTo;(System.CodeDom.CodeAttributeDeclaration[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;Insert;(System.Int32,System.CodeDom.CodeAttributeDeclaration);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;Remove;(System.CodeDom.CodeAttributeDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeAttributeDeclarationCollection;false;set_Item;(System.Int32,System.CodeDom.CodeAttributeDeclaration);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCastExpression;false;CodeCastExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCastExpression;false;CodeCastExpression;(System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCastExpression;false;CodeCastExpression;(System.Type,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCastExpression;false;get_TargetType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCastExpression;false;set_TargetType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String,System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String,System.CodeDom.CodeTypeReference);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String,System.CodeDom.CodeTypeReference,System.CodeDom.CodeStatement[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String,System.CodeDom.CodeTypeReference,System.CodeDom.CodeStatement[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;CodeCatchClause;(System.String,System.CodeDom.CodeTypeReference,System.CodeDom.CodeStatement[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;get_CatchExceptionType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCatchClause;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCatchClause;false;get_Statements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCatchClause;false;set_CatchExceptionType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClause;false;set_LocalName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;Add;(System.CodeDom.CodeCatchClause);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;AddRange;(System.CodeDom.CodeCatchClauseCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;AddRange;(System.CodeDom.CodeCatchClause[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;CodeCatchClauseCollection;(System.CodeDom.CodeCatchClauseCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;CodeCatchClauseCollection;(System.CodeDom.CodeCatchClause[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;CopyTo;(System.CodeDom.CodeCatchClause[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;Insert;(System.Int32,System.CodeDom.CodeCatchClause);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;Remove;(System.CodeDom.CodeCatchClause);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCatchClauseCollection;false;set_Item;(System.Int32,System.CodeDom.CodeCatchClause);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeChecksumPragma;false;CodeChecksumPragma;(System.String,System.Guid,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeChecksumPragma;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeChecksumPragma;false;set_FileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeComment;false;CodeComment;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeComment;false;CodeComment;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeComment;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeComment;false;set_Text;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;Add;(System.CodeDom.CodeCommentStatement);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;AddRange;(System.CodeDom.CodeCommentStatementCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;AddRange;(System.CodeDom.CodeCommentStatement[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;CodeCommentStatementCollection;(System.CodeDom.CodeCommentStatementCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;CodeCommentStatementCollection;(System.CodeDom.CodeCommentStatement[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;CopyTo;(System.CodeDom.CodeCommentStatement[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;Insert;(System.Int32,System.CodeDom.CodeCommentStatement);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;Remove;(System.CodeDom.CodeCommentStatement);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCommentStatementCollection;false;set_Item;(System.Int32,System.CodeDom.CodeCommentStatement);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeCompileUnit;false;get_AssemblyCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCompileUnit;false;get_EndDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCompileUnit;false;get_ReferencedAssemblies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeCompileUnit;false;get_StartDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeDefaultValueExpression;false;CodeDefaultValueExpression;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDefaultValueExpression;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeDefaultValueExpression;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;CodeDelegateCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;CodeDelegateCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;get_DelegateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;get_MethodName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;set_DelegateType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDelegateCreateExpression;false;set_MethodName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;Add;(System.CodeDom.CodeDirective);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;AddRange;(System.CodeDom.CodeDirectiveCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;AddRange;(System.CodeDom.CodeDirective[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;CodeDirectiveCollection;(System.CodeDom.CodeDirectiveCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;CodeDirectiveCollection;(System.CodeDom.CodeDirective[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;CopyTo;(System.CodeDom.CodeDirective[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;Insert;(System.Int32,System.CodeDom.CodeDirective);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;Remove;(System.CodeDom.CodeDirective);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeDirectiveCollection;false;set_Item;(System.Int32,System.CodeDom.CodeDirective);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeEventReferenceExpression;false;CodeEventReferenceExpression;(System.CodeDom.CodeExpression,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeEventReferenceExpression;false;get_EventName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeEventReferenceExpression;false;set_EventName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;Add;(System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;AddRange;(System.CodeDom.CodeExpressionCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;AddRange;(System.CodeDom.CodeExpression[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;CodeExpressionCollection;(System.CodeDom.CodeExpressionCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;CodeExpressionCollection;(System.CodeDom.CodeExpression[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;CopyTo;(System.CodeDom.CodeExpression[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeExpressionCollection;false;Insert;(System.Int32,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;Remove;(System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeExpressionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeExpressionCollection;false;set_Item;(System.Int32,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeFieldReferenceExpression;false;CodeFieldReferenceExpression;(System.CodeDom.CodeExpression,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeFieldReferenceExpression;false;get_FieldName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeFieldReferenceExpression;false;set_FieldName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeGotoStatement;false;CodeGotoStatement;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeGotoStatement;false;get_Label;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeGotoStatement;false;set_Label;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeIndexerExpression;false;CodeIndexerExpression;(System.CodeDom.CodeExpression,System.CodeDom.CodeExpression[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeIndexerExpression;false;get_Indices;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeLabeledStatement;false;CodeLabeledStatement;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeLabeledStatement;false;CodeLabeledStatement;(System.String,System.CodeDom.CodeStatement);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeLabeledStatement;false;get_Label;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeLabeledStatement;false;set_Label;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeLinePragma;false;CodeLinePragma;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeLinePragma;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeLinePragma;false;set_FileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberEvent;false;get_ImplementationTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberEvent;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberEvent;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.CodeDom.CodeTypeReference,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.CodeDom.CodeTypeReference,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;CodeMemberField;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberField;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberField;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_ImplementationTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_ReturnTypeCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_Statements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;get_TypeParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberMethod;false;set_ReturnType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMemberProperty;false;get_ImplementationTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberProperty;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMemberProperty;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodInvokeExpression;false;CodeMethodInvokeExpression;(System.CodeDom.CodeExpression,System.String,System.CodeDom.CodeExpression[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodInvokeExpression;false;CodeMethodInvokeExpression;(System.CodeDom.CodeMethodReferenceExpression,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodInvokeExpression;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMethodInvokeExpression;false;set_Method;(System.CodeDom.CodeMethodReferenceExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;CodeMethodReferenceExpression;(System.CodeDom.CodeExpression,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;CodeMethodReferenceExpression;(System.CodeDom.CodeExpression,System.String,System.CodeDom.CodeTypeReference[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;CodeMethodReferenceExpression;(System.CodeDom.CodeExpression,System.String,System.CodeDom.CodeTypeReference[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;get_MethodName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;get_TypeArguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeMethodReferenceExpression;false;set_MethodName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespace;false;CodeNamespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespace;false;get_Comments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespace;false;get_Imports;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespace;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespace;false;get_Types;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespace;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;Add;(System.CodeDom.CodeNamespace);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;AddRange;(System.CodeDom.CodeNamespaceCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;AddRange;(System.CodeDom.CodeNamespace[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;CodeNamespaceCollection;(System.CodeDom.CodeNamespaceCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;CodeNamespaceCollection;(System.CodeDom.CodeNamespace[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;CopyTo;(System.CodeDom.CodeNamespace[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;Insert;(System.Int32,System.CodeDom.CodeNamespace);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;Remove;(System.CodeDom.CodeNamespace);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespaceCollection;false;set_Item;(System.Int32,System.CodeDom.CodeNamespace);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceImport;false;CodeNamespaceImport;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceImport;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespaceImport;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceImportCollection;false;Add;(System.CodeDom.CodeNamespaceImport);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceImportCollection;false;AddRange;(System.CodeDom.CodeNamespaceImport[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeNamespaceImportCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespaceImportCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeNamespaceImportCollection;false;set_Item;(System.Int32,System.CodeDom.CodeNamespaceImport);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeObject;false;get_UserData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeObjectCreateExpression;false;CodeObjectCreateExpression;(System.CodeDom.CodeTypeReference,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeObjectCreateExpression;false;CodeObjectCreateExpression;(System.String,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeObjectCreateExpression;false;CodeObjectCreateExpression;(System.Type,System.CodeDom.CodeExpression[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeObjectCreateExpression;false;get_CreateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeObjectCreateExpression;false;set_CreateType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.CodeDom.CodeTypeReference,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.CodeDom.CodeTypeReference,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;CodeParameterDeclarationExpression;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;set_CustomAttributes;(System.CodeDom.CodeAttributeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpression;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;Add;(System.CodeDom.CodeParameterDeclarationExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;AddRange;(System.CodeDom.CodeParameterDeclarationExpressionCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;AddRange;(System.CodeDom.CodeParameterDeclarationExpression[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;CodeParameterDeclarationExpressionCollection;(System.CodeDom.CodeParameterDeclarationExpressionCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;CodeParameterDeclarationExpressionCollection;(System.CodeDom.CodeParameterDeclarationExpression[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;CopyTo;(System.CodeDom.CodeParameterDeclarationExpression[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;Insert;(System.Int32,System.CodeDom.CodeParameterDeclarationExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;Remove;(System.CodeDom.CodeParameterDeclarationExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeParameterDeclarationExpressionCollection;false;set_Item;(System.Int32,System.CodeDom.CodeParameterDeclarationExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodePropertyReferenceExpression;false;CodePropertyReferenceExpression;(System.CodeDom.CodeExpression,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodePropertyReferenceExpression;false;get_PropertyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodePropertyReferenceExpression;false;set_PropertyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeRegionDirective;false;CodeRegionDirective;(System.CodeDom.CodeRegionMode,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeRegionDirective;false;get_RegionText;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeRegionDirective;false;set_RegionText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeRemoveEventStatement;false;CodeRemoveEventStatement;(System.CodeDom.CodeEventReferenceExpression,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeRemoveEventStatement;false;CodeRemoveEventStatement;(System.CodeDom.CodeExpression,System.String,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeRemoveEventStatement;false;get_Event;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeRemoveEventStatement;false;set_Event;(System.CodeDom.CodeEventReferenceExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetCompileUnit;false;CodeSnippetCompileUnit;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetCompileUnit;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeSnippetCompileUnit;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetExpression;false;CodeSnippetExpression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetExpression;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeSnippetExpression;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetStatement;false;CodeSnippetStatement;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetStatement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeSnippetStatement;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetTypeMember;false;CodeSnippetTypeMember;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeSnippetTypeMember;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeSnippetTypeMember;false;set_Text;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatement;false;get_EndDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeStatement;false;get_StartDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeStatementCollection;false;Add;(System.CodeDom.CodeStatement);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;AddRange;(System.CodeDom.CodeStatementCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;AddRange;(System.CodeDom.CodeStatement[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;CodeStatementCollection;(System.CodeDom.CodeStatementCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;CodeStatementCollection;(System.CodeDom.CodeStatement[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;CopyTo;(System.CodeDom.CodeStatement[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeStatementCollection;false;Insert;(System.Int32,System.CodeDom.CodeStatement);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;Remove;(System.CodeDom.CodeStatement);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeStatementCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeStatementCollection;false;set_Item;(System.Int32,System.CodeDom.CodeStatement);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclaration;false;CodeTypeDeclaration;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclaration;false;get_BaseTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeDeclaration;false;get_Members;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeDeclaration;false;get_TypeParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;Add;(System.CodeDom.CodeTypeDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;AddRange;(System.CodeDom.CodeTypeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;AddRange;(System.CodeDom.CodeTypeDeclaration[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;CodeTypeDeclarationCollection;(System.CodeDom.CodeTypeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;CodeTypeDeclarationCollection;(System.CodeDom.CodeTypeDeclaration[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;CopyTo;(System.CodeDom.CodeTypeDeclaration[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;Insert;(System.Int32,System.CodeDom.CodeTypeDeclaration);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;Remove;(System.CodeDom.CodeTypeDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeDeclarationCollection;false;set_Item;(System.Int32,System.CodeDom.CodeTypeDeclaration);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDelegate;false;CodeTypeDelegate;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeDelegate;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeDelegate;false;set_ReturnType;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMember;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeMember;false;get_EndDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeMember;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeMember;false;get_StartDirectives;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeMember;false;set_CustomAttributes;(System.CodeDom.CodeAttributeDeclarationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMember;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;Add;(System.CodeDom.CodeTypeMember);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;AddRange;(System.CodeDom.CodeTypeMemberCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;AddRange;(System.CodeDom.CodeTypeMember[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;CodeTypeMemberCollection;(System.CodeDom.CodeTypeMemberCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;CodeTypeMemberCollection;(System.CodeDom.CodeTypeMember[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;CopyTo;(System.CodeDom.CodeTypeMember[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;Insert;(System.Int32,System.CodeDom.CodeTypeMember);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;Remove;(System.CodeDom.CodeTypeMember);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeMemberCollection;false;set_Item;(System.Int32,System.CodeDom.CodeTypeMember);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeOfExpression;false;CodeTypeOfExpression;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeOfExpression;false;CodeTypeOfExpression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeOfExpression;false;CodeTypeOfExpression;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeOfExpression;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeOfExpression;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameter;false;CodeTypeParameter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameter;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeParameter;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeParameter;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeParameter;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;Add;(System.CodeDom.CodeTypeParameter);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;AddRange;(System.CodeDom.CodeTypeParameterCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;AddRange;(System.CodeDom.CodeTypeParameter[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;CodeTypeParameterCollection;(System.CodeDom.CodeTypeParameterCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;CodeTypeParameterCollection;(System.CodeDom.CodeTypeParameter[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;CopyTo;(System.CodeDom.CodeTypeParameter[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;Insert;(System.Int32,System.CodeDom.CodeTypeParameter);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;Remove;(System.CodeDom.CodeTypeParameter);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeParameterCollection;false;set_Item;(System.Int32,System.CodeDom.CodeTypeParameter);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReference;false;CodeTypeReference;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReference;false;CodeTypeReference;(System.String,System.CodeDom.CodeTypeReferenceOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReference;false;CodeTypeReference;(System.String,System.CodeDom.CodeTypeReference[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReference;false;CodeTypeReference;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReference;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeReference;false;get_TypeArguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeReference;false;set_BaseType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;Add;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;Add;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;AddRange;(System.CodeDom.CodeTypeReferenceCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;AddRange;(System.CodeDom.CodeTypeReference[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;CodeTypeReferenceCollection;(System.CodeDom.CodeTypeReferenceCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;CodeTypeReferenceCollection;(System.CodeDom.CodeTypeReference[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;CopyTo;(System.CodeDom.CodeTypeReference[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;Insert;(System.Int32,System.CodeDom.CodeTypeReference);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;Remove;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeReferenceCollection;false;set_Item;(System.Int32,System.CodeDom.CodeTypeReference);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceExpression;false;CodeTypeReferenceExpression;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceExpression;false;CodeTypeReferenceExpression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceExpression;false;CodeTypeReferenceExpression;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeTypeReferenceExpression;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeTypeReferenceExpression;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.CodeDom.CodeTypeReference,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.CodeDom.CodeTypeReference,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.CodeDom.CodeTypeReference,System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.CodeDom.CodeTypeReference,System.String,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.String,System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.String,System.String,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.Type,System.String,System.CodeDom.CodeExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;CodeVariableDeclarationStatement;(System.Type,System.String,System.CodeDom.CodeExpression);;Argument[1];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableDeclarationStatement;false;set_Type;(System.CodeDom.CodeTypeReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableReferenceExpression;false;CodeVariableReferenceExpression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.CodeDom;CodeVariableReferenceExpression;false;get_VariableName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.CodeDom;CodeVariableReferenceExpression;false;set_VariableName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;Add;(T,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;ConcurrentBag<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentBag<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;ConcurrentBag<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentBag<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetOrAdd;(TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;ConcurrentStack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Concurrent;ConcurrentStack<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;OrderablePartitioner<>;false;GetDynamicPartitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable,System.Collections.Concurrent.EnumerablePartitionerOptions);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IList,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Concurrent;Partitioner;false;Create<>;(TSource[],System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;AsReadOnly<,>;(System.Collections.Generic.IDictionary);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;AsReadOnly<>;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetDefaultAssets;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetDefaultGroup;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetDefaultRuntimeFileAssets;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetRuntimeAssets;(System.Collections.Generic.IEnumerable,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetRuntimeFileAssets;(System.Collections.Generic.IEnumerable,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetRuntimeGroup;(System.Collections.Generic.IEnumerable,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;Remove<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;Argument[2];generated:taint", + "System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[1];Argument[0].Element;generated:taint", + "System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[2];Argument[0].Element;generated:taint", + "System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Entry;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+KeyCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;Dictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+ValueCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;Dictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Int32,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;Dictionary<,>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Generic;Dictionary<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Dictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;HashSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;HashSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Generic;HashSet<>;false;HashSet;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;HashSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;HashSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Generic;KeyValuePair<,>;false;Deconstruct;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;KeyValuePair<,>;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;KeyValuePair<,>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[0];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[0];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;Remove;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedList<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;get_Last;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;LinkedListNode<>;false;LinkedListNode;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;LinkedListNode<>;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedListNode<>;false;get_Next;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedListNode<>;false;get_Previous;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedListNode<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;LinkedListNode<>;false;set_Value;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;List<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;List<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Generic;List<>;false;List;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;List<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;NonRandomizedStringEqualityComparer;false;GetUnderlyingEqualityComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>+UnorderedItemsCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>+UnorderedItemsCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>+UnorderedItemsCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;PriorityQueue<,>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;EnqueueDequeue;(TElement,TPriority);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;EnqueueDequeue;(TElement,TPriority);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;EnqueueRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;PriorityQueue;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;PriorityQueue;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;PriorityQueue;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;PriorityQueue;(System.Int32,System.Collections.Generic.IComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;TryDequeue;(TElement,TPriority);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;TryPeek;(TElement,TPriority);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;PriorityQueue<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Queue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Queue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Queue<>;false;Enqueue;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;Queue<>;false;Queue;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;Queue<>;false;TryDequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Queue<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Queue<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedDictionary<,>+KeyValuePairComparer;false;KeyValuePairComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>+KeyList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>+ValueList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>;false;GetKeyAtIndex;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>;false;GetValueAtIndex;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>;false;SetValueAtIndex;(System.Int32,TValue);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedList<,>;false;TryGetValue;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedList<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;SortedSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedSet<>;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedSet<>;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedSet<>;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;SortedSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;SortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Generic;Stack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Stack<>;false;Push;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Generic;Stack<>;false;Stack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Generic;Stack<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Stack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Stack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Generic;Stack<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(System.Collections.Immutable.ImmutableArray,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[3];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;Create<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;MoveToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;As<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;AsMemory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;CastArray<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;CastUp<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;OfType<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;GetValueOrDefault<,>;(System.Collections.Immutable.IImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Immutable.ImmutableDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Clear;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;Create<>;(System.Collections.Generic.IEqualityComparer,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Immutable.ImmutableHashSet+Builder);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Clear;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;WithComparer;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableHashSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableHashSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableInterlocked;false;GetOrAdd<,>;(System.Collections.Immutable.ImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Remove<>;(System.Collections.Immutable.IImmutableList,T);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;RemoveRange<>;(System.Collections.Immutable.IImmutableList,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];Argument[0].Element;generated:taint", + "System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Immutable.ImmutableList+Builder);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableQueue;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue;false;Dequeue<>;(System.Collections.Immutable.IImmutableQueue,T);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableQueue<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Immutable.ImmutableSortedDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Clear;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T[]);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;CreateBuilder<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Immutable.ImmutableSortedSet+Builder);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Clear;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;WithComparer;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableSortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Immutable;ImmutableStack;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack;false;Pop<>;(System.Collections.Immutable.IImmutableStack,T);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>;false;Pop;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[0];ReturnValue;generated:taint", + "System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;Collection<>;false;Collection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;Collection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;Collection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;KeyedCollection;(System.Collections.Generic.IEqualityComparer,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;TryGetValue;(TKey,TItem);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;KeyedCollection<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.Collections.ObjectModel;ReadOnlyCollection<>;false;ReadOnlyCollection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;HybridDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;ListDictionary;false;ListDictionary;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;ListDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllKeys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameObjectCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Specialized;NameObjectCollectionBase;true;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameValueCollection;false;Get;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Int32,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameValueCollection;false;Set;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NameValueCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NameValueCollection;false;set_Item;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32,System.Int32);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[2];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_NewItems;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_OldItems;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;OrderedDictionary;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Int32,System.Collections.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections.Specialized;OrderedDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections.Specialized;StringCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;StringDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections.Specialized;StringDictionary;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;StringDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections.Specialized;StringEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;ArrayList;false;Adapter;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;ArrayList;false;ArrayList;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections;ArrayList;false;CopyTo;(System.Array);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Collections;ArrayList;false;ReadOnly;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;ArrayList;false;ReadOnly;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;ArrayList;false;SetRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Collections;ArrayList;false;Synchronized;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;ArrayList;false;Synchronized;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;ArrayList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;And;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;LeftShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;Not;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;Or;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;RightShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;Xor;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;BitArray;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections;CollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;CollectionBase;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;CollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Comparer;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections;DictionaryBase;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryBase;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryBase;false;get_InnerHashtable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryBase;true;OnGet;(System.Object,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Collections;DictionaryEntry;false;Deconstruct;(System.Object,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections;DictionaryEntry;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;DictionaryEntry;false;set_Key;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;DictionaryEntry;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;Hashtable;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Hashtable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint", + "System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint", + "System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[3];Argument[Qualifier];generated:taint", + "System.Collections;Hashtable;false;Synchronized;(System.Collections.Hashtable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;Hashtable;false;get_EqualityComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Hashtable;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;Hashtable;false;get_comparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Hashtable;false;get_hcp;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Hashtable;false;set_comparer;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;Hashtable;false;set_hcp;(System.Collections.IHashCodeProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;ListDictionaryInternal;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;ListDictionaryInternal;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;Queue;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Queue;false;Enqueue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;Queue;false;Queue;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections;Queue;false;Synchronized;(System.Collections.Queue);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;Queue;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;ReadOnlyCollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;ReadOnlyCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;SortedList;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;SortedList;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;SortedList;false;GetKeyList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;SortedList;false;SetByIndex;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Collections;SortedList;false;SortedList;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;SortedList;false;Synchronized;(System.Collections.SortedList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;SortedList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Collections;Stack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Collections;Stack;false;Stack;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Collections;Stack;false;Synchronized;(System.Collections.Stack);;Argument[0].Element;ReturnValue;generated:taint", + "System.Collections;Stack;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Collections;Stack;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Hosting;AggregateCatalog;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AggregateCatalog;false;get_Catalogs;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AggregateExportProvider;false;AggregateExportProvider;(System.ComponentModel.Composition.Hosting.ExportProvider[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AggregateExportProvider;false;GetExportsCore;(System.ComponentModel.Composition.Primitives.ImportDefinition,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AggregateExportProvider;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ApplicationCatalog;false;ApplicationCatalog;(System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ApplicationCatalog;false;ApplicationCatalog;(System.Reflection.ReflectionContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ApplicationCatalog;false;ApplicationCatalog;(System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ApplicationCatalog;false;ApplicationCatalog;(System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ApplicationCatalog;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.Reflection.ReflectionContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.Reflection.ReflectionContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.Reflection.Assembly,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.String,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.String,System.Reflection.ReflectionContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;AssemblyCatalog;(System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AssemblyCatalog;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AtomicComposition;false;AtomicComposition;(System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;AtomicComposition;false;TryGetValue<>;(System.Object,System.Boolean,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;AtomicComposition;false;TryGetValue<>;(System.Object,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExportProvider;false;CatalogExportProvider;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.ComponentModel.Composition.Hosting.CompositionOptions);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExportProvider;false;GetExportsCore;(System.ComponentModel.Composition.Primitives.ImportDefinition,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExportProvider;false;get_Catalog;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExportProvider;false;get_SourceProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExportProvider;false;set_SourceProvider;(System.ComponentModel.Composition.Hosting.ExportProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CatalogExtensions;false;CreateCompositionService;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog);;Argument[0].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartCatalogChangeEventArgs;false;ComposablePartCatalogChangeEventArgs;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartCatalogChangeEventArgs;false;ComposablePartCatalogChangeEventArgs;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartCatalogChangeEventArgs;false;get_AddedDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartCatalogChangeEventArgs;false;get_RemovedDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartExportProvider;false;Compose;(System.ComponentModel.Composition.Hosting.CompositionBatch);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartExportProvider;false;get_SourceProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ComposablePartExportProvider;false;set_SourceProvider;(System.ComponentModel.Composition.Hosting.ExportProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;AddExport;(System.ComponentModel.Composition.Primitives.Export);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;AddPart;(System.ComponentModel.Composition.Primitives.ComposablePart);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;CompositionBatch;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;CompositionBatch;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;RemovePart;(System.ComponentModel.Composition.Primitives.ComposablePart);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;get_PartsToAdd;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionBatch;false;get_PartsToRemove;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionContainer;false;CompositionContainer;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.ComponentModel.Composition.Hosting.CompositionOptions,System.ComponentModel.Composition.Hosting.ExportProvider[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionContainer;false;CompositionContainer;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.ComponentModel.Composition.Hosting.CompositionOptions,System.ComponentModel.Composition.Hosting.ExportProvider[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionContainer;false;GetExportsCore;(System.ComponentModel.Composition.Primitives.ImportDefinition,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionContainer;false;get_Catalog;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionContainer;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;CompositionScopeDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;CompositionScopeDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;CompositionScopeDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;CompositionScopeDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;CompositionScopeDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartCatalog,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;get_Children;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;CompositionScopeDefinition;false;get_PublicSurface;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;DirectoryCatalog;(System.String,System.String,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;get_FullPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;get_LoadedFiles;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;DirectoryCatalog;false;get_SearchPattern;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExport<,>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExport<,>;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExport<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExport<>;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportProvider;false;TryGetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition,System.ComponentModel.Composition.Hosting.AtomicComposition,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportsChangeEventArgs;false;ExportsChangeEventArgs;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ExportsChangeEventArgs;false;ExportsChangeEventArgs;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Hosting.AtomicComposition);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;ExportsChangeEventArgs;false;get_AddedExports;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportsChangeEventArgs;false;get_ChangedContractNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ExportsChangeEventArgs;false;get_RemovedExports;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;FilteredCatalog;false;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;FilteredCatalog;false;get_Complement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Hosting;ImportEngine;false;ImportEngine;(System.ComponentModel.Composition.Hosting.ExportProvider,System.ComponentModel.Composition.Hosting.CompositionOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;TypeCatalog;false;TypeCatalog;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;TypeCatalog;false;TypeCatalog;(System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;TypeCatalog;false;TypeCatalog;(System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Hosting;TypeCatalog;false;TypeCatalog;(System.Collections.Generic.IEnumerable,System.Reflection.ReflectionContext,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartCatalog;true;GetExports;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartCatalog;true;get_Parts;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartException;false;ComposablePartException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartException;false;ComposablePartException;(System.String,System.ComponentModel.Composition.Primitives.ICompositionElement,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel.Composition.Primitives;ComposablePartException;false;get_Element;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;ContractBasedImportDefinition;(System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;ContractBasedImportDefinition;(System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;get_Constraint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;get_RequiredMetadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ContractBasedImportDefinition;false;get_RequiredTypeIdentity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;Export;false;get_Definition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;Export;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;Export;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ExportDefinition;false;ExportDefinition;(System.String,System.Collections.Generic.IDictionary);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ExportDefinition;false;ExportDefinition;(System.String,System.Collections.Generic.IDictionary);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ExportDefinition;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ExportDefinition;false;get_ContractName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ExportDefinition;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ExportedDelegate;false;ExportedDelegate;(System.Object,System.Reflection.MethodInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ExportedDelegate;false;ExportedDelegate;(System.Object,System.Reflection.MethodInfo);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ImportDefinition;false;ImportDefinition;(System.Linq.Expressions.Expression>,System.String,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ImportDefinition;false;ImportDefinition;(System.Linq.Expressions.Expression>,System.String,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.Collections.Generic.IDictionary);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Primitives;ImportDefinition;false;get_Constraint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ImportDefinition;false;get_ContractName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Primitives;ImportDefinition;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;LazyMemberInfo;false;GetAccessors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;LazyMemberInfo;false;LazyMemberInfo;(System.Reflection.MemberInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.ReflectionModel;LazyMemberInfo;false;LazyMemberInfo;(System.Reflection.MemberTypes,System.Reflection.MemberInfo[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateExportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateExportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateExportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.ComponentModel.Composition.ReflectionModel.LazyMemberInfo,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.Boolean,System.ComponentModel.Composition.CreationPolicy,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.Lazy,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.Lazy,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.Lazy,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.ComponentModel.Composition.CreationPolicy,System.Collections.Generic.IDictionary,System.Boolean,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreateImportDefinition;(System.Lazy,System.String,System.String,System.Collections.Generic.IEnumerable>,System.ComponentModel.Composition.Primitives.ImportCardinality,System.ComponentModel.Composition.CreationPolicy,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreatePartDefinition;(System.Lazy,System.Boolean,System.Lazy>,System.Lazy>,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreatePartDefinition;(System.Lazy,System.Boolean,System.Lazy>,System.Lazy>,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreatePartDefinition;(System.Lazy,System.Boolean,System.Lazy>,System.Lazy>,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[3];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreatePartDefinition;(System.Lazy,System.Boolean,System.Lazy>,System.Lazy>,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[4];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;CreatePartDefinition;(System.Lazy,System.Boolean,System.Lazy>,System.Lazy>,System.Lazy>,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[5];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;GetExportFactoryProductImportDefinition;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;GetExportingMember;(System.ComponentModel.Composition.Primitives.ExportDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;GetImportingMember;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;GetImportingParameter;(System.ComponentModel.Composition.Primitives.ImportDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;GetPartType;(System.ComponentModel.Composition.Primitives.ComposablePartDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.ReflectionModel;ReflectionModelServices;false;TryMakeGenericPartDefinition;(System.ComponentModel.Composition.Primitives.ComposablePartDefinition,System.Collections.Generic.IEnumerable,System.ComponentModel.Composition.Primitives.ComposablePartDefinition);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AddMetadata;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AsContractName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AsContractName;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AsContractType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AsContractType;(System.Type);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;AsContractType<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;ExportBuilder;false;Inherited;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AllowDefault;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AllowRecomposition;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsContractName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsContractName;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsContractType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsContractType;(System.Type);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsContractType<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;AsMany;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;RequiredCreationPolicy;(System.ComponentModel.Composition.CreationPolicy);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;ImportBuilder;false;Source;(System.ComponentModel.Composition.ImportSource);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;PartBuilder;false;AddMetadata;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;PartBuilder;false;Export;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder;false;Export<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder;false;ExportInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder;false;SetCreationPolicy;(System.ComponentModel.Composition.CreationPolicy);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;PartBuilder<>;false;ExportProperty;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder<>;false;ExportProperty<>;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder<>;false;ImportProperty;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder<>;false;ImportProperty<>;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;PartBuilder<>;false;SelectConstructor;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Composition.Registration;RegistrationBuilder;false;GetCustomAttributes;(System.Reflection.MemberInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition.Registration;RegistrationBuilder;false;GetCustomAttributes;(System.Reflection.ParameterInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;AddPart;(System.ComponentModel.Composition.Hosting.CompositionBatch,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePart;(System.ComponentModel.Composition.Primitives.ComposablePartDefinition,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePart;(System.ComponentModel.Composition.Primitives.ComposablePartDefinition,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePart;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePart;(System.Object,System.Reflection.ReflectionContext);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePartDefinition;(System.Type,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePartDefinition;(System.Type,System.ComponentModel.Composition.Primitives.ICompositionElement);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePartDefinition;(System.Type,System.ComponentModel.Composition.Primitives.ICompositionElement,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;CreatePartDefinition;(System.Type,System.ComponentModel.Composition.Primitives.ICompositionElement,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;GetContractName;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;GetMetadataView<>;(System.Collections.Generic.IDictionary);;Argument[0].Element;ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;GetTypeIdentity;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;GetTypeIdentity;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;SatisfyImportsOnce;(System.ComponentModel.Composition.ICompositionService,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;AttributedModelServices;false;SatisfyImportsOnce;(System.ComponentModel.Composition.ICompositionService,System.Object,System.Reflection.ReflectionContext);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CatalogReflectionContextAttribute;false;CatalogReflectionContextAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Composition;ChangeRejectedException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionError;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionError;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionError;false;get_Element;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionError;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionException;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;CompositionException;false;get_RootCauses;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;ExportFactory<,>;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Composition;ExportLifetimeContext<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;set_Schema;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;AssociatedMetadataTypeTypeDescriptionProvider;(System.Type,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;CompareAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateField;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateFilter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetOrder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_GroupName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Prompt;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ResourceType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ShortName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_GroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Prompt;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ShortName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayText;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayTextResourceType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayTextResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;set_Extensions;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;FilterUIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;MaxLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;MetadataTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;get_MetadataClassType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;MinLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;RangeAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;RegularExpressionAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;StringLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;UIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessage;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;ValidationAttribute;true;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationContext;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationContext;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.DataAnnotations;ValidationContext;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;ValidationException;false;ValidationException;(System.ComponentModel.DataAnnotations.ValidationResult,System.ComponentModel.DataAnnotations.ValidationAttribute,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.DataAnnotations;ValidationException;false;get_ValidationResult;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;Append;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;DesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design.Serialization;RootDesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerCollection;false;DesignerCollection;(System.Collections.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Design;DesignerCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerOptionService;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerVerb;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerVerb;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerVerb;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;DesignerVerb;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Design;DesignerVerbCollection;false;DesignerVerbCollection;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel.Design;DesignerVerbCollection;false;Remove;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel.Design;MenuCommand;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;ServiceContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel.Design;ServiceContainer;false;ServiceContainer;(System.IServiceProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;ArrayConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;AsyncOperation;false;get_SynchronizationContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;AttributeCollection;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;AttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint", + "System.ComponentModel;CategoryAttribute;false;CategoryAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;CategoryAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CharConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;CollectionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;Component;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;Component;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;Component;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;Component;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;ComponentCollection;false;ComponentCollection;(System.ComponentModel.IComponent[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;ComponentCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ComponentCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String,System.Globalization.CultureInfo);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel;Container;false;Add;(System.ComponentModel.IComponent,System.String);;Argument[1];Argument[0];generated:taint", + "System.ComponentModel;Container;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;Container;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;Container;false;get_Components;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ContainerFilterService;true;FilterComponents;(System.ComponentModel.ComponentCollection);;Argument[0].Element;ReturnValue;generated:taint", + "System.ComponentModel;CultureInfoConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CultureInfoConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;CultureInfoConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CustomTypeDescriptor;false;CustomTypeDescriptor;(System.ComponentModel.ICustomTypeDescriptor);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;CustomTypeDescriptor;true;GetAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CustomTypeDescriptor;true;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CustomTypeDescriptor;true;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;CustomTypeDescriptor;true;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;DecimalConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;DefaultValueAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;DefaultValueAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;DesignerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EditorAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EnumConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;EventDescriptorCollection;(System.ComponentModel.EventDescriptor[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;EventHandlerList;false;AddHandlers;(System.ComponentModel.EventHandlerList);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;EventHandlerList;false;get_Item;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;GuidConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;LicFileLicenseProvider;false;GetKey;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;LicFileLicenseProvider;false;GetLicense;(System.ComponentModel.LicenseContext,System.Type,System.Object,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;LicenseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;LicenseProviderAttribute;false;get_LicenseProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;LicenseProviderAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ListSortDescriptionCollection;false;ListSortDescriptionCollection;(System.ComponentModel.ListSortDescription[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;ListSortDescriptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel;MarshalByValueComponent;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MarshalByValueComponent;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MarshalByValueComponent;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MarshalByValueComponent;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToDisplayString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MaskedTextProvider;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;false;GetInvokee;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;false;GetSite;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;MemberDescriptor;true;CreateAttributeCollection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;FillAttributes;(System.Collections.IList);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.ComponentModel;MemberDescriptor;true;GetInvocationTarget;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_AttributeArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;MemberDescriptor;true;set_AttributeArray;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;MultilineStringConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;NestedContainer;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;NestedContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:value", + "System.ComponentModel;NullableConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;NullableConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object,System.Attribute[]);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;ProgressChangedEventArgs;false;ProgressChangedEventArgs;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.ComponentModel;ProgressChangedEventArgs;false;get_UserState;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptor;false;FillAttributes;(System.Collections.IList);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.ComponentModel;PropertyDescriptor;false;GetInvocationTarget;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptor;false;GetValueChangedHandler;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptor;true;get_Converter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.String,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.Type,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;PropertyTabAttribute;false;get_TabClasses;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ReferenceConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;ReferenceConverter;false;ReferenceConverter;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;RunWorkerCompletedEventArgs;false;RunWorkerCompletedEventArgs;(System.Object,System.Exception,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;RunWorkerCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;StringConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TimeSpanConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;ToolboxItemFilterAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter+StandardValuesCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.ComponentModel;TypeConverter+StandardValuesCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter+StandardValuesCollection;false;StandardValuesCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;TypeConverter+StandardValuesCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertTo;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;ConvertToString;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;GetProperties;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;GetStandardValues;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeConverter;false;SortProperties;(System.ComponentModel.PropertyDescriptorCollection,System.String[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;false;TypeDescriptionProvider;(System.ComponentModel.TypeDescriptionProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetReflectionType;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetRuntimeType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Object,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Type,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;GetAssociation;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;GetProvider;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeDescriptor;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.ComponentModel;TypeListConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeListConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;TypeListConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ComponentModel;TypeListConverter;false;TypeListConverter;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ComponentModel;VersionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.ComponentModel;WarningException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel;Win32Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.ComponentModel;Win32Exception;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;ExportConventionBuilder;false;AddMetadata;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ExportConventionBuilder;false;AsContractName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Convention;ExportConventionBuilder;false;AsContractName;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ExportConventionBuilder;false;AsContractType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Convention;ExportConventionBuilder;false;AsContractType;(System.Type);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ExportConventionBuilder;false;AsContractType<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;ImportConventionBuilder;false;AddMetadataConstraint;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ImportConventionBuilder;false;AllowDefault;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ImportConventionBuilder;false;AsContractName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Convention;ImportConventionBuilder;false;AsContractName;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;ImportConventionBuilder;false;AsMany;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;ImportConventionBuilder;false;AsMany;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;PartConventionBuilder;false;AddPartMetadata;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;PartConventionBuilder;false;Export;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;PartConventionBuilder;false;Export<>;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;PartConventionBuilder;false;ExportInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder;false;Shared;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder;false;Shared;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Convention;PartConventionBuilder;false;Shared;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder;false;Shared;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder<>;false;ExportProperty;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder<>;false;ExportProperty<>;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder<>;false;ImportProperty;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder<>;false;ImportProperty<>;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Convention;PartConventionBuilder<>;false;NotifyImportsSatisfied;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Convention;PartConventionBuilder<>;false;SelectConstructor;(System.Linq.Expressions.Expression>);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Hosting.Core;CompositionContract;false;ChangeType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;ChangeType;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;CompositionContract;(System.Type,System.String,System.Collections.Generic.IDictionary);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;CompositionContract;(System.Type,System.String,System.Collections.Generic.IDictionary);;Argument[1];Argument[Qualifier];generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;CompositionContract;(System.Type,System.String,System.Collections.Generic.IDictionary);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;TryUnwrapMetadataConstraint<>;(System.String,T,System.Composition.Hosting.Core.CompositionContract);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;get_ContractName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;get_ContractType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionContract;false;get_MetadataConstraints;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Missing;(System.Composition.Hosting.Core.CompositionContract,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Missing;(System.Composition.Hosting.Core.CompositionContract,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Oversupplied;(System.Composition.Hosting.Core.CompositionContract,System.Collections.Generic.IEnumerable,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Oversupplied;(System.Composition.Hosting.Core.CompositionContract,System.Collections.Generic.IEnumerable,System.Object);;Argument[1].Element;ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Oversupplied;(System.Composition.Hosting.Core.CompositionContract,System.Collections.Generic.IEnumerable,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Satisfied;(System.Composition.Hosting.Core.CompositionContract,System.Composition.Hosting.Core.ExportDescriptorPromise,System.Boolean,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Satisfied;(System.Composition.Hosting.Core.CompositionContract,System.Composition.Hosting.Core.ExportDescriptorPromise,System.Boolean,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;Satisfied;(System.Composition.Hosting.Core.CompositionContract,System.Composition.Hosting.Core.ExportDescriptorPromise,System.Boolean,System.Object);;Argument[3];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;get_Contract;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;CompositionDependency;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;ResolveDependencies;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;ResolveDependencies;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;ResolveRequiredDependency;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;ResolveRequiredDependency;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;TryResolveOptionalDependency;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean,System.Composition.Hosting.Core.CompositionDependency);;Argument[0];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;DependencyAccessor;false;TryResolveOptionalDependency;(System.Object,System.Composition.Hosting.Core.CompositionContract,System.Boolean,System.Composition.Hosting.Core.CompositionDependency);;Argument[1];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;ExportDescriptorPromise;false;GetDescriptor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;ExportDescriptorPromise;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;ExportDescriptorPromise;false;get_Contract;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;ExportDescriptorPromise;false;get_Dependencies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;ExportDescriptorPromise;false;get_Origin;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;LifetimeContext;false;AddBoundInstance;(System.IDisposable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Hosting.Core;LifetimeContext;false;FindContextWithin;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting.Core;LifetimeContext;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithAssemblies;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithAssemblies;(System.Collections.Generic.IEnumerable,System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithAssembly;(System.Reflection.Assembly);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithAssembly;(System.Reflection.Assembly,System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithDefaultConventions;(System.Composition.Convention.AttributedModelProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithDefaultConventions;(System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Hosting;ContainerConfiguration;false;WithPart;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithPart;(System.Type,System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithPart<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithPart<>;(System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithParts;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithParts;(System.Collections.Generic.IEnumerable,System.Composition.Convention.AttributedModelProvider);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition.Hosting;ContainerConfiguration;false;WithParts;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithProvider;(System.Composition.Hosting.Core.ExportDescriptorProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.Composition.Hosting;ContainerConfiguration;false;WithProvider;(System.Composition.Hosting.Core.ExportDescriptorProvider);;Argument[Qualifier];ReturnValue;generated:value", + "System.Composition;SharingBoundaryAttribute;false;SharingBoundaryAttribute;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Composition;SharingBoundaryAttribute;false;get_SharingBoundaryNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;GetConfigTypeName;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;GetStreamNameForConfigSource;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;GetStreamNameForConfigSource;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;InitForConfiguration;(System.String,System.String,System.String,System.Configuration.Internal.IInternalConfigRoot,System.Object[]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;OpenStreamForWrite;(System.String,System.String,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;OpenStreamForWrite;(System.String,System.String,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;OpenStreamForWrite;(System.String,System.String,System.Object,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Configuration.Internal;DelegatingConfigHost;false;OpenStreamForWrite;(System.String,System.String,System.Object,System.Boolean);;Argument[2];ReturnValue;generated:taint", + "System.Configuration.Provider;ProviderBase;true;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration.Provider;ProviderBase;true;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Configuration.Provider;ProviderBase;true;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration.Provider;ProviderBase;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration.Provider;ProviderCollection;false;CopyTo;(System.Configuration.Provider.ProviderBase[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration.Provider;ProviderCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration.Provider;ProviderCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;AppSettingsReader;false;GetValue;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;AppSettingsSection;false;DeserializeElement;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;AppSettingsSection;false;GetRuntimeObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;AppSettingsSection;false;Reset;(System.Configuration.ConfigurationElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;AppSettingsSection;false;get_File;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;AppSettingsSection;false;get_Settings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;ApplicationSettingsBase;(System.ComponentModel.IComponent,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ApplicationSettingsBase;false;ApplicationSettingsBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_PropertyValues;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;get_SettingsKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ApplicationSettingsBase;false;set_SettingsKey;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;CallbackValidatorAttribute;false;get_CallbackMethodName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CallbackValidatorAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CallbackValidatorAttribute;false;get_ValidatorInstance;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CallbackValidatorAttribute;false;set_CallbackMethodName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;CallbackValidatorAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ClientSettingsSection;false;get_Settings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;AddRange;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;CommaDelimitedStringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Configuration;CommaDelimitedStringCollectionConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;CommaDelimitedStringCollectionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateCDataSection;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateComment;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateSignificantWhitespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateTextNode;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;CreateWhitespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigXmlDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigXmlDocument;false;LoadSingleElement;(System.String,System.Xml.XmlTextReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigXmlDocument;false;get_Filename;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;GetSectionGroup;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_AssemblyStringTransformer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_EvaluationContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_Locations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_RootSectionGroup;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_SectionGroups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_Sections;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;Configuration;false;get_TypeStringTransformer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;get_AddItemName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;get_ClearItemsName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;get_RemoveItemName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;set_AddItemName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;set_ClearItemsName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationCollectionAttribute;false;set_RemoveItemName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElement;false;get_ElementInformation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_EvaluationContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_LockAllAttributesExcept;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_LockAllElementsExcept;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_LockAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;false;get_LockElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;true;DeserializeElement;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElement;true;GetTransformedAssemblyString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;true;GetTransformedTypeString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElement;true;Reset;(System.Configuration.ConfigurationElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElement;true;SerializeElement;(System.Xml.XmlWriter,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationElement;true;SerializeToXmlElement;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationElement;true;Unmerge;(System.Configuration.ConfigurationElement,System.Configuration.ConfigurationElement,System.Configuration.ConfigurationSaveMode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElement;true;get_ElementProperty;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElementCollection;false;BaseAdd;(System.Configuration.ConfigurationElement,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;ConfigurationElementCollection;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;CopyTo;(System.Configuration.ConfigurationElement[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration;ConfigurationElementCollection;false;Reset;(System.Configuration.ConfigurationElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;SerializeElement;(System.Xml.XmlWriter,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;Unmerge;(System.Configuration.ConfigurationElement,System.Configuration.ConfigurationElement,System.Configuration.ConfigurationSaveMode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;get_AddElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElementCollection;false;get_ClearElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElementCollection;false;get_RemoveElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationElementCollection;false;set_AddElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;set_ClearElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;false;set_RemoveElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationElementCollection;true;BaseAdd;(System.Configuration.ConfigurationElement);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationElementCollection;true;BaseAdd;(System.Int32,System.Configuration.ConfigurationElement);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;ConfigurationErrorsException;false;ConfigurationErrorsException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationErrorsException;false;ConfigurationErrorsException;(System.String,System.Exception,System.String,System.Int32);;Argument[2];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationErrorsException;false;GetFilename;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Configuration;ConfigurationErrorsException;false;GetFilename;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationErrorsException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationErrorsException;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationErrorsException;false;get_Filename;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationErrorsException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationException;false;ConfigurationException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationException;false;ConfigurationException;(System.String,System.Exception,System.String,System.Int32);;Argument[2];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConfigurationException;false;GetXmlNodeFilename;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Configuration;ConfigurationException;false;get_BareMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationException;false;get_Filename;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationFileMap;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationLocation;false;OpenConfiguration;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationLocationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationLockCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationLockCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration;ConfigurationLockCollection;false;SetFromList;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationLockCollection;false;get_AttributeList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationLockCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;ConfigurationManager;false;OpenExeConfiguration;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationManager;false;OpenMappedExeConfiguration;(System.Configuration.ExeConfigurationFileMap,System.Configuration.ConfigurationUserLevel);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationManager;false;OpenMappedExeConfiguration;(System.Configuration.ExeConfigurationFileMap,System.Configuration.ConfigurationUserLevel,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationManager;false;OpenMappedMachineConfiguration;(System.Configuration.ConfigurationFileMap);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConfigurationProperty;false;ConfigurationProperty;(System.String,System.Type,System.Object,System.ComponentModel.TypeConverter,System.Configuration.ConfigurationValidatorBase,System.Configuration.ConfigurationPropertyOptions,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationProperty;false;get_Converter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationPropertyCollection;false;Add;(System.Configuration.ConfigurationProperty);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationPropertyCollection;false;CopyTo;(System.Configuration.ConfigurationProperty[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration;ConfigurationPropertyCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationPropertyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSection;true;DeserializeSection;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationSection;true;GetRuntimeObject;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;ConfigurationSectionCollection;false;Add;(System.String,System.Configuration.ConfigurationSection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationSectionCollection;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroup;false;get_SectionGroups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroup;false;get_Sections;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroup;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroup;false;set_Type;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;Add;(System.String,System.Configuration.ConfigurationSectionGroup);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;Add;(System.String,System.Configuration.ConfigurationSectionGroup);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;CopyTo;(System.Configuration.ConfigurationSectionGroup[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;Get;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConfigurationSectionGroupCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettings;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettings;false;get_ConnectionString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettings;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettings;false;get_ProviderName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettingsCollection;false;Add;(System.Configuration.ConnectionStringSettings);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ConnectionStringSettingsCollection;false;BaseAdd;(System.Int32,System.Configuration.ConfigurationElement);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;ConnectionStringSettingsCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ConnectionStringSettingsCollection;false;set_Item;(System.Int32,System.Configuration.ConnectionStringSettings);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;ConnectionStringsSection;false;GetRuntimeObject;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;ConnectionStringsSection;false;get_ConnectionStrings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ContextInformation;false;get_HostingContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;DefaultSection;false;DeserializeSection;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;DefaultSection;false;SerializeSection;(System.Configuration.ConfigurationElement,System.String,System.Configuration.ConfigurationSaveMode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;DefaultSettingValueAttribute;false;DefaultSettingValueAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;DefaultSettingValueAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;DpapiProtectedConfigurationProvider;false;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;DpapiProtectedConfigurationProvider;false;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Configuration;ElementInformation;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ElementInformation;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;GenericEnumConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;GenericEnumConverter;false;GenericEnumConverter;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;IdnElement;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;IgnoreSection;false;DeserializeSection;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;IgnoreSection;false;SerializeSection;(System.Configuration.ConfigurationElement,System.String,System.Configuration.ConfigurationSaveMode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;InfiniteTimeSpanConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;InfiniteTimeSpanConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;IriParsingElement;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;KeyValueConfigurationCollection;false;Add;(System.Configuration.KeyValueConfigurationElement);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;KeyValueConfigurationCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;KeyValueConfigurationElement;false;KeyValueConfigurationElement;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;KeyValueConfigurationElement;false;KeyValueConfigurationElement;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Configuration;KeyValueConfigurationElement;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;KeyValueConfigurationElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;LocalFileSettingsProvider;false;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;LocalFileSettingsProvider;false;Initialize;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Configuration;LocalFileSettingsProvider;false;get_ApplicationName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;LocalFileSettingsProvider;false;set_ApplicationName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;NameValueConfigurationCollection;false;Add;(System.Configuration.NameValueConfigurationElement);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;NameValueConfigurationCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;NameValueConfigurationCollection;false;set_Item;(System.String,System.Configuration.NameValueConfigurationElement);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;NameValueConfigurationElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;NameValueConfigurationElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;NameValueFileSectionHandler;false;Create;(System.Object,System.Object,System.Xml.XmlNode);;Argument[2].Element;ReturnValue;generated:taint", + "System.Configuration;NameValueSectionHandler;false;Create;(System.Object,System.Object,System.Xml.XmlNode);;Argument[2].Element;ReturnValue;generated:taint", + "System.Configuration;PropertyInformation;false;get_Converter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;PropertyInformation;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;PropertyInformationCollection;false;CopyTo;(System.Configuration.PropertyInformation[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Configuration;PropertyInformationCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProtectedConfigurationProviderCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProtectedConfigurationSection;false;get_DefaultProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProtectedConfigurationSection;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProtectedProviderSettings;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProtectedProviderSettings;false;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProviderSettings;false;Reset;(System.Configuration.ConfigurationElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ProviderSettings;false;Unmerge;(System.Configuration.ConfigurationElement,System.Configuration.ConfigurationElement,System.Configuration.ConfigurationSaveMode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;ProviderSettings;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProviderSettings;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProviderSettings;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProviderSettings;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;ProviderSettingsCollection;false;Add;(System.Configuration.ProviderSettings);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;ProviderSettingsCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;ProviderSettingsCollection;false;set_Item;(System.Int32,System.Configuration.ProviderSettings);;Argument[Qualifier];Argument[1];generated:taint", + "System.Configuration;RegexStringValidator;false;RegexStringValidator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SchemeSettingElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SchemeSettingElementCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;SectionInformation;false;get_ConfigSource;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SectionInformation;false;get_ProtectionProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SectionInformation;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SectionInformation;false;set_ConfigSource;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SectionInformation;false;set_Type;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingChangingEventArgs;false;SettingChangingEventArgs;(System.String,System.String,System.String,System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingChangingEventArgs;false;SettingChangingEventArgs;(System.String,System.String,System.String,System.Object,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Configuration;SettingChangingEventArgs;false;SettingChangingEventArgs;(System.String,System.String,System.String,System.Object,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Configuration;SettingChangingEventArgs;false;SettingChangingEventArgs;(System.String,System.String,System.String,System.Object,System.Boolean);;Argument[3];Argument[Qualifier];generated:taint", + "System.Configuration;SettingChangingEventArgs;false;get_NewValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingChangingEventArgs;false;get_SettingClass;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingChangingEventArgs;false;get_SettingKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingChangingEventArgs;false;get_SettingName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingElementCollection;false;Add;(System.Configuration.SettingElement);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;SettingElementCollection;false;GetElementKey;(System.Configuration.ConfigurationElement);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;SettingValueElement;false;Reset;(System.Configuration.ConfigurationElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingValueElement;false;SerializeToXmlElement;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.Configuration;SettingValueElement;false;Unmerge;(System.Configuration.ConfigurationElement,System.Configuration.ConfigurationElement,System.Configuration.ConfigurationSaveMode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingValueElement;false;get_ValueXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingValueElement;false;set_ValueXml;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Configuration;SettingsBase;false;Initialize;(System.Configuration.SettingsContext,System.Configuration.SettingsPropertyCollection,System.Configuration.SettingsProviderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Configuration;SettingsBase;false;Initialize;(System.Configuration.SettingsContext,System.Configuration.SettingsPropertyCollection,System.Configuration.SettingsProviderCollection);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Configuration;SettingsBase;false;Initialize;(System.Configuration.SettingsContext,System.Configuration.SettingsPropertyCollection,System.Configuration.SettingsProviderCollection);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Configuration;SettingsBase;false;Synchronized;(System.Configuration.SettingsBase);;Argument[0];ReturnValue;generated:taint", + "System.Configuration;SettingsBase;true;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsBase;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsBase;true;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsBase;true;get_PropertyValues;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsBase;true;get_Providers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsDescriptionAttribute;false;SettingsDescriptionAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsDescriptionAttribute;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsGroupDescriptionAttribute;false;SettingsGroupDescriptionAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsGroupDescriptionAttribute;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsGroupNameAttribute;false;SettingsGroupNameAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsGroupNameAttribute;false;get_GroupName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsLoadedEventArgs;false;SettingsLoadedEventArgs;(System.Configuration.SettingsProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsLoadedEventArgs;false;get_Provider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;SettingsPropertyValue;false;get_PropertyValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyValue;false;get_SerializedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyValue;false;set_PropertyValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsPropertyValue;false;set_SerializedValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsPropertyValueCollection;false;Add;(System.Configuration.SettingsPropertyValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsPropertyValueCollection;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyValueCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsPropertyValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Configuration;SettingsProviderAttribute;false;SettingsProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsProviderAttribute;false;SettingsProviderAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;SettingsProviderAttribute;false;get_ProviderTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;SettingsProviderCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;StringValidator;false;StringValidator;(System.Int32,System.Int32,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Configuration;SubclassTypeValidator;false;SubclassTypeValidator;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;TimeSpanValidator;false;TimeSpanValidator;(System.TimeSpan,System.TimeSpan,System.Boolean,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Configuration;TimeSpanValidator;false;TimeSpanValidator;(System.TimeSpan,System.TimeSpan,System.Boolean,System.Int64);;Argument[1];Argument[Qualifier];generated:taint", + "System.Configuration;TypeNameConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;UriSection;false;get_Idn;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;UriSection;false;get_IriParsing;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;UriSection;false;get_SchemeSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Configuration;WhiteSpaceTrimStringConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Configuration;WhiteSpaceTrimStringConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Data.Common;DataAdapter;false;get_TableMappings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.String,System.String,System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;get_DataSetColumn;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;get_SourceColumn;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMapping;false;set_DataSetColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataColumnMapping;false;set_SourceColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;GetByDataSetColumn;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;GetDataColumn;(System.Data.Common.DataColumnMappingCollection,System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[3];ReturnValue;generated:taint", + "System.Data.Common;DataColumnMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data.Common;DataTableMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;GetDataColumn;(System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;get_ColumnMappings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;get_DataSetTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;get_SourceTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMapping;false;set_DataSetTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMapping;false;set_SourceTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;GetByDataSetTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[2];ReturnValue;generated:taint", + "System.Data.Common;DataTableMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data.Common;DbCommand;false;ExecuteReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;ExecuteReader;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;ExecuteReaderAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;false;set_Connection;(System.Data.Common.DbConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommand;false;set_Connection;(System.Data.IDbConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommand;false;set_Transaction;(System.Data.Common.DbTransaction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommand;false;set_Transaction;(System.Data.IDbTransaction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommand;true;ExecuteDbDataReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommand;true;PrepareAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetInsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetInsertCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;RowUpdatingHandler;(System.Data.Common.RowUpdatingEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.Common;DbCommandBuilder;false;get_DataAdapter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;false;set_DataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommandBuilder;true;InitializeCommand;(System.Data.Common.DbCommand);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;true;get_CatalogSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;true;get_QuotePrefix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;true;get_QuoteSuffix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;true;get_SchemaSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbCommandBuilder;true;set_CatalogSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommandBuilder;true;set_QuotePrefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommandBuilder;true;set_QuoteSuffix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbCommandBuilder;true;set_SchemaSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbConnection;false;CreateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnection;true;ChangeDatabaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DbConnection;true;OpenAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[1];Argument[0];generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[2];Argument[0];generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[1];Argument[0];generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[2];Argument[0];generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value", + "System.Data.Common;DbConnectionStringBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;get_ConnectionString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbConnectionStringBuilder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;DbDataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;get_DeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;get_InsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;get_SelectCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;get_UpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;false;GetFieldValueAsync<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;true;GetFieldValue<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;true;GetFieldValueAsync<>;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;true;GetProviderSpecificValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;true;GetProviderSpecificValues;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Common;DbDataReader;true;GetSchemaTableAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataReader;true;GetTextReader;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbDataRecord;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value", + "System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;DbEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;true;CommitAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;true;ReleaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;true;RollbackAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;true;RollbackAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Data.Common;DbTransaction;true;SaveAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatedEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;get_BaseCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;set_Command;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Common;RowUpdatingEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;ExecuteDbDataReader;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;ExecuteReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;ExecuteReader;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String,System.Data.Odbc.OdbcConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String,System.Data.Odbc.OdbcConnection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String,System.Data.Odbc.OdbcConnection,System.Data.Odbc.OdbcTransaction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String,System.Data.Odbc.OdbcConnection,System.Data.Odbc.OdbcTransaction);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;OdbcCommand;(System.String,System.Data.Odbc.OdbcConnection,System.Data.Odbc.OdbcTransaction);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_CommandText;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_DbConnection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_DbParameterCollection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_DbTransaction;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommand;false;set_CommandText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;set_Connection;(System.Data.Odbc.OdbcConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;set_DbConnection;(System.Data.Common.DbConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;set_DbTransaction;(System.Data.Common.DbTransaction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommand;false;set_Transaction;(System.Data.Odbc.OdbcTransaction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetDeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetDeleteCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetInsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetInsertCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetParameterName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetUpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;GetUpdateCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;OdbcCommandBuilder;(System.Data.Odbc.OdbcDataAdapter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;QuoteIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;QuoteIdentifier;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;QuoteIdentifier;(System.String,System.Data.Odbc.OdbcConnection);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;QuoteIdentifier;(System.String,System.Data.Odbc.OdbcConnection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;UnquoteIdentifier;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;UnquoteIdentifier;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;UnquoteIdentifier;(System.String,System.Data.Odbc.OdbcConnection);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;UnquoteIdentifier;(System.String,System.Data.Odbc.OdbcConnection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;get_DataAdapter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcCommandBuilder;false;set_DataAdapter;(System.Data.Odbc.OdbcDataAdapter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcConnection;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnection;false;CreateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnection;false;CreateDbCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnection;false;get_ConnectionString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;get_Driver;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;get_Dsn;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;set_Driver;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;set_Dsn;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;OdbcDataAdapter;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;OdbcDataAdapter;(System.String,System.Data.Odbc.OdbcConnection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;OdbcDataAdapter;(System.String,System.Data.Odbc.OdbcConnection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;OdbcDataAdapter;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;get_DeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;get_InsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;get_SelectCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;get_UpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_DeleteCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_DeleteCommand;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_InsertCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_InsertCommand;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_SelectCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_SelectCommand;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_UpdateCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataAdapter;false;set_UpdateCommand;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetDate;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetDateTime;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetGuid;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetSchemaTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetTime;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;GetValues;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcDataReader;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcError;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcError;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcError;false;get_SQLState;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcError;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcErrorCollection;false;CopyTo;(System.Data.Odbc.OdbcError[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Odbc;OdbcErrorCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcErrorCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data.Odbc;OdbcException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.Odbc;OdbcException;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcException;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcInfoMessageEventArgs;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcInfoMessageEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcInfoMessageEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object);;Argument[7];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object);;Argument[9];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object);;Argument[6];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object);;Argument[9];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;OdbcParameter;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;get_ParameterName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;get_SourceColumn;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameter;false;set_ParameterName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;set_SourceColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameter;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.Data.Odbc.OdbcParameter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.Data.Odbc.OdbcParameter);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.Data.Odbc.OdbcParameter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Data.Odbc.OdbcType,System.Int32,System.String);;Argument[3];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Add;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;AddRange;(System.Data.Odbc.OdbcParameter[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;AddWithValue;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;AddWithValue;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;AddWithValue;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;AddWithValue;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;CopyTo;(System.Data.Odbc.OdbcParameter[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;GetParameter;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;GetParameter;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Insert;(System.Int32,System.Data.Odbc.OdbcParameter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;Insert;(System.Int32,System.Data.Odbc.OdbcParameter);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;SetParameter;(System.Int32,System.Data.Common.DbParameter);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;SetParameter;(System.String,System.Data.Common.DbParameter);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;set_Item;(System.Int32,System.Data.Odbc.OdbcParameter);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data.Odbc;OdbcParameterCollection;false;set_Item;(System.String,System.Data.Odbc.OdbcParameter);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data.Odbc;OdbcRowUpdatedEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcRowUpdatingEventArgs;false;get_BaseCommand;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcRowUpdatingEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcRowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcRowUpdatingEventArgs;false;set_Command;(System.Data.Odbc.OdbcCommand);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.Odbc;OdbcTransaction;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.Odbc;OdbcTransaction;false;get_DbConnection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBinary;false;SqlBinary;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBinary;false;ToSqlGuid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.SqlTypes;SqlBinary;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;op_Addition;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBinary;false;op_Addition;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBytes;false;Read;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.Data.SqlTypes;SqlBytes;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBytes;false;Write;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlBytes;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.SqlTypes;SqlBytes;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBytes;false;get_Stream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlBytes;false;set_Stream;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlChars;false;SqlChars;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlChars;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.SqlTypes;SqlChars;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;Abs;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;AdjustScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;Ceiling;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;ConvertToPrecScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;Floor;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;Round;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;Truncate;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlDecimal;false;op_UnaryNegation;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlGuid;false;SqlGuid;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlGuid;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlGuid;false;ToSqlBinary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;GetNonUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;GetUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlString;false;SqlString;(System.Int32,System.Data.SqlTypes.SqlCompareOptions,System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlString;false;SqlString;(System.String,System.Int32,System.Data.SqlTypes.SqlCompareOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data.SqlTypes;SqlString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data.SqlTypes;SqlString;false;get_CompareInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;op_Addition;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlString;false;op_Addition;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint", + "System.Data.SqlTypes;SqlXml;false;SqlXml;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;Constraint;false;SetDataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;Constraint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;Constraint;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;Constraint;true;get_ConstraintName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;Constraint;true;get__DataSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;Constraint;true;set_ConstraintName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;ConstraintCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Data;DBConcurrencyException;false;DBConcurrencyException;(System.String,System.Exception,System.Data.DataRow[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Data;DBConcurrencyException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data;DBConcurrencyException;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DBConcurrencyException;false;set_Row;(System.Data.DataRow);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_Caption;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_ColumnName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumn;false;set_Caption;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_ColumnName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_DataType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_DefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_Expression;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumn;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataColumnChangeEventArgs;false;DataColumnChangeEventArgs;(System.Data.DataRow,System.Data.DataColumn,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataColumnChangeEventArgs;false;get_Column;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;Add;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;Add;(System.String,System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataColumnCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetDateTime;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetFieldValue<>;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetFieldValueAsync<>;(System.Data.Common.DbDataReader,System.String,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetGuid;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetProviderSpecificValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetString;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetTextReader;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataReaderExtensions;false;GetValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[5].Element;Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[6].Element;Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4].Element;Argument[Qualifier];generated:taint", + "System.Data;DataRelation;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_ChildColumns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_ChildKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_ParentColumns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_ParentKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;get_RelationName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelation;false;set_RelationName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelationCollection;false;Remove;(System.Data.DataRelation);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;DataRow;(System.Data.DataRowBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetChildRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetChildRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetParentRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;GetParentRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;SetNull;(System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRow;false;SetParentRow;(System.Data.DataRow,System.Data.DataRelation);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataRow;false;get_Item;(System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Item;(System.Data.DataColumn,System.Data.DataRowVersion);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Item;(System.Int32,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Item;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_ItemArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_RowError;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRow;false;set_Item;(System.Data.DataColumn,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRow;false;set_RowError;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataRowCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowExtensions;false;SetField<>;(System.Data.DataRow,System.Data.DataColumn,T);;Argument[1];Argument[0];generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;CreateChildView;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value", + "System.Data;DataRowView;false;get_DataView;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataRowView;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;CreateDataReader;(System.Data.DataTable[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Data;DataSet;false;DataSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;DataSet;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data;DataSet;false;get_DataSetName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_DefaultViewManager;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Relations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;get_Tables;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataSet;false;set_DataSetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataSet;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;DataTable;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;DataTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;DataTable;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;GetErrors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Data.LoadOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;NewRow;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;NewRowArray;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;NewRowFromBuilder;(System.Data.DataRowBuilder);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataTable;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_ChildRelations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_DefaultView;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_DisplayExpression;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_ParentRelations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Rows;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;get_TableName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTable;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;set_PrimaryKey;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTable;false;set_TableName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTableCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableExtensions;false;AsEnumerable;(System.Data.DataTable);;Argument[0];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Data;DataTableReader;false;GetDateTime;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;GetGuid;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;GetProviderSpecificValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;GetSchemaTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;GetString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;GetValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataTableReader;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;AddNew;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;ApplySort;(System.ComponentModel.PropertyDescriptor,System.ComponentModel.ListSortDirection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;FindRows;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;FindRows;(System.Object[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;GetItemProperties;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;ToTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;ToTable;(System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;ToTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;ToTable;(System.String,System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data;DataView;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataView;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataView;false;set_Table;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataViewManager;false;CreateDataView;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewManager;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewManager;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewManager;false;get_DataViewSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewManager;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data;DataViewManager;false;set_DataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataViewSetting;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSetting;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSetting;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSetting;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSetting;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataViewSetting;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;DataViewSettingCollection;false;get_Item;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSettingCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSettingCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;DataViewSettingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[0];Argument[1];generated:taint", + "System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data;DataViewSettingCollection;false;set_Item;(System.Int32,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint", + "System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Data;FillErrorEventArgs;false;get_DataTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;FillErrorEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;FillErrorEventArgs;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;FillErrorEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[4].Element;Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Data;ForeignKeyConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;ForeignKeyConstraint;false;get_RelatedColumns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;InternalDataCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Data;TypedTableBase<>;false;Cast<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Data;UniqueConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractClassAttribute;false;ContractClassAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractClassAttribute;false;get_TypeContainingContracts;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractClassForAttribute;false;ContractClassForAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractClassForAttribute;false;get_TypeContractsAreFor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractException;false;ContractException;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.String,System.Exception);;Argument[2];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractException;false;ContractException;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.String,System.Exception);;Argument[3];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Diagnostics.Contracts;ContractException;false;get_Condition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractException;false;get_Failure;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractException;false;get_UserMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[3];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Condition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_OriginalException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Setting;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;ContractPublicPropertyNameAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Metrics;Measurement<>;false;Measurement;(T,System.Collections.Generic.KeyValuePair[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayUnits;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayUnits;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics.Tracing;EventListener;false;DisableEvents;(System.Diagnostics.Tracing.EventSource);;Argument[Qualifier];Argument[0];generated:taint", + "System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel);;Argument[Qualifier];Argument[0];generated:taint", + "System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords);;Argument[Qualifier];Argument[0];generated:taint", + "System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords,System.Collections.Generic.IDictionary);;Argument[Qualifier];Argument[0];generated:taint", + "System.Diagnostics.Tracing;EventSource;false;EventSource;(System.Diagnostics.Tracing.EventSourceSettings,System.String[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String,System.Diagnostics.Tracing.EventManifestOptions);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;GetName;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;GetTrait;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;get_ConstructionException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_ActivityId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_EventName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_PayloadNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_RelatedActivityId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;AddBaggage;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;AddEvent;(System.Diagnostics.ActivityEvent);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;AddTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;AddTag;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;SetBaggage;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetEndTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetIdFormat;(System.Diagnostics.ActivityIdFormat);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetStartTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetStatus;(System.Diagnostics.ActivityStatusCode,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;Activity;false;SetStatus;(System.Diagnostics.ActivityStatusCode,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;SetTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;Start;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;Activity;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_Links;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_ParentId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_ParentSpanId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_RootId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_SpanId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_TagObjects;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_TraceId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;get_TraceStateString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Activity;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;Activity;false;set_TraceStateString;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ActivityCreationOptions<>;false;get_SamplingTags;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivitySource;false;CreateActivity;(System.String,System.Diagnostics.ActivityKind,System.String,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable,System.Diagnostics.ActivityIdFormat);;Argument[2];ReturnValue;generated:taint", + "System.Diagnostics;ActivitySource;false;StartActivity;(System.String,System.Diagnostics.ActivityKind,System.String,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable,System.DateTimeOffset);;Argument[2];ReturnValue;generated:taint", + "System.Diagnostics;ActivitySpanId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivitySpanId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivityTagsCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivityTagsCollection;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivityTraceId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ActivityTraceId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;CorrelationManager;false;get_LogicalOperationStack;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DataReceivedEventArgs;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DebuggerDisplayAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DebuggerDisplayAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;DebuggerTypeProxyAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DebuggerTypeProxyAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;DebuggerVisualizerAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DebuggerVisualizerAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;DefaultTraceListener;false;get_LogFileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DefaultTraceListener;false;set_LogFileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;DelimitedListTraceListener;false;get_Delimiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DelimitedListTraceListener;false;set_Delimiter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;DiagnosticSource;false;StartActivity;(System.Diagnostics.Activity,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;GetVersionInfo;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_Comments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_CompanyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_FileDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_FileVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_InternalName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_LegalCopyright;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_LegalTrademarks;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_OriginalFilename;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_PrivateBuild;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_ProductName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_ProductVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;FileVersionInfo;false;get_SpecialBuild;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;GetProcessById;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;GetProcesses;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;Start;(System.Diagnostics.ProcessStartInfo);;Argument[0];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_ExitTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_MachineName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_MainModule;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_MaxWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_MinWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_Modules;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_ProcessorAffinity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_StandardError;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_StandardInput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_StandardOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_StartInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_StartTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;get_Threads;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Process;false;set_ProcessorAffinity;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;Process;false;set_StartInfo;(System.Diagnostics.ProcessStartInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessModule;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessModule;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessModule;false;get_ModuleName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessModuleCollection;false;ProcessModuleCollection;(System.Diagnostics.ProcessModule[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessModuleCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_Environment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_EnvironmentVariables;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_Verb;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;get_WorkingDirectory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessStartInfo;false;set_Arguments;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;set_FileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;set_Verb;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessStartInfo;false;set_WorkingDirectory;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessThread;false;get_StartAddress;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;ProcessThreadCollection;false;Insert;(System.Int32,System.Diagnostics.ProcessThread);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessThreadCollection;false;ProcessThreadCollection;(System.Diagnostics.ProcessThread[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Diagnostics;ProcessThreadCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;SourceFilter;false;SourceFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SourceFilter;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;SourceFilter;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;StackFrame;false;GetFileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;StackFrame;false;GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;StackFrame;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;StackTrace;false;GetFrame;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;StackTrace;false;StackTrace;(System.Diagnostics.StackFrame);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;StackTrace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Diagnostics;Switch;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Switch;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Switch;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Switch;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;Switch;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchAttribute;false;get_SwitchName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;SwitchAttribute;false;get_SwitchType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;SwitchAttribute;false;set_SwitchName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchAttribute;false;set_SwitchType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchLevelAttribute;false;SwitchLevelAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;SwitchLevelAttribute;false;get_SwitchLevelType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;SwitchLevelAttribute;false;set_SwitchLevelType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TagList+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TagList;false;TagList;(System.ReadOnlySpan>);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TextWriterTraceListener;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TextWriterTraceListener;false;set_Writer;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TraceEventCache;false;get_Callstack;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceEventCache;false;get_DateTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceListener;false;TraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TraceListener;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceListener;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceListener;false;set_Filter;(System.Diagnostics.TraceFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TraceListener;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceListener;true;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TraceListenerCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Diagnostics;TraceSource;false;TraceSource;(System.String,System.Diagnostics.SourceLevels);;Argument[0];Argument[Qualifier];generated:taint", + "System.Diagnostics;TraceSource;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceSource;false;get_Listeners;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceSource;false;get_Switch;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Diagnostics;TraceSource;false;set_Switch;(System.Diagnostics.SourceSwitch);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirSyncRequestControl;false;DirSyncRequestControl;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirSyncRequestControl;false;set_Cookie;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.Byte[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Add;(System.Uri);;Argument[Qualifier];Argument[0];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;AddRange;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;CopyTo;(System.Object[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;DirectoryAttribute;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;DirectoryAttribute;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;DirectoryAttribute;(System.String,System.Object[]);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;GetValues;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.Byte[]);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.String);;Argument[Qualifier];Argument[1];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.Uri);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Insert;(System.Int32,System.Uri);;Argument[Qualifier];Argument[1];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Remove;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;Remove;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;set_Item;(System.Int32,System.Object);;Argument[Qualifier];Argument[1];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;Add;(System.DirectoryServices.Protocols.DirectoryAttribute);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryAttributeCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;CopyTo;(System.DirectoryServices.Protocols.DirectoryAttribute[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;Insert;(System.Int32,System.DirectoryServices.Protocols.DirectoryAttribute);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;Remove;(System.DirectoryServices.Protocols.DirectoryAttribute);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeCollection;false;set_Item;(System.Int32,System.DirectoryServices.Protocols.DirectoryAttribute);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;Add;(System.DirectoryServices.Protocols.DirectoryAttributeModification);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryAttributeModificationCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryAttributeModification[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;CopyTo;(System.DirectoryServices.Protocols.DirectoryAttributeModification[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;Insert;(System.Int32,System.DirectoryServices.Protocols.DirectoryAttributeModification);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;Remove;(System.DirectoryServices.Protocols.DirectoryAttributeModification);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryAttributeModificationCollection;false;set_Item;(System.Int32,System.DirectoryServices.Protocols.DirectoryAttributeModification);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryConnection;false;get_ClientCertificates;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryConnection;true;get_Directory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryConnection;true;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryConnection;true;set_Credential;(System.Net.NetworkCredential);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryConnection;true;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;Add;(System.DirectoryServices.Protocols.DirectoryControl);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryControlCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;AddRange;(System.DirectoryServices.Protocols.DirectoryControl[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;CopyTo;(System.DirectoryServices.Protocols.DirectoryControl[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;Insert;(System.Int32,System.DirectoryServices.Protocols.DirectoryControl);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;Remove;(System.DirectoryServices.Protocols.DirectoryControl);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryControlCollection;false;set_Item;(System.Int32,System.DirectoryServices.Protocols.DirectoryControl);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;DirectoryRequest;false;get_RequestId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;DirectoryRequest;false;set_RequestId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;ExtendedRequest;false;ExtendedRequest;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;ExtendedRequest;false;set_RequestValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;ExtendedResponse;false;set_ResponseValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;Bind;(System.Net.NetworkCredential);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;EndSendRequest;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;GetPartialResults;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;LdapConnection;(System.DirectoryServices.Protocols.LdapDirectoryIdentifier,System.Net.NetworkCredential,System.DirectoryServices.Protocols.AuthType);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;LdapConnection;(System.DirectoryServices.Protocols.LdapDirectoryIdentifier,System.Net.NetworkCredential,System.DirectoryServices.Protocols.AuthType);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;set_Credential;(System.Net.NetworkCredential);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapConnection;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapDirectoryIdentifier;false;LdapDirectoryIdentifier;(System.String[],System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;LdapSessionOptions;false;get_QueryClientCertificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapSessionOptions;false;get_ReferralCallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapSessionOptions;false;get_VerifyServerCertificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;LdapSessionOptions;false;set_ReferralCallback;(System.DirectoryServices.Protocols.ReferralCallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;PageResultRequestControl;false;PageResultRequestControl;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;PageResultRequestControl;false;set_Cookie;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;PartialResultsCollection;false;CopyTo;(System.Object[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;PartialResultsCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchRequest;false;SearchRequest;(System.String,System.String,System.DirectoryServices.Protocols.SearchScope,System.String[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SearchRequest;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchRequest;false;get_TimeLimit;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchRequest;false;set_Filter;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SearchRequest;false;set_TimeLimit;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SearchResponse;false;get_Entries;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchResponse;false;get_References;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchResponse;false;set_Entries;(System.DirectoryServices.Protocols.SearchResultEntryCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SearchResponse;false;set_References;(System.DirectoryServices.Protocols.SearchResultReferenceCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SearchResultAttributeCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchResultEntryCollection;false;CopyTo;(System.DirectoryServices.Protocols.SearchResultEntry[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;SearchResultEntryCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SearchResultReferenceCollection;false;CopyTo;(System.DirectoryServices.Protocols.SearchResultReference[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.DirectoryServices.Protocols;SearchResultReferenceCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;SortKey;(System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;SortKey;(System.String,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;get_MatchingRule;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SortKey;false;set_MatchingRule;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;SortRequestControl;false;get_SortKeys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;VerifyNameControl;false;VerifyNameControl;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;VerifyNameControl;false;get_ServerName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.DirectoryServices.Protocols;VerifyNameControl;false;set_ServerName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;VlvRequestControl;false;VlvRequestControl;(System.Int32,System.Int32,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;VlvRequestControl;false;VlvRequestControl;(System.Int32,System.Int32,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;VlvRequestControl;false;set_ContextId;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.DirectoryServices.Protocols;VlvRequestControl;false;set_Target;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Configuration;SystemDrawingSection;false;get_BitmapSuffix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Design;CategoryNameCollection;false;CategoryNameCollection;(System.Drawing.Design.CategoryNameCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Design;CategoryNameCollection;false;CategoryNameCollection;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Design;CategoryNameCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Drawing.Design;CategoryNameCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;BitmapData;false;get_Scan0;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;BitmapData;false;set_Scan0;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ColorMap;false;get_NewColor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ColorMap;false;get_OldColor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ColorMap;false;set_NewColor;(System.Drawing.Color);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ColorMap;false;set_OldColor;(System.Drawing.Color);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ColorPalette;false;get_Entries;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;Encoder;false;Encoder;(System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;Encoder;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Byte);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Byte,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Byte[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int16);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int16[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32,System.Drawing.Imaging.EncoderParameterValueType,System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32,System.Int32,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32[],System.Int32[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int32[],System.Int32[],System.Int32[],System.Int32[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int64[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.Int64[],System.Int64[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;EncoderParameter;(System.Drawing.Imaging.Encoder,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;get_Encoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;EncoderParameter;false;set_Encoder;(System.Drawing.Imaging.Encoder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;EncoderParameters;false;get_Param;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;EncoderParameters;false;set_Param;(System.Drawing.Imaging.EncoderParameter[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;FrameDimension;false;FrameDimension;(System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;FrameDimension;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;FrameDimension;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_Clsid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_CodecName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_DllName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_FilenameExtension;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_FormatDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_FormatID;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_MimeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_SignatureMasks;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;get_SignaturePatterns;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_Clsid;(System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_CodecName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_DllName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_FilenameExtension;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_FormatDescription;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_FormatID;(System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_MimeType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_SignatureMasks;(System.Byte[][]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageCodecInfo;false;set_SignaturePatterns;(System.Byte[][]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageFormat;false;ImageFormat;(System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Imaging;ImageFormat;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;ImageFormat;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Imaging;Metafile;false;GetHenhmetafile;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;InvalidPrinterException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Drawing.Printing;InvalidPrinterException;false;InvalidPrinterException;(System.Drawing.Printing.PrinterSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;MarginsConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing.Printing;MarginsConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;PageSettings;(System.Drawing.Printing.PrinterSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PageSettings;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_Margins;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_PaperSize;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_PaperSource;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_PrintableArea;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_PrinterResolution;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;get_PrinterSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PageSettings;false;set_Margins;(System.Drawing.Printing.Margins);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PageSettings;false;set_PaperSize;(System.Drawing.Printing.PaperSize);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PageSettings;false;set_PaperSource;(System.Drawing.Printing.PaperSource);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PageSettings;false;set_PrinterResolution;(System.Drawing.Printing.PrinterResolution);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PageSettings;false;set_PrinterSettings;(System.Drawing.Printing.PrinterSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PaperSize;false;PaperSize;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PaperSize;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PaperSize;false;get_PaperName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PaperSize;false;set_PaperName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PaperSource;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PaperSource;false;get_SourceName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PaperSource;false;set_SourceName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PreviewPageInfo;false;PreviewPageInfo;(System.Drawing.Image,System.Drawing.Size);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PreviewPageInfo;false;PreviewPageInfo;(System.Drawing.Image,System.Drawing.Size);;Argument[1];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PreviewPageInfo;false;get_Image;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PreviewPageInfo;false;get_PhysicalSize;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PreviewPrintController;false;GetPreviewPageInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;get_DefaultPageSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;get_DocumentName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;get_PrintController;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;get_PrinterSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintDocument;false;set_DefaultPageSettings;(System.Drawing.Printing.PageSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintDocument;false;set_DocumentName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintDocument;false;set_PrintController;(System.Drawing.Printing.PrintController);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintDocument;false;set_PrinterSettings;(System.Drawing.Printing.PrinterSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;PrintPageEventArgs;(System.Drawing.Graphics,System.Drawing.Rectangle,System.Drawing.Rectangle,System.Drawing.Printing.PageSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;PrintPageEventArgs;(System.Drawing.Graphics,System.Drawing.Rectangle,System.Drawing.Rectangle,System.Drawing.Printing.PageSettings);;Argument[1];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;PrintPageEventArgs;(System.Drawing.Graphics,System.Drawing.Rectangle,System.Drawing.Rectangle,System.Drawing.Printing.PageSettings);;Argument[2];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;PrintPageEventArgs;(System.Drawing.Graphics,System.Drawing.Rectangle,System.Drawing.Rectangle,System.Drawing.Printing.PageSettings);;Argument[3];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;get_Graphics;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;get_MarginBounds;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;get_PageBounds;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrintPageEventArgs;false;get_PageSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSizeCollection;false;Add;(System.Drawing.Printing.PaperSize);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSizeCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSizeCollection;false;PaperSizeCollection;(System.Drawing.Printing.PaperSize[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSizeCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSizeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Drawing.Printing;PrinterSettings+PaperSourceCollection;false;Add;(System.Drawing.Printing.PaperSource);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSourceCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSourceCollection;false;PaperSourceCollection;(System.Drawing.Printing.PaperSource[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSourceCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PaperSourceCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Drawing.Printing;PrinterSettings+PrinterResolutionCollection;false;Add;(System.Drawing.Printing.PrinterResolution);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PrinterResolutionCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PrinterResolutionCollection;false;PrinterResolutionCollection;(System.Drawing.Printing.PrinterResolution[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+PrinterResolutionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+PrinterResolutionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Drawing.Printing;PrinterSettings+StringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+StringCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+StringCollection;false;StringCollection;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings+StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings+StringCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Drawing.Printing;PrinterSettings;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_DefaultPageSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_PaperSizes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_PaperSources;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_PrintFileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_PrinterName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;get_PrinterResolutions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;PrinterSettings;false;set_PrintFileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;PrinterSettings;false;set_PrinterName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;QueryPageSettingsEventArgs;false;QueryPageSettingsEventArgs;(System.Drawing.Printing.PageSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;QueryPageSettingsEventArgs;false;get_PageSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing.Printing;QueryPageSettingsEventArgs;false;set_PageSettings;(System.Drawing.Printing.PageSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing.Printing;StandardPrintController;false;OnStartPage;(System.Drawing.Printing.PrintDocument,System.Drawing.Printing.PrintPageEventArgs);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;Bitmap;false;LockBits;(System.Drawing.Rectangle,System.Drawing.Imaging.ImageLockMode,System.Drawing.Imaging.PixelFormat,System.Drawing.Imaging.BitmapData);;Argument[3];ReturnValue;generated:taint", + "System.Drawing;Brush;false;SetNativeBrush;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;BufferedGraphics;false;get_Graphics;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;Allocate;(System.Drawing.Graphics,System.Drawing.Rectangle);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;Allocate;(System.Drawing.Graphics,System.Drawing.Rectangle);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;Allocate;(System.IntPtr,System.Drawing.Rectangle);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;Allocate;(System.IntPtr,System.Drawing.Rectangle);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;get_MaximumBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;BufferedGraphicsContext;false;set_MaximumBuffer;(System.Drawing.Size);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Color;false;FromName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;Color;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Color;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;ColorConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;ColorTranslator;false;FromHtml;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;ColorTranslator;false;ToHtml;(System.Drawing.Color);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;Font;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Font;false;Font;(System.Drawing.Font,System.Drawing.FontStyle);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Font;false;Font;(System.Drawing.FontFamily,System.Single,System.Drawing.FontStyle,System.Drawing.GraphicsUnit,System.Byte,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Font;false;Font;(System.String,System.Single,System.Drawing.FontStyle,System.Drawing.GraphicsUnit,System.Byte,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Font;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Drawing;Font;false;ToHfont;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Font;false;get_FontFamily;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Font;false;get_OriginalFontName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Font;false;get_SystemFontName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;FontConverter+FontNameConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;FontConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;Graphics;false;FromImage;(System.Drawing.Image);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;Graphics;false;GetHdc;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Icon;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Icon;false;FromHandle;(System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;Icon;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Drawing;Icon;false;Icon;(System.Drawing.Icon,System.Drawing.Size);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Icon;false;Icon;(System.Drawing.Icon,System.Drawing.Size);;Argument[1];Argument[Qualifier];generated:taint", + "System.Drawing;Icon;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Icon;false;get_Size;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Image;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Image;false;set_Tag;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;ImageFormatConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;Pen;false;Pen;(System.Drawing.Color,System.Single);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;Pen;false;get_Color;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Pen;false;get_CustomEndCap;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;Pen;false;set_Color;(System.Drawing.Color);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;Rectangle;false;Inflate;(System.Drawing.Rectangle,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;RectangleF;false;Inflate;(System.Drawing.RectangleF,System.Single,System.Single);;Argument[0];ReturnValue;generated:taint", + "System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Drawing;SolidBrush;false;SolidBrush;(System.Drawing.Color);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;SolidBrush;false;get_Color;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;SolidBrush;false;set_Color;(System.Drawing.Color);;Argument[0];Argument[Qualifier];generated:taint", + "System.Drawing;ToolboxBitmapAttribute;false;GetImage;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;ToolboxBitmapAttribute;false;GetImage;(System.Object,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;ToolboxBitmapAttribute;false;GetImage;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;ToolboxBitmapAttribute;false;GetImage;(System.Type,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Drawing;ToolboxBitmapAttribute;false;GetImage;(System.Type,System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;GetExpressionRestriction;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Dynamic;BindingRestrictions;false;Merge;(System.Dynamic.BindingRestrictions);;Argument[Qualifier];ReturnValue;generated:value", + "System.Dynamic;BindingRestrictions;false;ToExpression;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Dynamic;DynamicMetaObject;false;Create;(System.Object,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Dynamic;DynamicMetaObject;false;DynamicMetaObject;(System.Linq.Expressions.Expression,System.Dynamic.BindingRestrictions,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.Dynamic;DynamicMetaObject;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Dynamic;ExpandoObject;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[2];Argument[Qualifier];generated:taint", + "System.Formats.Asn1;AsnReader;false;PeekContentBytes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;PeekEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadEnumeratedBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadIntegerBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Boolean,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;TryReadPrimitiveBitString;(System.Int32,System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;TryReadPrimitiveCharacterStringBytes;(System.Formats.Asn1.Asn1Tag,System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnReader;false;TryReadPrimitiveOctetString;(System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnWriter;false;PushOctetString;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnWriter;false;PushSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Asn1;AsnWriter;false;PushSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Cbor;CborReader;false;CborReader;(System.ReadOnlyMemory,System.Formats.Cbor.CborConformanceMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Formats.Cbor;CborReader;false;ReadDefiniteLengthByteString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Cbor;CborReader;false;ReadDefiniteLengthTextStringBytes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Formats.Cbor;CborReader;false;ReadEncodedValue;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;Calendar;false;ReadOnly;(System.Globalization.Calendar);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CompareInfo;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;CultureInfo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;CultureInfo;false;GetConsoleFallbackUICulture;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetCultureInfo;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetCultureInfoByIetfLanguageTag;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;ReadOnly;(System.Globalization.CultureInfo);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_EnglishName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_NativeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_NumberFormat;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;get_TextInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureInfo;false;set_DateTimeFormat;(System.Globalization.DateTimeFormatInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;CultureInfo;false;set_NumberFormat;(System.Globalization.NumberFormatInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Globalization;CultureNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Globalization;CultureNotFoundException;false;get_InvalidCultureId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureNotFoundException;false;get_InvalidCultureName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;CultureNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetAllDateTimePatterns;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;GetShortestDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;ReadOnly;(System.Globalization.DateTimeFormatInfo);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;SetAllDateTimePatterns;(System.String[],System.Char);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_AMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_DateSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_MonthDayPattern;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_PMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;get_TimeSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_AMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_Calendar;(System.Globalization.Calendar);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_DateSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_DayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_FullDateTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_LongDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_LongTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_MonthDayPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_MonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_MonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_PMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_ShortDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_ShortTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_ShortestDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_TimeSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DateTimeFormatInfo;false;set_YearMonthPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint", + "System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint", + "System.Globalization;DaylightTime;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DaylightTime;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;DaylightTime;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;GlobalizationExtensions;false;GetStringComparer;(System.Globalization.CompareInfo,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetAscii;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetUnicode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;ReadOnly;(System.Globalization.NumberFormatInfo);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_CurrencyDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_CurrencyGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_CurrencySymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_NaNSymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_NegativeInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_NegativeSign;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_NumberDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_NumberGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PerMilleSymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PercentDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PercentGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PercentSymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PositiveInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;get_PositiveSign;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;NumberFormatInfo;false;set_CurrencyDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_CurrencyGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_CurrencySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NaNSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NativeDigits;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NegativeInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NegativeSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NumberDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_NumberGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PerMilleSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PercentDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PercentGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PercentSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PositiveInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;NumberFormatInfo;false;set_PositiveSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;RegionInfo;false;RegionInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;RegionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;RegionInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;RegionInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;SortKey;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;SortKey;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;SortVersion;false;SortVersion;(System.Int32,System.Guid);;Argument[1];Argument[Qualifier];generated:taint", + "System.Globalization;SortVersion;false;get_SortId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;GetNextTextElement;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;GetNextTextElement;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;StringInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;get_String;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;StringInfo;false;set_String;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Globalization;TextElementEnumerator;false;GetTextElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;TextElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;ReadOnly;(System.Globalization.TextInfo);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;ToLower;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;ToTitleCase;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;ToUpper;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Globalization;TextInfo;false;set_ListSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;BrotliStream;false;BrotliStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;BrotliStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;BrotliStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;DeflateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;DeflateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;DeflateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;DeflateStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;GZipStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;GZipStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;GZipStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;GZipStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZLibException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.IO.Compression;ZLibException;false;ZLibException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZLibException;false;ZLibException;(System.String,System.String,System.Int32,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZLibException;false;ZLibException;(System.String,System.String,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZLibStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;ZLibStream;false;ZLibStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZLibStream;false;ZLibStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZLibStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZipArchive;false;get_Entries;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;Open;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;get_Archive;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;get_LastWriteTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;set_FullName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZipArchiveEntry;false;set_LastWriteTime;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Compression;ZipFile;false;Open;(System.String,System.IO.Compression.ZipArchiveMode,System.Text.Encoding);;Argument[2];ReturnValue;generated:taint", + "System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint", + "System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[2];ReturnValue;generated:taint", + "System.IO.Enumeration;FileSystemEntry;false;ToFileSystemInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Enumeration;FileSystemEntry;false;ToSpecifiedFullPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Enumeration;FileSystemEntry;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Enumeration;FileSystemEnumerator<>;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Enumeration;FileSystemName;false;TranslateWin32Expression;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorage;false;get_ApplicationIdentity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorage;false;get_AssemblyIdentity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorage;false;get_DomainIdentity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.MemoryMappedFiles;MemoryMappedFile;false;CreateFromFile;(System.IO.FileStream,System.String,System.Int64,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IO.HandleInheritability,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.IO.MemoryMappedFiles;MemoryMappedFile;false;get_SafeMemoryMappedFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.MemoryMappedFiles;MemoryMappedViewAccessor;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.MemoryMappedFiles;MemoryMappedViewStream;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;Create;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;Create;(System.Uri,System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;Create;(System.Uri,System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;Create;(System.Uri,System.Uri,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;GetNormalizedPartUri;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;GetPackageUri;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;GetPartUri;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackUriHelper;false;GetRelativeUri;(System.Uri,System.Uri);;Argument[1];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreatePart;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreatePart;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreatePart;(System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreatePart;(System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;GetPart;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;GetParts;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;GetRelationships;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;GetRelationshipsByType;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;GetRelationshipsByType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;Open;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;Open;(System.IO.Stream,System.IO.FileMode);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;Open;(System.IO.Stream,System.IO.FileMode,System.IO.FileAccess);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;Package;false;get_PackageProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;CreateRelationship;(System.Uri,System.IO.Packaging.TargetMode,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetRelationships;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetRelationshipsByType;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetRelationshipsByType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetStream;(System.IO.FileMode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;GetStream;(System.IO.FileMode,System.IO.FileAccess);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;PackagePart;(System.IO.Packaging.Package,System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Packaging;PackagePart;false;PackagePart;(System.IO.Packaging.Package,System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO.Packaging;PackagePart;false;PackagePart;(System.IO.Packaging.Package,System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO.Packaging;PackagePart;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;get_Package;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackagePart;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationship;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationship;false;get_Package;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationship;false;get_RelationshipType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationship;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationship;false;get_TargetUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;PackageRelationshipSelector;(System.Uri,System.IO.Packaging.PackageRelationshipSelectorType,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;PackageRelationshipSelector;(System.Uri,System.IO.Packaging.PackageRelationshipSelectorType,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;Select;(System.IO.Packaging.Package);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;Select;(System.IO.Packaging.Package);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;get_SelectionCriteria;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;PackageRelationshipSelector;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;ZipPackage;false;CreatePartCore;(System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[0];ReturnValue;generated:taint", + "System.IO.Packaging;ZipPackage;false;CreatePartCore;(System.Uri,System.String,System.IO.Packaging.CompressionOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Packaging;ZipPackagePart;false;GetStreamCore;(System.IO.FileMode,System.IO.FileAccess);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;Pipe;false;Pipe;(System.IO.Pipelines.PipeOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Pipelines;Pipe;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;Pipe;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;false;Create;(System.Buffers.ReadOnlySequence);;Argument[0];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;false;Create;(System.IO.Stream,System.IO.Pipelines.StreamPipeReaderOptions);;Argument[1];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;false;ReadAtLeastAsync;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;true;AsStream;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;true;CopyToAsync;(System.IO.Pipelines.PipeWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeReader;true;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeWriter;true;AsStream;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;PipeWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;ReadResult;false;ReadResult;(System.Buffers.ReadOnlySequence,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Pipelines;ReadResult;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipelines;StreamPipeExtensions;false;CopyToAsync;(System.IO.Stream,System.IO.Pipelines.PipeWriter,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO.Pipes;AnonymousPipeClientStream;false;AnonymousPipeClientStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO.Pipes;AnonymousPipeServerStream;false;get_ClientSafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.String,System.String,System.IO.Pipes.PipeDirection,System.IO.Pipes.PipeOptions,System.Security.Principal.TokenImpersonationLevel,System.IO.HandleInheritability);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO.Pipes;NamedPipeServerStream;false;NamedPipeServerStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO.Pipes;NamedPipeServerStream;false;WaitForConnectionAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO.Pipes;PipeStream;false;InitializeHandle;(Microsoft.Win32.SafeHandles.SafePipeHandle,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Pipes;PipeStream;false;get_SafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.IO.Ports;SerialPort;false;ReadExisting;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;ReadLine;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;ReadTo;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;SerialPort;(System.String,System.Int32,System.IO.Ports.Parity,System.Int32,System.IO.Ports.StopBits);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;Write;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;Write;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;get_PortName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO.Ports;SerialPort;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO.Ports;SerialPort;false;set_PortName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;BinaryReader;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.IO;BinaryReader;false;ReadBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;BinaryReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;BinaryReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;BinaryWriter;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;BinaryWriter;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;BinaryWriter;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;BinaryWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;BufferedStream;false;BufferedStream;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;BufferedStream;false;get_UnderlyingStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;Directory;false;CreateDirectory;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;Directory;false;CreateSymbolicLink;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;Directory;false;GetParent;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;DirectoryInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;DirectoryInfo;false;EnumerateDirectories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFiles;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFiles;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DirectoryInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;DirectoryInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DriveInfo;false;DriveInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;DriveInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DriveInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DriveInfo;false;get_RootDirectory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;DriveInfo;false;get_VolumeLabel;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;ErrorEventArgs;false;ErrorEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;ErrorEventArgs;false;GetException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO;File;false;CreateSymbolicLink;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;File;false;OpenHandle;(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,System.Int64);;Argument[0];ReturnValue;generated:taint", + "System.IO;File;false;ReadLines;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint", + "System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint", + "System.IO;File;false;WriteAllBytesAsync;(System.String,System.Byte[],System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.IO;FileFormatException;false;FileFormatException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileFormatException;false;FileFormatException;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileFormatException;false;FileFormatException;(System.Uri,System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileFormatException;false;FileFormatException;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileFormatException;false;FileFormatException;(System.Uri,System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.IO;FileFormatException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileInfo;false;CopyTo;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;FileInfo;false;CopyTo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.IO;FileInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileInfo;false;MoveTo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileInfo;false;get_Directory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileInfo;false;get_DirectoryName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.IO;FileLoadException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.IO;FileNotFoundException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;FileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;FileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileStream;false;get_SafeFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;FileSystemEventArgs;false;get_FullPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemInfo;false;get_Extension;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemInfo;false;get_LinkTarget;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemInfo;true;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemInfo;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;FileSystemWatcher;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemWatcher;false;get_Filters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemWatcher;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemWatcher;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;FileSystemWatcher;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileSystemWatcher;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;FileSystemWatcher;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;MemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;MemoryStream;false;GetBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;MemoryStream;false;TryGetBuffer;(System.ArraySegment);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;MemoryStream;false;WriteTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint", + "System.IO;Path;false;ChangeExtension;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint", + "System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3];ReturnValue;generated:taint", + "System.IO;Path;false;TrimEndingDirectorySeparator;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System.IO;Path;false;TrimEndingDirectorySeparator;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;ReadAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;ReadAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[1].Element;ReturnValue;generated:taint", + "System.IO;RandomAccess;false;ReadAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;ReadAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Memory,System.Int64,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;ReadAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Memory,System.Int64,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[1].Element;ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.Collections.Generic.IReadOnlyList>,System.Int64,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlyMemory,System.Int64,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlyMemory,System.Int64,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;RandomAccess;false;WriteAsync;(Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlyMemory,System.Int64,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO;RenamedEventArgs;false;get_OldFullPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;RenamedEventArgs;false;get_OldName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;Stream;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;Stream;false;Synchronized;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.IO;Stream;true;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;Stream;true;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;Stream;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;StreamReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamReader;false;get_CurrentEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StreamWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StringWriter;false;GetStringBuilder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StringWriter;false;StringWriter;(System.Text.StringBuilder,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;StringWriter;false;Write;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;Write;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;Write;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StringWriter;false;WriteAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StringWriter;false;WriteLine;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextReader;false;Synchronized;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;false;Synchronized;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;false;TextWriter;(System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;Write;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLine;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.IO;TextWriter;true;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryAccessor;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.IO;UnmanagedMemoryStream;false;Initialize;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint", + "System.IO;UnmanagedMemoryStream;false;get_PositionPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions.Interpreter;LightLambda;false;Run;(System.Object[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;BinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;BinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BinaryExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;BinaryExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;BinaryExpression;false;get_Conversion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BinaryExpression;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BlockExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;BlockExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BlockExpression;false;Update;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;BlockExpression;false;get_Expressions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BlockExpression;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;BlockExpression;false;get_Variables;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;CatchBlock;false;Update;(System.Linq.Expressions.ParameterExpression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;ConditionalExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;ConditionalExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;ConditionalExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;ConditionalExpression;false;get_IfFalse;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;ConstantExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;DebugInfoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;DefaultExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Rewrite;(System.Linq.Expressions.Expression[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;DynamicExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;DynamicExpressionVisitor;false;VisitDynamic;(System.Linq.Expressions.DynamicExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ElementInit;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ArrayAccess;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ArrayIndex;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MemberInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Coalesce;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GetActionType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GetFuncType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;IfThenElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Invoke;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeIndex;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MakeMemberAccess;(System.Linq.Expressions.Expression,System.Reflection.MemberInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Reflection.MemberInfo[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ReduceAndCheck;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ReduceExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;TryGetActionType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;false;TryGetFuncType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression;true;Reduce;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression<>;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;Expression<>;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;Expression<>;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitCatchBlock;(System.Linq.Expressions.CatchBlock);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitConstant;(System.Linq.Expressions.ConstantExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitDebugInfo;(System.Linq.Expressions.DebugInfoExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitDefault;(System.Linq.Expressions.DefaultExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitDynamic;(System.Linq.Expressions.DynamicExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitElementInit;(System.Linq.Expressions.ElementInit);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitGoto;(System.Linq.Expressions.GotoExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitIndex;(System.Linq.Expressions.IndexExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitInvocation;(System.Linq.Expressions.InvocationExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitLabel;(System.Linq.Expressions.LabelExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitLabelTarget;(System.Linq.Expressions.LabelTarget);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitListInit;(System.Linq.Expressions.ListInitExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitLoop;(System.Linq.Expressions.LoopExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMember;(System.Linq.Expressions.MemberExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberInit;(System.Linq.Expressions.MemberInitExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberListBinding;(System.Linq.Expressions.MemberListBinding);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMemberMemberBinding;(System.Linq.Expressions.MemberMemberBinding);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitNew;(System.Linq.Expressions.NewExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitNewArray;(System.Linq.Expressions.NewArrayExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitParameter;(System.Linq.Expressions.ParameterExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitRuntimeVariables;(System.Linq.Expressions.RuntimeVariablesExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitSwitch;(System.Linq.Expressions.SwitchExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitSwitchCase;(System.Linq.Expressions.SwitchCase);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitTry;(System.Linq.Expressions.TryExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitTypeBinary;(System.Linq.Expressions.TypeBinaryExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;ExpressionVisitor;true;VisitUnary;(System.Linq.Expressions.UnaryExpression);;Argument[0];ReturnValue;generated:taint", + "System.Linq.Expressions;GotoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;GotoExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;IndexExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;IndexExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;IndexExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;IndexExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;InvocationExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;InvocationExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;LabelExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;LabelExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;LambdaExpression;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;LambdaExpression;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;ListInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;ListInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;LoopExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;LoopExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MemberAssignment;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MemberAssignment;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MemberExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;MemberExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MemberExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MemberExpression;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MemberInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MemberInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MemberListBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MemberMemberBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MethodCallExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;MethodCallExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MethodCallExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;MethodCallExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;MethodCallExpression;false;get_Object;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;NewArrayExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;NewArrayExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;NewExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;NewExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;NewExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;NewExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;ParameterExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint", + "System.Linq.Expressions;ParameterExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;RuntimeVariablesExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;RuntimeVariablesExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;SwitchCase;false;Update;(System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;SwitchExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;SwitchExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;TryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;TryExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;TypeBinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;TypeBinaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;UnaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq.Expressions;UnaryExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq.Expressions;UnaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq;Enumerable;false;Append<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Index);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Index);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1];generated:taint", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1];generated:taint", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;Prepend<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint", + "System.Linq;Enumerable;false;SkipLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Range);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Enumerable;false;TakeLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;EnumerableExecutor<>;false;EnumerableExecutor;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq;EnumerableQuery<>;false;CreateQuery<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint", + "System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint", + "System.Linq;EnumerableQuery<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq;EnumerableQuery<>;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq;EnumerableQuery<>;false;get_Provider;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Linq;Grouping<,>;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;ElementAt<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;ElementAtOrDefault<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ImmutableArrayExtensions;false;Single<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;Lookup<,>;false;get_Item;(TKey);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsOrdered;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsOrdered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsParallel;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Concurrent.Partitioner);;Argument[0];ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsSequential<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;AsUnordered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;WithCancellation<>;(System.Linq.ParallelQuery,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;WithDegreeOfParallelism<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;WithExecutionMode<>;(System.Linq.ParallelQuery,System.Linq.ParallelExecutionMode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Linq;ParallelEnumerable;false;WithMergeOptions<>;(System.Linq.ParallelQuery,System.Linq.ParallelMergeOptions);;Argument[0].Element;ReturnValue;generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan,System.DateTime);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;get_CacheSyncDate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;get_MaxStale;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Cache;HttpRequestCachePolicy;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Parameter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxStaleLimit;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;get_SharedMaxAge;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxStaleLimit;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;set_MinFresh;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;CacheControlHeaderValue;false;set_SharedMaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.Net.Http.Headers.ContentDispositionHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileNameStar;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentDispositionHeaderValue;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Length;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ContentRangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;EntityTagHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;EntityTagHeaderValue;false;EntityTagHeaderValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;EntityTagHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;EntityTagHeaderValue;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HeaderStringValues+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HeaderStringValues;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HeaderStringValues;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeaders;false;get_NonValidated;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;TryGetValue;(System.String,System.Net.Http.Headers.HeaderStringValues);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;TryGetValues;(System.String,System.Net.Http.Headers.HeaderStringValues);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;get_Item;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpHeadersNonValidated;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpResponseHeaders;false;get_AcceptRanges;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpResponseHeaders;false;get_ProxyAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpResponseHeaders;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpResponseHeaders;false;get_Vary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;HttpResponseHeaders;false;get_WwwAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;MediaTypeHeaderValue;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;MediaTypeWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.Net.Http.Headers.NameValueHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;NameValueHeaderValue;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;NameValueWithParametersHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductHeaderValue;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.Net.Http.Headers.ProductHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.ProductInfoHeaderValue);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Product;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.Net.Http.Headers.EntityTagHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeConditionHeaderValue;false;get_EntityTag;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RangeItemHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RangeItemHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RangeItemHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RetryConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Quality;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;TransferCodingHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;TransferCodingWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;ViaHeaderValue;false;get_ReceivedBy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;get_Agent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Headers;WarningHeaderValue;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http.Json;JsonContent;false;Create;(System.Object,System.Type,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[3];ReturnValue;generated:taint", + "System.Net.Http.Json;JsonContent;false;Create<>;(T,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[2];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Http;ByteArrayContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;DelegatingHandler;false;DelegatingHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;DelegatingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Http;DelegatingHandler;false;get_InnerHandler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;DelegatingHandler;false;set_InnerHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpClient;false;get_DefaultRequestVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpClient;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpClient;false;set_BaseAddress;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpClient;false;set_DefaultRequestVersion;(System.Version);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpClient;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpClientHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;false;CopyTo;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;false;ReadAsStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;false;ReadAsStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;false;ReadAsStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;false;ReadAsStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;true;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;true;CreateContentReadStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpMessageInvoker;false;HttpMessageInvoker;(System.Net.Http.HttpMessageHandler,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpMessageInvoker;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Http;HttpMethod;false;HttpMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpMethod;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpMethod;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpRequestMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpRequestMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpRequestMessage;false;set_Method;(System.Net.Http.HttpMethod);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpRequestMessage;false;set_RequestUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpRequestMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpResponseMessage;false;EnsureSuccessStatusCode;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Net.Http;HttpResponseMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpResponseMessage;false;get_ReasonPhrase;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpResponseMessage;false;get_RequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpResponseMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;HttpResponseMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpResponseMessage;false;set_ReasonPhrase;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpResponseMessage;false;set_RequestMessage;(System.Net.Http.HttpRequestMessage);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;HttpResponseMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;MessageProcessingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Http;MultipartContent;false;MultipartContent;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Http;MultipartContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;MultipartFormDataContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;ReadOnlyMemoryContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;ReadOnlyMemoryContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;ReadOnlyMemoryContent;false;ReadOnlyMemoryContent;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpConnectionContext;false;get_DnsEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpConnectionContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_ActivityHeadersPropagator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_ConnectCallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_ConnectTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_DefaultProxyCredentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_Expect100ContinueTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingDelay;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_PlaintextStreamFilter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionIdleTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionLifetime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_RequestHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_ResponseDrainTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_ResponseHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;get_SslOptions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_ActivityHeadersPropagator;(System.Diagnostics.DistributedContextPropagator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_ConnectTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_DefaultProxyCredentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_Expect100ContinueTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingDelay;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionIdleTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionLifetime;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_ResponseDrainTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpHandler;false;set_SslOptions;(System.Net.Security.SslClientAuthenticationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_NegotiatedHttpVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_PlaintextStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;AlternateView;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;AlternateViewCollection;false;InsertItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;AlternateViewCollection;false;SetItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;Attachment;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;get_ContentDisposition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;get_NameEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;Attachment;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;Attachment;false;set_NameEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentBase;false;get_ContentId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;AttachmentBase;false;get_ContentStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;AttachmentBase;false;set_ContentType;(System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentCollection;false;InsertItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;AttachmentCollection;false;SetItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net.Mail;LinkedResource;false;get_ContentLink;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;LinkedResourceCollection;false;InsertItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;LinkedResourceCollection;false;SetItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[2];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailAddress;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailAddressCollection;false;InsertItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailAddressCollection;false;SetItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailAddressCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;MailMessage;(System.Net.Mail.MailAddress,System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_BodyEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_HeadersEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_ReplyTo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_Sender;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;get_SubjectEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;MailMessage;false;set_Body;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_BodyEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_From;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_HeadersEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_ReplyTo;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_Sender;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_Subject;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;MailMessage;false;set_SubjectEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;Send;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;Send;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendAsync;(System.Net.Mail.MailMessage,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendAsync;(System.String,System.String,System.String,System.String,System.Object);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[4];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;SmtpClient;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;SmtpClient;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;get_PickupDirectoryLocation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;get_TargetName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;SmtpClient;false;set_Credentials;(System.Net.ICredentialsByHost);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;set_PickupDirectoryLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpClient;false;set_TargetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientException;false;get_FailedRecipient;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mail;SmtpFailedRecipientsException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Net.Mail.SmtpFailedRecipientException[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Net.Mail;SmtpFailedRecipientsException;false;get_InnerExceptions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentDisposition;false;ContentDisposition;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mime;ContentDisposition;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentDisposition;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentDisposition;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mime;ContentType;false;ContentType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Mime;ContentType;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;get_Boundary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Mime;ContentType;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.NetworkInformation;IPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.NetworkInformation;NetworkInformationPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Net.NetworkInformation;PhysicalAddress;false;PhysicalAddress;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicConnection;false;OpenBidirectionalStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicConnection;false;OpenUnidirectionalStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicConnection;false;get_LocalEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicConnection;false;get_NegotiatedApplicationProtocol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicConnection;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Quic;QuicListener;false;QuicListener;(System.Net.Quic.Implementations.QuicImplementationProvider,System.Net.Quic.QuicListenerOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Quic;QuicListener;false;get_ListenEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;AuthenticatedStream;false;AuthenticatedStream;(System.IO.Stream,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Security;AuthenticatedStream;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;AuthenticatedStream;false;get_InnerStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Security;NegotiateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;NegotiateStream;false;get_RemoteIdentity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslApplicationProtocol;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslApplicationProtocol;false;get_Protocol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslCertificateTrust;false;CreateForX509Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Net.Security;SslCertificateTrust;false;CreateForX509Store;(System.Security.Cryptography.X509Certificates.X509Store,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Security;SslStream;false;get_LocalCertificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;get_NegotiatedApplicationProtocol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;get_RemoteCertificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslStream;false;get_TransportContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Security;SslStreamCertificateContext;false;Create;(System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;SslStreamCertificateContext;false;Create;(System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean,System.Net.Security.SslCertificateTrust);;Argument[0];ReturnValue;generated:taint", + "System.Net.Security;SslStreamCertificateContext;false;Create;(System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean,System.Net.Security.SslCertificateTrust);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;IPPacketInformation;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;IPv6MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;IPv6MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;MulticastOption;false;get_LocalAddress;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;MulticastOption;false;set_LocalAddress;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;NetworkStream;false;NetworkStream;(System.Net.Sockets.Socket,System.IO.FileAccess,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;NetworkStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;NetworkStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;NetworkStream;false;get_Socket;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SafeSocketHandle;false;SafeSocketHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;Accept;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.Socket);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.Socket,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.Socket,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.Socket,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;AcceptAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;Bind;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;Connect;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress[],System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;ConnectAsync;(System.String,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;DisconnectAsync;(System.Boolean,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;DisconnectAsync;(System.Boolean,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;DisconnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;EndAccept;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Span,System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Span,System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Span,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFrom;(System.Span,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.ArraySegment,System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Span,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Span,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.ArraySegment,System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Memory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;SendAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;SendAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendFileAsync;(System.String,System.ReadOnlyMemory,System.ReadOnlyMemory,System.Net.Sockets.TransmitFileOptions,System.Threading.CancellationToken);;Argument[4];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendFileAsync;(System.String,System.ReadOnlyMemory,System.ReadOnlyMemory,System.Net.Sockets.TransmitFileOptions,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendFileAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendFileAsync;(System.String,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendPacketsAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.ReadOnlySpan,System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendTo;(System.ReadOnlySpan,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ArraySegment,System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;SendToAsync;(System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;get_LocalEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;Socket;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Memory);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_BufferList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectByNameError;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectSocket;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_MemoryBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_ReceiveMessageFromPacketInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_SendPacketsElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;get_UserToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;set_AcceptSocket;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;set_BufferList;(System.Collections.Generic.IList>);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;set_RemoteEndPoint;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;set_SendPacketsElements;(System.Net.Sockets.SendPacketsElement[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketAsyncEventArgs;false;set_UserToken;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;SocketException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;AcceptAsync;(System.Net.Sockets.Socket,System.Net.Sockets.Socket);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint);;Argument[1];Argument[0];generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32);;Argument[1];Argument[0];generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.String,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ReceiveFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;ReceiveMessageFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;SocketTaskExtensions;false;SendToAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[0];generated:taint", + "System.Net.Sockets;TcpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpClient;false;ConnectAsync;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpClient;false;ConnectAsync;(System.Net.IPEndPoint,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpClient;false;GetStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpClient;false;TcpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpListener;false;AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;AcceptSocketAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;AcceptSocketAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;AcceptTcpClient;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;EndAcceptSocket;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;EndAcceptTcpClient;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;TcpListener;false;get_LocalEndpoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;TcpListener;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;EndReceive;(System.IAsyncResult,System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;Receive;(System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;Send;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;Send;(System.ReadOnlySpan,System.Net.IPEndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Net.IPEndPoint,System.Threading.CancellationToken);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Net.IPEndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Net.IPEndPoint,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Net.IPEndPoint,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.String,System.Int32,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.String,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;SendAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;UdpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net.Sockets;UdpReceiveResult;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UdpReceiveResult;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.Sockets;UnixDomainSocketEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;SetBuffer;(System.Int32,System.Int32,System.ArraySegment);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;get_KeepAliveInterval;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;get_RemoteCertificateValidationCallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;set_Cookies;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;set_KeepAliveInterval;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;ClientWebSocketOptions;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_CookieCollection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Origin;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketProtocols;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;HttpListenerWebSocketContext;false;get_WebSocket;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[0];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[1];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[2];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocket;true;SendAsync;(System.ReadOnlyMemory,System.Net.WebSockets.WebSocketMessageType,System.Net.WebSockets.WebSocketMessageFlags,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocketCreationOptions;false;get_KeepAliveInterval;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocketCreationOptions;false;get_SubProtocol;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net.WebSockets;WebSocketCreationOptions;false;set_KeepAliveInterval;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;WebSocketCreationOptions;false;set_SubProtocol;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net.WebSockets;WebSocketException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net;Authorization;false;get_ProtectionRealm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Authorization;false;set_ProtectionRealm;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;Cookie;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;Cookie;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_CommentUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Expires;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_Port;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;get_TimeStamp;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Cookie;false;set_Comment;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_CommentUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Expires;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Port;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;Cookie;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;CookieCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;CookieCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;CookieCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Net;CookieException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net;CredentialCache;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;Dns;false;EndGetHostAddresses;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;Dns;false;EndGetHostByName;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;Dns;false;EndGetHostEntry;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;Dns;false;EndResolve;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;DnsEndPoint;false;DnsEndPoint;(System.String,System.Int32,System.Net.Sockets.AddressFamily);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;DnsEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;DnsEndPoint;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;DownloadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;DownloadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;FileWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FileWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_ClientCertificates;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_ConnectionGroupName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_RenameTo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;FtpWebRequest;false;set_ConnectionGroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;FtpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;FtpWebRequest;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;FtpWebRequest;false;set_RenameTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;FtpWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_BannerMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_ExitMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_LastModified;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;FtpWebResponse;false;get_WelcomeMessage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_AuthenticationSchemeSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_DefaultServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_ExtendedProtectionPolicy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_ExtendedProtectionSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_Prefixes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_Realm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;get_TimeoutManager;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListener;false;set_ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListener;false;set_Realm;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListenerContext;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;EndGetClientCertificate;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_HttpMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_InputStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_RawUrl;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_Url;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_UrlReferrer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerRequest;false;get_UserHostName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;AppendCookie;(System.Net.Cookie);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListenerResponse;false;Close;(System.Byte[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;HttpListenerResponse;false;CopyFrom;(System.Net.HttpListenerResponse);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListenerResponse;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_OutputStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_RedirectLocation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;HttpListenerResponse;false;set_StatusDescription;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListenerTimeoutManager;false;get_DrainEntityBody;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerTimeoutManager;false;get_IdleConnection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpListenerTimeoutManager;false;set_DrainEntityBody;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpListenerTimeoutManager;false;set_IdleConnection;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;GetRequestStream;(System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Accept;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_ContinueDelegate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Expect;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_Referer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_TransferEncoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebRequest;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;HttpWebResponse;false;GetResponseHeader;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;get_CharacterSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;HttpWebResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;IPAddress;false;MapToIPv4;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Net;IPAddress;false;MapToIPv6;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Net;IPAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;IPEndPoint;false;IPEndPoint;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;IPEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;IPEndPoint;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;IPEndPoint;false;set_Address;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;GetCredential;(System.String,System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Net;NetworkCredential;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;NetworkCredential;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;NetworkCredential;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;NetworkCredential;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;NetworkCredential;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;OpenReadCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;OpenWriteCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;PathList;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;PathList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;PathList;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;ProtocolViolationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net;UploadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;UploadFileCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;UploadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;UploadValuesCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;DownloadData;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadData;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadDataAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadDataAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadDataTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadDataTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadString;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadString;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadStringAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadStringAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadStringTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;DownloadStringTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenRead;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenReadAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenReadAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenReadTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenReadTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;OpenWriteAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;get_ResponseHeaders;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebClient;false;set_BaseAddress;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Net;WebClient;false;set_QueryString;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Net;WebException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Net;WebException;false;WebException;(System.String,System.Exception,System.Net.WebExceptionStatus,System.Net.WebResponse);;Argument[3];Argument[Qualifier];generated:taint", + "System.Net;WebException;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpRequestHeader);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpResponseHeader);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebHeaderCollection;false;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebProxy;false;GetProxy;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebProxy;false;get_BypassArrayList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebProxy;false;get_BypassList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Net;WebRequest;false;Create;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebRequest;false;Create;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebRequest;false;CreateDefault;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebRequest;false;CreateHttp;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebRequest;false;CreateHttp;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Net;WebUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint", + "System.Net;WebUtility;false;UrlDecode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Numerics.Tensors;ArrayTensorExtensions;false;ToTensor<>;(System.Array,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Numerics.Tensors;ArrayTensorExtensions;false;ToTensor<>;(T[,,],System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Numerics.Tensors;ArrayTensorExtensions;false;ToTensor<>;(T[,],System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Numerics.Tensors;ArrayTensorExtensions;false;ToTensor<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;CompressedSparseTensor;(System.Memory,System.Memory,System.Memory,System.Int32,System.ReadOnlySpan,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;CompressedSparseTensor;(System.Memory,System.Memory,System.Memory,System.Int32,System.ReadOnlySpan,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;CompressedSparseTensor;(System.Memory,System.Memory,System.Memory,System.Int32,System.ReadOnlySpan,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;get_CompressedCounts;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;get_Indices;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;CompressedSparseTensor<>;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;DenseTensor<>;false;DenseTensor;(System.Memory,System.ReadOnlySpan,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Numerics.Tensors;DenseTensor<>;false;Reshape;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;DenseTensor<>;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;SparseTensor<>;false;Reshape;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;Tensor<>;false;GetArrayString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;Tensor<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics.Tensors;Tensor<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Numerics.Tensors;Tensor<>;true;get_Item;(System.Int32[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Abs;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;DivRem;(System.Numerics.BigInteger,System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Negate;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Pow;(System.Numerics.BigInteger,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;Remainder;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_BitwiseOr;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_BitwiseOr;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_LeftShift;(System.Numerics.BigInteger,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_Modulus;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_RightShift;(System.Numerics.BigInteger,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_UnaryNegation;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;BigInteger;false;op_UnaryPlus;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Complex;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Complex;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Add;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Lerp;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Negate;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Subtract;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;Transpose;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;op_Addition;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;op_Multiply;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;op_Multiply;(System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;op_Subtraction;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Matrix4x4;false;op_UnaryNegation;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Plane;false;Normalize;(System.Numerics.Plane);;Argument[0];ReturnValue;generated:taint", + "System.Numerics;Plane;false;Plane;(System.Numerics.Vector3,System.Single);;Argument[0];Argument[Qualifier];generated:taint", + "System.Numerics;Plane;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Numerics;Vector2;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;Vector3;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;Vector4;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System.Numerics;Vector;false;Abs<>;(System.Numerics.Vector);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Context;CustomReflectionContext;false;MapAssembly;(System.Reflection.Assembly);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Context;CustomReflectionContext;false;MapType;(System.Reflection.TypeInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Context;CustomReflectionContext;true;GetCustomAttributes;(System.Reflection.MemberInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Reflection.Context;CustomReflectionContext;true;GetCustomAttributes;(System.Reflection.ParameterInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;GetDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;GetModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;AssemblyBuilder;false;get_ManifestModule;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ConstructorBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[4].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[5].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;DynamicILInfo;false;get_DynamicMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;CreateDelegate;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;DynamicMethod;false;GetDynamicILInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;get_MethodHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;DynamicMethod;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;CreateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetEnumUnderlyingType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_UnderlyingField;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EnumBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;EventBuilder;false;AddOtherMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;EventBuilder;false;SetAddOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;EventBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;EventBuilder;false;SetRaiseMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;EventBuilder;false;SetRemoveOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;FieldBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;FieldBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;FieldBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;FieldBuilder;false;get_FieldType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;FieldBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;FieldBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;SetBaseTypeConstraint;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;SetInterfaceConstraints;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;GenericTypeParameterBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;LocalBuilder;false;get_LocalType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;MethodBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;GetGenericMethodDefinition;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;MethodBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;GetModule;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetReturnType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Emit;MethodBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;MethodBuilder;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;GetType;(System.String,System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;get_FullyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ModuleBuilder;false;get_ScopeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;ParameterBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;ParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;ParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;GetGetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;GetSetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;SetGetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;SetSetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;get_PropertyType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;PropertyBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetFieldSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetLocalVarSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.CallingConventions,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Runtime.InteropServices.CallingConvention,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Runtime.InteropServices.CallingConvention,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[2].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Runtime.InteropServices.CallingConvention,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;AddInterfaceImplementation;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;TypeBuilder;false;CreateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineDefaultConstructor;(System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[2].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[3].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[6].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineTypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetGenericTypeDefinition;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Emit;TypeBuilder;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;TypeBuilder;false;SetParent;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Emit;TypeBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;CustomModifiersEncoder;false;AddModifier;(System.Reflection.Metadata.EntityHandle,System.Boolean);;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;Add;(System.Reflection.Metadata.ExceptionRegionKind,System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddCatch;(System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFault;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFilter;(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFinally;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[2];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[3];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[2];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[3];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[4];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;MetadataRootBuilder;(System.Reflection.Metadata.Ecma335.MetadataBuilder,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;get_Sizes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Collections.Immutable.ImmutableArray);;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;PortablePdbBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Array;(System.Reflection.Metadata.Ecma335.SignatureTypeEncoder,System.Reflection.Metadata.Ecma335.ArrayShapeEncoder);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Pointer;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;SZArray;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata;AssemblyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;AssemblyDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;AssemblyFile;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;AssemblyReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;Blob;false;GetBytes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection.Metadata;BlobBuilder;false;GetBlobs;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;ReserveBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobBuilder;false;TryWriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata;BlobReader;false;ReadConstant;(System.Reflection.Metadata.ConstantTypeCode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobReader;false;ReadSerializedString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobReader;false;ReadUTF16;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobReader;false;ReadUTF8;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobReader;false;get_CurrentPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobReader;false;get_StartPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;BlobWriter;false;BlobWriter;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Reflection.Metadata;BlobWriter;false;WriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.Metadata;BlobWriter;false;get_Blob;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;EventAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;EventDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ExportedType;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;FieldDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;GenericParameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;GenericParameterConstraint;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ImportDefinitionCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;InterfaceImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalScope;false;GetChildren;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalScope;false;GetLocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalScope;false;GetLocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ManifestResource;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MemberReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetAssemblyDefinition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetAssemblyFile;(System.Reflection.Metadata.AssemblyFileHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetAssemblyReference;(System.Reflection.Metadata.AssemblyReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetConstant;(System.Reflection.Metadata.ConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetCustomAttribute;(System.Reflection.Metadata.CustomAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetCustomAttributes;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.CustomDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetDeclarativeSecurityAttribute;(System.Reflection.Metadata.DeclarativeSecurityAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetDocument;(System.Reflection.Metadata.DocumentHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetEventDefinition;(System.Reflection.Metadata.EventDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetExportedType;(System.Reflection.Metadata.ExportedTypeHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetFieldDefinition;(System.Reflection.Metadata.FieldDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetGenericParameter;(System.Reflection.Metadata.GenericParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetGenericParameterConstraint;(System.Reflection.Metadata.GenericParameterConstraintHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetImportScope;(System.Reflection.Metadata.ImportScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetInterfaceImplementation;(System.Reflection.Metadata.InterfaceImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetLocalConstant;(System.Reflection.Metadata.LocalConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetLocalScope;(System.Reflection.Metadata.LocalScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetLocalVariable;(System.Reflection.Metadata.LocalVariableHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetManifestResource;(System.Reflection.Metadata.ManifestResourceHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMemberReference;(System.Reflection.Metadata.MemberReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMethodDefinition;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMethodImplementation;(System.Reflection.Metadata.MethodImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetMethodSpecification;(System.Reflection.Metadata.MethodSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetModuleDefinition;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetModuleReference;(System.Reflection.Metadata.ModuleReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetNamespaceDefinitionRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetParameter;(System.Reflection.Metadata.ParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetPropertyDefinition;(System.Reflection.Metadata.PropertyDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetStandaloneSignature;(System.Reflection.Metadata.StandaloneSignatureHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetTypeDefinition;(System.Reflection.Metadata.TypeDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetTypeReference;(System.Reflection.Metadata.TypeReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;GetTypeSpecification;(System.Reflection.Metadata.TypeSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_AssemblyReferences;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_CustomDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_DebugMetadataHeader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_DeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_Documents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_EventDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_FieldDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_ImportScopes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_LocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_LocalScopes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_LocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_MetadataPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_MetadataVersion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_MethodDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_MethodDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_PropertyDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReader;false;get_StringComparer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataReaderProvider;false;GetMetadataReader;(System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MetadataStringDecoder;false;GetString;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodBodyBlock;false;Create;(System.Reflection.Metadata.BlobReader);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodBodyBlock;false;GetILReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodBodyBlock;false;get_ExceptionRegions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodBodyBlock;false;get_LocalSignature;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodDefinition;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodImport;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodImport;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;MethodSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ModuleDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ModuleReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;NamespaceDefinition;false;get_ExportedTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;NamespaceDefinition;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;NamespaceDefinition;false;get_NamespaceDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;NamespaceDefinition;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;NamespaceDefinition;false;get_TypeDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[0];ReturnValue;generated:taint", + "System.Reflection.Metadata;Parameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;PropertyAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;PropertyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;SequencePointCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;StandaloneSignature;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetInterfaceImplementations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeDefinition;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.Metadata;TypeSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;ManagedPEBuilder;false;GetDirectories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;ManagedPEBuilder;false;SerializeSection;(System.String,System.Reflection.PortableExecutable.SectionLocation);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEBuilder+Section;false;Section;(System.String,System.Reflection.PortableExecutable.SectionCharacteristics);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.PortableExecutable;PEBuilder;false;GetSections;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.PortableExecutable;PEHeaders;false;get_CoffHeader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEHeaders;false;get_CorHeader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEHeaders;false;get_PEHeader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEHeaders;false;get_SectionHeaders;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEMemoryBlock;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;GetEntireImage;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;GetMetadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Byte*,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.IO.Stream,System.Reflection.PortableExecutable.PEStreamOptions,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection.PortableExecutable;PEReader;false;get_PEHeaders;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Reflection;Assembly;false;GetAssembly;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;Assembly;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Assembly;true;GetName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Assembly;true;GetType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Assembly;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;GetPublicKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;SetPublicKey;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Reflection;AssemblyName;false;SetPublicKeyToken;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Reflection;AssemblyName;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;get_CultureInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;get_EscapedCodeBase;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;AssemblyName;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;AssemblyName;false;set_CultureInfo;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;AssemblyName;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;AssemblyName;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeData;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;get_MemberInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeNamedArgument;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;get_ArgumentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;CustomAttributeTypedArgument;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;false;GetAddMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;false;GetRaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;false;GetRemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;true;get_AddMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;true;get_RaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfo;true;get_RemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;ExceptionHandlingClause;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;IntrospectionExtensions;false;GetTypeInfo;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;LocalVariableInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;MetadataLoadContext;false;MetadataLoadContext;(System.Reflection.MetadataAssemblyResolver,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;MetadataLoadContext;false;get_CoreAssembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;MethodInfo;false;CreateDelegate<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;MethodInfoExtensions;false;GetBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Module;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;ParameterInfo;false;GetRealObject;(System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;ParameterInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;ParameterInfo;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;ParameterInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;ParameterInfo;false;get_ParameterType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;Pointer;false;Box;(System.Void*,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;Pointer;false;Unbox;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfo;false;GetAccessors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;PropertyInfo;false;GetGetMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;PropertyInfo;false;GetSetMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;PropertyInfo;true;get_GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;PropertyInfo;true;get_SetMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;ReflectionTypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Reflection;ReflectionTypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetMethodInfo;(System.Delegate);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvents;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeFields;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethods;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperties;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetElementType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetMemberWithSameMetadataDefinitionAs;(System.Reflection.MemberInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetNestedTypes;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;GetPropertyImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;TypeDelegator;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Reflection;TypeDelegator;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_AssemblyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeDelegator;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetConstructor;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetConstructors;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetConstructors;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetDefaultMembers;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetEvents;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetEvents;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetFields;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetFields;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetGenericArguments;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetInterfaces;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMembers;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMembers;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMethods;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetMethods;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetNestedType;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetNestedTypes;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperties;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperties;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;false;GetTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection;TypeInfo;true;AsType;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Reflection;TypeInfo;true;GetDeclaredEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;GetDeclaredField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;GetDeclaredMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;GetDeclaredNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;GetDeclaredProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredConstructors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredFields;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredMembers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredMethods;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_DeclaredProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_GenericTypeParameters;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Reflection;TypeInfo;true;get_ImplementedInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources.Extensions;DeserializingResourceReader;false;DeserializingResourceReader;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources.Extensions;DeserializingResourceReader;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources.Extensions;PreserializedResourceWriter;false;PreserializedResourceWriter;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;MissingSatelliteAssemblyException;false;MissingSatelliteAssemblyException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Resources;MissingSatelliteAssemblyException;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;GetResourceFileName;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[1];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[2];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;ResourceManager;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;ResourceManager;false;get_BaseName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceManager;false;get_ResourceSetType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceReader;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceReader;false;GetResourceData;(System.String,System.String,System.Byte[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceReader;false;ResourceReader;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;ResourceSet;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Resources;ResourceSet;false;ResourceSet;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Resources;ResourceSet;false;ResourceSet;(System.Resources.IResourceReader);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Resources;ResourceWriter;false;ResourceWriter;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryRemovedArguments;false;CacheEntryRemovedArguments;(System.Runtime.Caching.ObjectCache,System.Runtime.Caching.CacheEntryRemovedReason,System.Runtime.Caching.CacheItem);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryRemovedArguments;false;CacheEntryRemovedArguments;(System.Runtime.Caching.ObjectCache,System.Runtime.Caching.CacheEntryRemovedReason,System.Runtime.Caching.CacheItem);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryRemovedArguments;false;get_CacheItem;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryRemovedArguments;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;CacheEntryUpdateArguments;(System.Runtime.Caching.ObjectCache,System.Runtime.Caching.CacheEntryRemovedReason,System.String,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;CacheEntryUpdateArguments;(System.Runtime.Caching.ObjectCache,System.Runtime.Caching.CacheEntryRemovedReason,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;CacheEntryUpdateArguments;(System.Runtime.Caching.ObjectCache,System.Runtime.Caching.CacheEntryRemovedReason,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;get_RegionName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;get_UpdatedCacheItem;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;get_UpdatedCacheItemPolicy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;set_UpdatedCacheItem;(System.Runtime.Caching.CacheItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheEntryUpdateArguments;false;set_UpdatedCacheItemPolicy;(System.Runtime.Caching.CacheItemPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;get_AbsoluteExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;get_ChangeMonitors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;get_RemovedCallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;get_SlidingExpiration;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;get_UpdateCallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;set_AbsoluteExpiration;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;CacheItemPolicy;false;set_SlidingExpiration;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;HostFileChangeMonitor;false;get_FilePaths;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;HostFileChangeMonitor;false;get_LastModified;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;HostFileChangeMonitor;false;get_UniqueId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Caching;MemoryCache;false;CreateCacheEntryChangeMonitor;(System.Collections.Generic.IEnumerable,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.Caching;MemoryCache;false;MemoryCache;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;MemoryCache;false;MemoryCache;(System.String,System.Collections.Specialized.NameValueCollection,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Caching;MemoryCache;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;CallSite;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;CallSiteOps;false;AddRule<>;(System.Runtime.CompilerServices.CallSite,T);;Argument[1];Argument[0];generated:taint", + "System.Runtime.CompilerServices;CallSiteOps;false;GetCachedRules<>;(System.Runtime.CompilerServices.RuleCache);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;CallSiteOps;false;GetRules<>;(System.Runtime.CompilerServices.CallSite);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;Closure;false;Closure;(System.Object[],System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;Closure;false;Closure;(System.Object[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetOrCreateValue;(TKey);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;GetAsyncEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>+ConfiguredValueTaskAwaiter;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;DateTimeConstantAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;DefaultInterpolatedStringHandler;false;DefaultInterpolatedStringHandler;(System.Int32,System.Int32,System.IFormatProvider);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;DefaultInterpolatedStringHandler;false;DefaultInterpolatedStringHandler;(System.Int32,System.Int32,System.IFormatProvider,System.Span);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;DefaultInterpolatedStringHandler;false;DefaultInterpolatedStringHandler;(System.Int32,System.Int32,System.IFormatProvider,System.Span);;Argument[3];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;DynamicAttribute;false;DynamicAttribute;(System.Boolean[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;DynamicAttribute;false;get_TransformFlags;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;PoolingAsyncValueTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;ReadOnlyCollectionBuilder;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Runtime.CompilerServices;RuntimeOps;false;CreateRuntimeVariables;(System.Object[],System.Int64[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;CreateRuntimeVariables;(System.Object[],System.Int64[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;ExpandoPromoteClass;(System.Dynamic.ExpandoObject,System.Object,System.Object);;Argument[2];Argument[0].Element;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;ExpandoTryGetValue;(System.Dynamic.ExpandoObject,System.Object,System.Int32,System.String,System.Boolean,System.Object);;Argument[0].Element;ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;ExpandoTrySetValue;(System.Dynamic.ExpandoObject,System.Object,System.Int32,System.Object,System.String,System.Boolean);;Argument[3];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;MergeRuntimeVariables;(System.Runtime.CompilerServices.IRuntimeVariables,System.Runtime.CompilerServices.IRuntimeVariables,System.Int32[]);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;MergeRuntimeVariables;(System.Runtime.CompilerServices.IRuntimeVariables,System.Runtime.CompilerServices.IRuntimeVariables,System.Int32[]);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;MergeRuntimeVariables;(System.Runtime.CompilerServices.IRuntimeVariables,System.Runtime.CompilerServices.IRuntimeVariables,System.Int32[]);;Argument[2].Element;ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeOps;false;Quote;(System.Linq.Expressions.Expression,System.Object,System.Object[]);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;RuntimeWrappedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Runtime.CompilerServices;RuntimeWrappedException;false;RuntimeWrappedException;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;RuntimeWrappedException;false;get_WrappedException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;StrongBox<>;false;StrongBox;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;StrongBox<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;StrongBox<>;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;SwitchExpressionException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Runtime.CompilerServices;SwitchExpressionException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;TupleElementNamesAttribute;false;TupleElementNamesAttribute;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Runtime.CompilerServices;TupleElementNamesAttribute;false;get_TransformNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.CompilerServices;ValueTaskAwaiter<>;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;Capture;(System.Exception);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetCurrentStackTrace;(System.Exception);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetRemoteStackTrace;(System.Exception,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetRemoteStackTrace;(System.Exception,System.String);;Argument[1];Argument[0];generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetRemoteStackTrace;(System.Exception,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;get_SourceException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ArrayWithOffset;false;ArrayWithOffset;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;ArrayWithOffset;false;GetArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;CLong;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;COMException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;CULong;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;GetAddMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;GetRaiseMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;GetRemoveMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;ComAwareEventInfo;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;CriticalHandle;false;CriticalHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;CriticalHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;ExternalException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;GCHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;GCHandle;false;ToIntPtr;(System.Runtime.InteropServices.GCHandle);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;HandleRef;false;ToIntPtr;(System.Runtime.InteropServices.HandleRef);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;HandleRef;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;HandleRef;false;get_Wrapper;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;Marshal;false;GenerateProgIdForType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;Marshal;false;InitHandle;(System.Runtime.InteropServices.SafeHandle,System.IntPtr);;Argument[1];Argument[0];generated:taint", + "System.Runtime.InteropServices;MemoryMarshal;false;CreateFromPinnedArray<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;MemoryMarshal;false;TryGetString;(System.ReadOnlyMemory,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;SafeHandle;false;DangerousGetHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.InteropServices;SafeHandle;false;SafeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;SafeHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.InteropServices;SequenceMarshal;false;TryGetArray<>;(System.Buffers.ReadOnlySequence,System.ArraySegment);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlyMemory<>;(System.Buffers.ReadOnlySequence,System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlySequenceSegment<>;(System.Buffers.ReadOnlySequence,System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector128;false;Abs<>;(System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector128;false;WithElement<>;(System.Runtime.Intrinsics.Vector128,System.Int32,T);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector128;false;WithLower<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector128;false;WithUpper<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector128<>;false;op_UnaryPlus;(System.Runtime.Intrinsics.Vector128<>);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector256;false;Abs<>;(System.Runtime.Intrinsics.Vector256);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector256;false;WithElement<>;(System.Runtime.Intrinsics.Vector256,System.Int32,T);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector256;false;WithLower<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector256;false;WithUpper<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector256<>;false;op_UnaryPlus;(System.Runtime.Intrinsics.Vector256<>);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector64;false;Abs<>;(System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector64;false;WithElement<>;(System.Runtime.Intrinsics.Vector64,System.Int32,T);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Intrinsics;Vector64<>;false;op_UnaryPlus;(System.Runtime.Intrinsics.Vector64<>);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyLoadContext;false;EnterContextualReflection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyLoadContext;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Loader;AssemblyLoadContext;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Remoting;ObjectHandle;false;ObjectHandle;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Remoting;ObjectHandle;false;Unwrap;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_SurrogateSelector;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Binder;(System.Runtime.Serialization.SerializationBinder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Context;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_SurrogateSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Json;DataContractJsonSerializer;false;DataContractJsonSerializer;(System.Type,System.Runtime.Serialization.Json.DataContractJsonSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[4];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ItemName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;get_KeyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ValueName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ItemName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;set_KeyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ValueName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Runtime.Serialization.DataContractSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean,System.Runtime.Serialization.DataContractResolver);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;get_DataContractResolver;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializerExtensions;false;GetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataContractSerializerExtensions;false;SetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer,System.Runtime.Serialization.ISerializationSurrogateProvider);;Argument[1];Argument[0];generated:taint", + "System.Runtime.Serialization;DataMemberAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DataMemberAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;DateTimeFormat;false;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;DateTimeFormat;false;get_FormatString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;EnumMemberAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;EnumMemberAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;ExportOptions;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.TypeCode);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterConverter;false;ToDateTime;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterConverter;false;ToString;(System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type,System.Runtime.Serialization.StreamingContext);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterServices;false;GetSurrogateForCyclicalReference;(System.Runtime.Serialization.ISerializationSurrogate);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterServices;false;GetTypeFromAssembly;(System.Reflection.Assembly,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;FormatterServices;false;PopulateObjectMembers;(System.Object,System.Reflection.MemberInfo[],System.Object[]);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;ObjectIDGenerator;false;GetId;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;ObjectManager;false;GetObject;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationEntry;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Byte);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Char);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Decimal);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int16);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.SByte);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Single);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt16);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt64);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;GetDateTime;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;GetString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;GetValue;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;SetType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;UpdateValue;(System.String,System.Object,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;UpdateValue;(System.String,System.Object,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;UpdateValue;(System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;get_FullTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfo;false;set_FullTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfoEnumerator;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SerializationObjectManager;false;SerializationObjectManager;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;StreamingContext;false;StreamingContext;(System.Runtime.Serialization.StreamingContextStates,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;StreamingContext;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];Argument[0];generated:taint", + "System.Runtime.Serialization;SurrogateSelector;false;GetNextSelector;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;SurrogateSelector;false;GetSurrogate;(System.Type,System.Runtime.Serialization.StreamingContext,System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;XPathQueryGenerator;false;CreateFromDataContractSerializer;(System.Type,System.Reflection.MemberInfo[],System.Text.StringBuilder,System.Xml.XmlNamespaceManager);;Argument[2];ReturnValue;generated:taint", + "System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlDictionaryReader);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Serialization;XmlSerializableServices;false;WriteNodes;(System.Xml.XmlWriter,System.Xml.XmlNode[]);;Argument[1].Element;Argument[0];generated:taint", + "System.Runtime.Serialization;XsdDataContractExporter;false;XsdDataContractExporter;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Serialization;XsdDataContractExporter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Serialization;XsdDataContractExporter;false;set_Options;(System.Runtime.Serialization.ExportOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;FrameworkName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;FrameworkName;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;FrameworkName;false;get_Identifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;FrameworkName;false;get_Profile;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;FrameworkName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;TargetFrameworkAttribute;false;TargetFrameworkAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkDisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime.Versioning;TargetFrameworkAttribute;false;set_FrameworkDisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[3];ReturnValue;generated:taint", + "System.Runtime;DependentHandle;false;get_Dependent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime;DependentHandle;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Runtime;DependentHandle;false;get_TargetAndDependent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ChannelBinding);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ProtectionScenario,System.Security.Authentication.ExtendedProtection.ServiceNameCollection);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomChannelBinding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicyTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;ServiceNameCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Claims;Claim;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[0];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint", + "System.Security.Claims;Claim;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_OriginalIssuer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;Claim;false;get_ValueType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;AddClaim;(System.Security.Claims.Claim);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;AddClaims;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_Actor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_BootstrapContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_Label;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_NameClaimType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;get_RoleClaimType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsIdentity;false;set_Actor;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;set_BootstrapContext;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsIdentity;false;set_Label;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;AddIdentities;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;AddIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IPrincipal);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;CreateClaimsIdentity;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;get_Identities;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Claims;ClaimsPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;Add;(System.Security.Cryptography.Pkcs.CmsRecipient);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;CmsRecipientCollection;(System.Security.Cryptography.Pkcs.CmsRecipient);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;CopyTo;(System.Security.Cryptography.Pkcs.CmsRecipient[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;CmsRecipientCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography.Pkcs;CmsRecipientEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;CmsSigner;false;get_SignaturePadding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;CmsSigner;false;set_SignaturePadding;(System.Security.Cryptography.RSASignaturePadding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_EncryptedKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_KeyEncryptionAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_OriginatorIdentifierOrKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_OtherKeyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyAgreeRecipientInfo;false;get_RecipientIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyTransRecipientInfo;false;get_EncryptedKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyTransRecipientInfo;false;get_KeyEncryptionAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;KeyTransRecipientInfo;false;get_RecipientIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12CertBag;false;GetCertificateType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12CertBag;false;Pkcs12CertBag;(System.Security.Cryptography.Oid,System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12CertBag;false;get_EncodedCertificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeBag;false;GetBagId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeBag;false;Pkcs12SafeBag;(System.String,System.ReadOnlyMemory,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeBag;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeBag;false;set_Attributes;(System.Security.Cryptography.CryptographicAttributeObjectCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeContents;false;AddSafeBag;(System.Security.Cryptography.Pkcs.Pkcs12SafeBag);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeContents;false;AddSecret;(System.Security.Cryptography.Oid,System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SafeContents;false;GetBags;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SecretBag;false;GetSecretType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs12SecretBag;false;get_SecretValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9AttributeObject;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9AttributeObject;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9ContentType;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9ContentType;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentDescription;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentDescription;false;Pkcs9DocumentDescription;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentDescription;false;get_DocumentDescription;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentName;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentName;false;Pkcs9DocumentName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9DocumentName;false;get_DocumentName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9LocalKeyId;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9MessageDigest;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9MessageDigest;false;get_MessageDigest;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9SigningTime;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9SigningTime;false;Pkcs9SigningTime;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Pkcs;Pkcs9SigningTime;false;get_SigningTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;RecipientInfoCollection;false;CopyTo;(System.Security.Cryptography.Pkcs.RecipientInfo[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Security.Cryptography.Pkcs;RecipientInfoCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;RecipientInfoCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;RecipientInfoCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography.Pkcs;RecipientInfoEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampRequest;false;GetNonce;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;AsSignedCms;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForData;(System.ReadOnlySpan,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[2].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForData;(System.ReadOnlySpan,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForHash;(System.ReadOnlySpan,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[3].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForHash;(System.ReadOnlySpan,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForHash;(System.ReadOnlySpan,System.Security.Cryptography.Oid,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[3].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForHash;(System.ReadOnlySpan,System.Security.Cryptography.Oid,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForSignerInfo;(System.Security.Cryptography.Pkcs.SignerInfo,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[2].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampToken;false;VerifySignatureForSignerInfo;(System.Security.Cryptography.Pkcs.SignerInfo,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampTokenInfo;false;GetNonce;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampTokenInfo;false;GetSerialNumber;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampTokenInfo;false;GetTimestampAuthorityName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;Rfc3161TimestampTokenInfo;false;get_Timestamp;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfo;false;get_Certificate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfo;false;get_DigestAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfo;false;get_SignatureAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfo;false;get_SignedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfo;false;get_UnsignedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfoCollection;false;CopyTo;(System.Security.Cryptography.Pkcs.SignerInfo[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfoCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfoCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Pkcs;SignerInfoCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography.Pkcs;SignerInfoEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;PublicKey;false;PublicKey;(System.Security.Cryptography.Oid,System.Security.Cryptography.AsnEncodedData,System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;PublicKey;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;PublicKey;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.Security.Cryptography.X509Certificates.X500DistinguishedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.String,System.Security.Cryptography.X509Certificates.X500DistinguishedNameFlags);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509BasicConstraintsExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_IssuerName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotAfter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotBefore;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PrivateKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SerialNumber;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SignatureAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SubjectName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Thumbprint;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate2Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;GetCertHashString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;GetKeyAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;GetSerialNumberString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;X509CertificateEnumerator;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainPolicy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainStatus;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Chain;false;set_ChainPolicy;(System.Security.Cryptography.X509Certificates.X509ChainPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography.X509Certificates;X509ChainElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509ChainStatus;false;get_StatusInformation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509ChainStatus;false;set_StatusInformation;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;get_EnhancedKeyUsages;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509Extension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography.X509Certificates;X509ExtensionEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509KeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForECDsa;(System.Security.Cryptography.ECDsa);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[1];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;get_SubjectKeyIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;CipherData;(System.Security.Cryptography.Xml.CipherReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;get_CipherReference;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;get_CipherValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;CipherData;false;set_CipherReference;(System.Security.Cryptography.Xml.CipherReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;CipherReference;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;CipherReference;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DSAKeyValue;false;DSAKeyValue;(System.Security.Cryptography.DSA);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DSAKeyValue;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DSAKeyValue;false;set_Key;(System.Security.Cryptography.DSA);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;DataObject;(System.String,System.String,System.String,System.Xml.XmlElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;DataObject;(System.String,System.String,System.String,System.Xml.XmlElement);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;DataObject;(System.String,System.String,System.String,System.Xml.XmlElement);;Argument[2];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;DataObject;(System.String,System.String,System.String,System.Xml.XmlElement);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;get_MimeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;set_Data;(System.Xml.XmlNodeList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;DataObject;false;set_MimeType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedData;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedData;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;AddReference;(System.Security.Cryptography.Xml.DataReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;AddReference;(System.Security.Cryptography.Xml.KeyReference);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;get_CarriedKeyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;get_Recipient;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;get_ReferenceList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;set_CarriedKeyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedKey;false;set_Recipient;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;EncryptedReference;(System.String,System.Security.Cryptography.Xml.TransformChain);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;EncryptedReference;(System.String,System.Security.Cryptography.Xml.TransformChain);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;get_ReferenceType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;get_TransformChain;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;set_ReferenceType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;set_TransformChain;(System.Security.Cryptography.Xml.TransformChain);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;false;set_Uri;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;true;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedReference;true;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;false;get_KeyInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;false;set_KeyInfo;(System.Security.Cryptography.Xml.KeyInfo);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_CipherData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_EncryptionMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_EncryptionProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_MimeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_CipherData;(System.Security.Cryptography.Xml.CipherData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_EncryptionMethod;(System.Security.Cryptography.Xml.EncryptionMethod);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_MimeType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedType;true;set_Type;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;EncryptedXml;(System.Xml.XmlDocument,System.Security.Policy.Evidence);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;EncryptedXml;(System.Xml.XmlDocument,System.Security.Policy.Evidence);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;GetDecryptionKey;(System.Security.Cryptography.Xml.EncryptedData,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;GetIdElement;(System.Xml.XmlDocument,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;get_DocumentEvidence;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;get_Recipient;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;get_Resolver;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;set_DocumentEvidence;(System.Security.Policy.Evidence);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;set_Recipient;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptedXml;false;set_Resolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionMethod;false;EncryptionMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionMethod;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionMethod;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionMethod;false;get_KeyAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionMethod;false;set_KeyAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;EncryptionProperty;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;get_PropertyElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionProperty;false;set_PropertyElement;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;Add;(System.Security.Cryptography.Xml.EncryptionProperty);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;CopyTo;(System.Security.Cryptography.Xml.EncryptionProperty[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;Insert;(System.Int32,System.Security.Cryptography.Xml.EncryptionProperty);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;EncryptionPropertyCollection;false;set_ItemOf;(System.Int32,System.Security.Cryptography.Xml.EncryptionProperty);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfo;false;AddClause;(System.Security.Cryptography.Xml.KeyInfoClause);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfo;false;GetEnumerator;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfo;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfo;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfo;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoEncryptedKey;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoEncryptedKey;false;KeyInfoEncryptedKey;(System.Security.Cryptography.Xml.EncryptedKey);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoEncryptedKey;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoEncryptedKey;false;get_EncryptedKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoEncryptedKey;false;set_EncryptedKey;(System.Security.Cryptography.Xml.EncryptedKey);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoName;false;KeyInfoName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoName;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoName;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoName;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoNode;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoNode;false;KeyInfoNode;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoNode;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoNode;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoNode;false;set_Value;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;KeyInfoRetrievalMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;KeyInfoRetrievalMethod;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;KeyInfoRetrievalMethod;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;set_Type;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoRetrievalMethod;false;set_Uri;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;AddSubjectKeyId;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;AddSubjectName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;get_CRL;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;get_Certificates;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;get_IssuerSerials;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;get_SubjectKeyIds;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;get_SubjectNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;KeyInfoX509Data;false;set_CRL;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;RSAKeyValue;false;RSAKeyValue;(System.Security.Cryptography.RSA);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;RSAKeyValue;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;RSAKeyValue;false;set_Key;(System.Security.Cryptography.RSA);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;AddTransform;(System.Security.Cryptography.Xml.Transform);;Argument[Qualifier];Argument[0];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;Reference;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;Reference;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_DigestMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_DigestValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_TransformChain;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_DigestMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_DigestValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_TransformChain;(System.Security.Cryptography.Xml.TransformChain);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_Type;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Reference;false;set_Uri;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;ReferenceList;false;Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;ReferenceList;false;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;ReferenceList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;ReferenceList;false;set_ItemOf;(System.Int32,System.Security.Cryptography.Xml.EncryptedReference);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;AddObject;(System.Security.Cryptography.Xml.DataObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Signature;false;get_KeyInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Signature;false;get_ObjectList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Signature;false;get_SignatureValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Signature;false;get_SignedInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Signature;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;set_KeyInfo;(System.Security.Cryptography.Xml.KeyInfo);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;set_ObjectList;(System.Collections.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;set_SignatureValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Signature;false;set_SignedInfo;(System.Security.Cryptography.Xml.SignedInfo);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;AddReference;(System.Security.Cryptography.Xml.Reference);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;AddReference;(System.Security.Cryptography.Xml.Reference);;Argument[Qualifier];Argument[0];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_CanonicalizationMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_CanonicalizationMethodObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_References;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_SignatureLength;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;get_SignatureMethod;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;set_CanonicalizationMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;set_SignatureLength;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedInfo;false;set_SignatureMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;GetIdElement;(System.Xml.XmlDocument,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;LoadXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;SignedXml;(System.Xml.XmlDocument);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;SignedXml;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_EncryptedXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_KeyInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SafeCanonicalizationMethods;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_Signature;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SignatureFormatValidator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SignatureValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SignedInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SigningKey;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;get_SigningKeyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;set_EncryptedXml;(System.Security.Cryptography.Xml.EncryptedXml);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;set_KeyInfo;(System.Security.Cryptography.Xml.KeyInfo);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;set_Resolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;set_SigningKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;SignedXml;false;set_SigningKeyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Transform;false;GetXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Transform;false;get_Algorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Transform;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Transform;false;get_PropagatedNamespaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Transform;false;get_Resolver;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;Transform;false;set_Algorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Transform;false;set_Context;(System.Xml.XmlElement);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;Transform;false;set_Resolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;TransformChain;false;Add;(System.Security.Cryptography.Xml.Transform);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;TransformChain;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;TransformChain;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;AddExceptUri;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;LoadInnerXml;(System.Xml.XmlNodeList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;get_EncryptedXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDecryptionTransform;false;set_EncryptedXml;(System.Security.Cryptography.Xml.EncryptedXml);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigBase64Transform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigBase64Transform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigBase64Transform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigBase64Transform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigC14NTransform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigC14NTransform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigC14NTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigC14NTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigC14NTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigEnvelopedSignatureTransform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigEnvelopedSignatureTransform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigEnvelopedSignatureTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigEnvelopedSignatureTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigEnvelopedSignatureTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;LoadInnerXml;(System.Xml.XmlNodeList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;XmlDsigExcC14NTransform;(System.Boolean,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;get_InclusiveNamespacesPrefixList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigExcC14NTransform;false;set_InclusiveNamespacesPrefixList;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXPathTransform;false;LoadInnerXml;(System.Xml.XmlNodeList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXPathTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXPathTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXPathTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXsltTransform;false;GetInnerXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXsltTransform;false;LoadInnerXml;(System.Xml.XmlNodeList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXsltTransform;false;LoadInput;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXsltTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlDsigXsltTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;GetOutput;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;GetOutput;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;get_Decryptor;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;get_InputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;get_OutputTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography.Xml;XmlLicenseTransform;false;set_Decryptor;(System.Security.Cryptography.Xml.IRelDecryptor);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;Format;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;get_RawData;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;AsnEncodedData;false;set_Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedDataCollection;false;AsnEncodedDataCollection;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;AsnEncodedDataCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;AsnEncodedDataCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography;AsnEncodedDataEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;CryptoStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptoStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptographicAttributeObject;false;CryptographicAttributeObject;(System.Security.Cryptography.Oid,System.Security.Cryptography.AsnEncodedDataCollection);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;CryptographicAttributeObject;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;Add;(System.Security.Cryptography.CryptographicAttributeObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;CopyTo;(System.Security.Cryptography.CryptographicAttributeObject[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;CryptographicAttributeObjectCollection;(System.Security.Cryptography.CryptographicAttributeObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CryptographicAttributeObjectCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography;CryptographicAttributeObjectEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CspParameters;false;get_ParentWindowHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;CspParameters;false;set_ParentWindowHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;DSASignatureDeformatter;false;DSASignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;DSASignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;DSASignatureFormatter;false;DSASignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;DSASignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;ECCurve;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;ECCurve;false;set_Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;HMAC;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;HMAC;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;HashAlgorithmName;false;HashAlgorithmName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;HashAlgorithmName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;HashAlgorithmName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.Byte[]);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;IncrementalHash;false;CreateHash;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;IncrementalHash;false;get_AlgorithmName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;Oid;false;FromFriendlyName;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;Oid;false;FromOidValue;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;Oid;false;Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;Oid;false;Oid;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;Oid;false;get_FriendlyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;Oid;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;Oid;false;set_FriendlyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;Oid;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;OidCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;OidCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;OidCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Cryptography;OidEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;PKCS1MaskGenerationMethod;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;PKCS1MaskGenerationMethod;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[2];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[4];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;PasswordDeriveBytes;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;PasswordDeriveBytes;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAEncryptionPadding;false;CreateOaep;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAEncryptionPadding;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAEncryptionPadding;false;get_OaepHashAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;RSAOAEPKeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;RSAOAEPKeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;RSAPKCS1KeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;get_RNG;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;set_RNG;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;RSAPKCS1KeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;RSAPKCS1SignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;RSAPKCS1SignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Cryptography;SafeEvpPKeyHandle;false;DuplicateHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Permissions;FileDialogPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;FileIOPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;PrincipalPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Permissions;PrincipalPermission;false;Intersect;(System.Security.IPermission);;Argument[0];ReturnValue;generated:taint", + "System.Security.Permissions;PrincipalPermission;false;Intersect;(System.Security.IPermission);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Permissions;PrincipalPermission;false;Union;(System.Security.IPermission);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Permissions;PublisherIdentityPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;ReflectionPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;SecurityPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;StrongNameIdentityPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;TypeDescriptorPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;UIPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Permissions;ZoneIdentityPermission;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Policy;HashMembershipCondition;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Policy;PolicyStatement;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Policy;PublisherMembershipCondition;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Policy;StrongNameMembershipCondition;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Policy;ZoneMembershipCondition;false;Copy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security.Principal;GenericIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.Security.Principal.GenericIdentity);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security.Principal;GenericIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Principal;GenericIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Principal;GenericIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security.Principal;GenericPrincipal;false;GenericPrincipal;(System.Security.Principal.IIdentity,System.String[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security.Principal;GenericPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;HostProtectionException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Security;PermissionSet;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;AddChild;(System.Security.SecurityElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;Attribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;SearchForChildByTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;SearchForTextOfTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;SecurityElement;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;get_Children;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Security;SecurityElement;false;set_Children;(System.Collections.ArrayList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;set_Tag;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityElement;false;set_Text;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Security;SecurityException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;Atom10FeedFormatter;false;WriteItem;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationItem,System.Uri);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;Atom10FeedFormatter;false;WriteItems;(System.Xml.XmlWriter,System.Collections.Generic.IEnumerable,System.Uri);;Argument[1].Element;Argument[0];generated:taint", + "System.ServiceModel.Syndication;AtomPub10CategoriesDocumentFormatter;false;AtomPub10CategoriesDocumentFormatter;(System.Type,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;AtomPub10CategoriesDocumentFormatter;false;AtomPub10CategoriesDocumentFormatter;(System.Type,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;AtomPub10ServiceDocumentFormatter;false;AtomPub10ServiceDocumentFormatter;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;CategoriesDocument;false;Create;(System.Collections.ObjectModel.Collection,System.Boolean,System.String);;Argument[0].Element;ReturnValue;generated:taint", + "System.ServiceModel.Syndication;CategoriesDocument;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;CategoriesDocument;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;CategoriesDocument;true;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;CategoriesDocumentFormatter;false;CategoriesDocumentFormatter;(System.ServiceModel.Syndication.CategoriesDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;CategoriesDocumentFormatter;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;CategoriesDocumentFormatter;true;SetDocument;(System.ServiceModel.Syndication.CategoriesDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;InlineCategoriesDocument;false;InlineCategoriesDocument;(System.Collections.Generic.IEnumerable,System.Boolean,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;InlineCategoriesDocument;false;get_Categories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;ResourceCollectionInfo;(System.ServiceModel.Syndication.TextSyndicationContent,System.Uri,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;ResourceCollectionInfo;(System.ServiceModel.Syndication.TextSyndicationContent,System.Uri,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;get_Accepts;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;get_Categories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ResourceCollectionInfo;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;Rss20FeedFormatter;false;SetFeed;(System.ServiceModel.Syndication.SyndicationFeed);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;Rss20FeedFormatter;false;WriteItem;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationItem,System.Uri);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;Rss20FeedFormatter;false;WriteItems;(System.Xml.XmlWriter,System.Collections.Generic.IEnumerable,System.Uri);;Argument[1].Element;Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocument;false;ServiceDocument;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;ServiceDocument;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocument;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ServiceDocument;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ServiceDocument;false;get_Workspaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;ServiceDocumentFormatter;(System.ServiceModel.Syndication.ServiceDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.CategoriesDocument,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.ResourceCollectionInfo,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.ServiceDocument,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.Workspace,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;ServiceDocumentFormatter;true;SetDocument;(System.ServiceModel.Syndication.ServiceDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationCategory;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationCategory;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationCategory;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationContent;false;CreateUrlContent;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationContent;false;CreateXmlContent;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationContent;false;WriteTo;(System.Xml.XmlWriter,System.String,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationContent;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;GetObject<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;GetObject<>;(System.Runtime.Serialization.XmlObjectSerializer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;GetObject<>;(System.Xml.Serialization.XmlSerializer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;GetReader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.Object,System.Xml.Serialization.XmlSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.Object,System.Xml.Serialization.XmlSerializer);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[2];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[3];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;SyndicationElementExtension;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;get_OuterName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtension;false;get_OuterNamespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.Object,System.Runtime.Serialization.DataContractSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.Object,System.Xml.Serialization.XmlSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[2];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;Add;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;GetReaderAtElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;InsertItem;(System.Int32,System.ServiceModel.Syndication.SyndicationElementExtension);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;ReadElementExtensions<>;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;ReadElementExtensions<>;(System.String,System.String,System.Runtime.Serialization.XmlObjectSerializer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;ReadElementExtensions<>;(System.String,System.String,System.Xml.Serialization.XmlSerializer);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationElementExtensionCollection;false;SetItem;(System.Int32,System.ServiceModel.Syndication.SyndicationElementExtension);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;Clone;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;SyndicationFeed;(System.ServiceModel.Syndication.SyndicationFeed,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;SyndicationFeed;(System.String,System.String,System.Uri,System.String,System.DateTimeOffset,System.Collections.Generic.IEnumerable);;Argument[4];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;SyndicationFeed;(System.String,System.String,System.Uri,System.String,System.DateTimeOffset,System.Collections.Generic.IEnumerable);;Argument[5].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_Authors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_Categories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_Contributors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_LastUpdatedTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;get_Links;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;set_Items;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeed;false;set_LastUpdatedTime;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;SyndicationFeedFormatter;(System.ServiceModel.Syndication.SyndicationFeed);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationCategory,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationFeed,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationItem,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationLink,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationPerson,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;false;get_Feed;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationFeedFormatter;true;SetFeed;(System.ServiceModel.Syndication.SyndicationFeed);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;SyndicationItem;(System.ServiceModel.Syndication.SyndicationItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;SyndicationItem;(System.String,System.ServiceModel.Syndication.SyndicationContent,System.Uri,System.String,System.DateTimeOffset);;Argument[4];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_Authors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_Categories;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_Contributors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_LastUpdatedTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_Links;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;get_PublishDate;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;set_LastUpdatedTime;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItem;false;set_PublishDate;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;SyndicationItemFormatter;(System.ServiceModel.Syndication.SyndicationItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationCategory,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationItem,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationLink,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.ServiceModel.Syndication.SyndicationPerson,System.String);;Argument[1];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;false;get_Item;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationItemFormatter;true;SetItem;(System.ServiceModel.Syndication.SyndicationItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;SyndicationLink;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationLink;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationLink;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationPerson;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;SyndicationPerson;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;SyndicationPerson;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;UrlSyndicationContent;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;UrlSyndicationContent;false;UrlSyndicationContent;(System.ServiceModel.Syndication.UrlSyndicationContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;UrlSyndicationContent;false;UrlSyndicationContent;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;UrlSyndicationContent;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;Workspace;false;Workspace;(System.ServiceModel.Syndication.TextSyndicationContent,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;Workspace;false;WriteAttributeExtensions;(System.Xml.XmlWriter,System.String);;Argument[Qualifier];Argument[0];generated:taint", + "System.ServiceModel.Syndication;Workspace;false;get_AttributeExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;Workspace;false;get_Collections;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;Workspace;false;get_ElementExtensions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;GetReaderAtContent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;XmlSyndicationContent;(System.ServiceModel.Syndication.XmlSyndicationContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;XmlSyndicationContent;(System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;XmlSyndicationContent;(System.String,System.Object,System.Xml.Serialization.XmlSerializer);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;XmlSyndicationContent;(System.String,System.ServiceModel.Syndication.SyndicationElementExtension);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;XmlSyndicationContent;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.ServiceModel.Syndication;XmlSyndicationContent;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Encodings.Web;TextEncoder;false;Encode;(System.IO.TextWriter,System.String);;Argument[1];Argument[0];generated:taint", + "System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.Char[],System.Int32,System.Int32);;Argument[1].Element;Argument[0];generated:taint", + "System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.String,System.Int32,System.Int32);;Argument[1];Argument[0];generated:taint", + "System.Text.Encodings.Web;TextEncoder;true;Encode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonArray;false;Add<>;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json.Nodes;JsonArray;false;Add<>;(T);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text.Json.Nodes;JsonArray;false;Create;(System.Text.Json.JsonElement,System.Nullable);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonArray;false;JsonArray;(System.Text.Json.Nodes.JsonNodeOptions,System.Text.Json.Nodes.JsonNode[]);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.Text.Json.Nodes;JsonArray;false;JsonArray;(System.Text.Json.Nodes.JsonNode[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;AsArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;AsObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;AsValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;Parse;(System.Text.Json.Utf8JsonReader,System.Nullable);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonNode;false;get_Root;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text.Json.Nodes;JsonNode;false;set_Parent;(System.Text.Json.Nodes.JsonNode);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json.Nodes;JsonObject;false;Create;(System.Text.Json.JsonElement,System.Nullable);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json.Nodes;JsonValue;false;Create<>;(T,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Nullable);;Argument[1];ReturnValue;generated:taint", + "System.Text.Json.Serialization.Metadata;JsonTypeInfo<>;false;get_SerializeHandler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Serialization;JsonSerializerContext;false;JsonSerializerContext;(System.Text.Json.JsonSerializerOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json.Serialization;JsonSerializerContext;false;JsonSerializerContext;(System.Text.Json.JsonSerializerOptions);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text.Json.Serialization;JsonSerializerContext;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json.Serialization;JsonStringEnumConverter;false;JsonStringEnumConverter;(System.Text.Json.JsonNamingPolicy,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json.SourceGeneration;JsonSourceGenerator;false;GetSerializableTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;Parse;(System.Buffers.ReadOnlySequence,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;Parse;(System.IO.Stream,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;Parse;(System.ReadOnlyMemory,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;ParseValue;(System.Text.Json.Utf8JsonReader);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;TryParseValue;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonDocument);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonDocument;false;get_RootElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement+ArrayEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text.Json;JsonElement;false;EnumerateArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;EnumerateObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;ParseValue;(System.Text.Json.Utf8JsonReader);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;TryGetProperty;(System.String,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;TryParseValue;(System.Text.Json.Utf8JsonReader,System.Nullable);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonElement;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonEncodedText;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text.Json;JsonException;false;JsonException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonException;false;JsonException;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonException;false;JsonException;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable,System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonReaderState;false;JsonReaderState;(System.Text.Json.JsonReaderOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonReaderState;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializer;false;Deserialize;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializer;false;Deserialize;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.Serialization.JsonSerializerContext);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializer;false;Deserialize<>;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializer;false;Deserialize<>;(System.Text.Json.Utf8JsonReader,System.Text.Json.Serialization.Metadata.JsonTypeInfo);;Argument[0];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializerOptions;false;JsonSerializerOptions;(System.Text.Json.JsonSerializerOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonSerializerOptions;false;get_DictionaryKeyPolicy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializerOptions;false;get_Encoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializerOptions;false;get_PropertyNamingPolicy;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializerOptions;false;get_ReferenceHandler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;JsonSerializerOptions;false;set_DictionaryKeyPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonSerializerOptions;false;set_Encoder;(System.Text.Encodings.Web.JavaScriptEncoder);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonSerializerOptions;false;set_PropertyNamingPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;JsonSerializerOptions;false;set_ReferenceHandler;(System.Text.Json.Serialization.ReferenceHandler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonReader;false;get_CurrentState;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;Utf8JsonReader;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Reset;(System.Buffers.IBufferWriter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Reset;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Text.Json;Utf8JsonWriter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;CaptureCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Group;false;Synchronized;(System.Text.RegularExpressions.Group);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;GroupCollection;false;TryGetValue;(System.String,System.Text.RegularExpressions.Group);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;GroupCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;GroupCollection;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Match;false;NextMatch;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Match;false;Synchronized;(System.Text.RegularExpressions.Match);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;MatchCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text.RegularExpressions;Regex;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;GroupNameFromNumber;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;IsMatch;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;IsMatch;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Match;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[1];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[3];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;Unescape;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;get_CapNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;get_Caps;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;Regex;false;set_CapNames;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;Regex;false;set_Caps;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[3];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[5];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;get_Pattern;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;set_MatchTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexCompilationInfo;false;set_Pattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexMatchTimeoutException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text.RegularExpressions;RegexParseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint", + "System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;ASCIIEncoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;ASCIIEncoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Decoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Decoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Decoder;false;set_Fallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;DecoderFallbackException;false;DecoderFallbackException;(System.String,System.Byte[],System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Text;DecoderFallbackException;false;get_BytesUnknown;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;DecoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;DecoderReplacementFallback;false;DecoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;DecoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;DecoderReplacementFallbackBuffer;false;DecoderReplacementFallbackBuffer;(System.Text.DecoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;Encoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Encoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Encoder;false;set_Fallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;EncoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;EncoderReplacementFallback;false;EncoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;EncoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;EncoderReplacementFallbackBuffer;false;EncoderReplacementFallbackBuffer;(System.Text.EncoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[]);;Argument[2].Element;ReturnValue;generated:taint", + "System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[],System.Int32,System.Int32);;Argument[2].Element;ReturnValue;generated:taint", + "System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[2];ReturnValue;generated:taint", + "System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];Argument[Qualifier];generated:taint", + "System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint", + "System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint", + "System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint", + "System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint", + "System.Text;Encoding;false;get_DecoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Encoding;false;get_EncoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Encoding;false;set_DecoderFallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;Encoding;false;set_EncoderFallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;Encoding;true;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;Encoding;true;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;EncodingExtensions;false;RemovePreamble;(System.Text.Encoding);;Argument[0];ReturnValue;generated:taint", + "System.Text;EncodingProvider;true;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint", + "System.Text;EncodingProvider;true;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint", + "System.Text;SpanLineEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;SpanLineEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;SpanRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;SpanRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendFormatted;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendFormatted<>;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendFormatted<>;(T,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendInterpolatedStringHandler;(System.Int32,System.Int32,System.Text.StringBuilder);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendInterpolatedStringHandler;(System.Int32,System.Int32,System.Text.StringBuilder,System.IFormatProvider);;Argument[2];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendInterpolatedStringHandler;(System.Int32,System.Int32,System.Text.StringBuilder,System.IFormatProvider);;Argument[3];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+AppendInterpolatedStringHandler;false;AppendLiteral;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Text;StringBuilder+ChunkEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder+ChunkEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Append;(System.IFormatProvider,System.Text.StringBuilder+AppendInterpolatedStringHandler);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Append;(System.Text.StringBuilder+AppendInterpolatedStringHandler);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;AppendLine;(System.IFormatProvider,System.Text.StringBuilder+AppendInterpolatedStringHandler);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;AppendLine;(System.Text.StringBuilder+AppendInterpolatedStringHandler);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Clear;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;GetChunks;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Byte);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Char);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[]);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Decimal);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Double);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Int16);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.SByte);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.Single);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt16);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt64);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Remove;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Replace;(System.Char,System.Char,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringBuilder;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;StringBuilder;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Text;StringRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;UTF32Encoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;UTF8Encoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;UTF8Encoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Text;UnicodeEncoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;ConcurrencyLimiter;false;AcquireCore;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;ConcurrencyLimiter;false;ConcurrencyLimiter;(System.Threading.RateLimiting.ConcurrencyLimiterOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.RateLimiting;ConcurrencyLimiter;false;WaitAsyncCore;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;MetadataName;false;Create<>;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Threading.RateLimiting;MetadataName<>;false;MetadataName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.RateLimiting;MetadataName<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;MetadataName<>;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;RateLimitLease;false;TryGetMetadata<>;(System.Threading.RateLimiting.MetadataName,T);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;RateLimitLease;true;GetAllMetadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;RateLimiter;false;Acquire;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;RateLimiter;false;WaitAsync;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.RateLimiting;TokenBucketRateLimiter;false;TokenBucketRateLimiter;(System.Threading.RateLimiting.TokenBucketRateLimiterOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchBlock<>;false;BatchBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BufferBlock<>;false;BufferBlock;(System.Threading.Tasks.Dataflow.DataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;BufferBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObservable<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObserver<>;(System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];Argument[1];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Post<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput);;Argument[1];Argument[0];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;SendAsync<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlock;false;TryReceive<>;(System.Threading.Tasks.Dataflow.IReceivableSourceBlock,TOutput);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_NameFormat;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_NameFormat;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;TransformBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];Argument[0];generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;OfferMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,T,System.Threading.Tasks.Dataflow.ISourceBlock,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ReleaseReservation;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[Qualifier];Argument[1];generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;get_Completion;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;GetResult;(System.Int16);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetException;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;ConcurrentExclusiveSchedulerPair;(System.Threading.Tasks.TaskScheduler,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ConcurrentScheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ExclusiveScheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ParallelLoopResult;false;get_LowestBreakIteration;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ParallelOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ParallelOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ParallelOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ParallelOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;Task;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;Delay;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;Delay;(System.TimeSpan,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;FromCanceled;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WaitAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WaitAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WaitAsync;(System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAll;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAll;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAny;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Threading.Tasks;Task;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task<>;false;WaitAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task<>;false;WaitAsync;(System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;Task<>;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait;(System.IAsyncDisposable,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait<>;(System.Collections.Generic.IAsyncEnumerable,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskCanceledException;false;TaskCanceledException;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskCanceledException;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskCompletionSource;false;TaskCompletionSource;(System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskCompletionSource;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskCompletionSource<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskCompletionSource<>;false;TrySetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskCompletionSource<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskExtensions;false;Unwrap;(System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskExtensions;false;Unwrap<>;(System.Threading.Tasks.Task>);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskFactory;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;TaskFactory<>;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;UnobservedTaskExceptionEventArgs;(System.AggregateException);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;FromResult<>;(TResult);;Argument[0];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ValueTask<>;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask<>;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ValueTask<>;false;ValueTask;(TResult);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading.Tasks;ValueTask<>;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.Int32,System.Threading.WaitHandle);;Argument[1];Argument[Qualifier];generated:taint", + "System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Exception,System.Int32,System.Threading.WaitHandle);;Argument[3];Argument[Qualifier];generated:taint", + "System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Int32,System.Threading.WaitHandle);;Argument[2];Argument[Qualifier];generated:taint", + "System.Threading;AbandonedMutexException;false;get_Mutex;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;CancellationToken;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;CancellationTokenSource;false;get_Token;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;CompressedStack;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Threading;CountdownEvent;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;ExecutionContext;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Threading;HostExecutionContextManager;false;SetHostExecutionContext;(System.Threading.HostExecutionContext);;Argument[0];ReturnValue;generated:taint", + "System.Threading;LazyInitializer;false;EnsureInitialized<>;(T);;Argument[0];ReturnValue;generated:taint", + "System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[2];ReturnValue;generated:taint", + "System.Threading;ManualResetEventSlim;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;PeriodicTimer;false;WaitForNextTickAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;SemaphoreSlim;false;get_AvailableWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;Thread;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;Thread;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading;ThreadExceptionEventArgs;false;ThreadExceptionEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading;ThreadExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;WaitHandle;false;set_SafeWaitHandle;(Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading;WaitHandle;true;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Threading;WaitHandle;true;set_Handle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint", + "System.Threading;WaitHandleExtensions;false;SetSafeWaitHandle;(System.Threading.WaitHandle,Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[1];Argument[0];generated:taint", + "System.Timers;Timer;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Timers;Timer;false;get_SynchronizingObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Timers;Timer;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint", + "System.Timers;Timer;false;set_SynchronizingObject;(System.ComponentModel.ISynchronizeInvoke);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;CommittableTransaction;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;CommittableTransaction;false;get_AsyncWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;EnlistDurable;(System.Guid,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint", + "System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;PromoteAndEnlistDurable;(System.Guid,System.Transactions.IPromotableSinglePhaseNotification,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;Rollback;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;Transaction;false;SetDistributedTransactionIdentifier;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint", + "System.Transactions;Transaction;false;get_PromoterType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;Transaction;false;get_TransactionInformation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;TransactionEventArgs;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;TransactionInformation;false;get_DistributedIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;TransactionOptions;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Transactions;TransactionOptions;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.EnterpriseServicesInteropOption);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint", + "System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint", + "System.Web;HttpUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Web;HttpUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint", + "System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint", + "System.Web;HttpUtility;false;UrlPathEncode;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;DescendantNodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;DescendantNodesAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;InDocumentOrder<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;Extensions;false;Nodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Linq;XAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XAttribute;false;get_NextAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XAttribute;false;get_PreviousAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XCData;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XCData;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XComment;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XComment;false;XComment;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XComment;false;XComment;(System.Xml.Linq.XComment);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XComment;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XComment;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XContainer;false;AddFirst;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XContainer;false;AddFirst;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XContainer;false;CreateWriter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;DescendantNodes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Descendants;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Descendants;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Element;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Elements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Elements;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;Nodes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XContainer;false;get_FirstNode;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XContainer;false;get_LastNode;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDeclaration;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;XDeclaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDeclaration;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XDocument;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XDocument;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;XDocument;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDeclaration,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocument;false;get_Declaration;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;get_Root;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocument;false;set_Declaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;XDocumentType;(System.Xml.Linq.XDocumentType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocumentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XDocumentType;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XDocumentType;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;AncestorsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;AncestorsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Attribute;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Attributes;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;DescendantNodesAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;DescendantsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;DescendantsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XElement;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;SetElementValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[Qualifier];Argument[1];generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XElement;false;get_FirstAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;get_LastAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XElement;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XName;false;Get;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XName;false;Get;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XName;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XName;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XName;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;op_Addition;(System.Xml.Linq.XNamespace,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XNamespace;false;op_Addition;(System.Xml.Linq.XNamespace,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XNode;false;Ancestors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;Ancestors;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;CreateReader;(System.Xml.Linq.ReaderOptions);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;ElementsAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;ElementsAfterSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;NodesAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;ReadFrom;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Linq;XNode;false;ReplaceWith;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XNode;false;ReplaceWith;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Linq;XNode;false;get_NextNode;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;AddAnnotation;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XObject;false;Annotation;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;Annotation<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;Annotations;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;Annotations<>;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.Xml.Linq.XProcessingInstruction);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XProcessingInstruction;false;set_Target;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml.Linq;XStreamingElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XStreamingElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Linq;XText;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Linq;XText;false;XText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XText;false;XText;(System.Xml.Linq.XText);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Linq;XText;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Linq;XText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Resolvers;XmlPreloadedResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Resolvers;XmlPreloadedResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Resolvers;XmlPreloadedResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XAttribute);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XElement);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;ValidationEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;ValidationEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlAtomicValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml.Schema;XmlAtomicValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlAtomicValue;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml.Schema;XmlAtomicValue;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlAtomicValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlAtomicValue;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlAtomicValue;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Elements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Includes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_TargetNamespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchema;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchema;false;set_TargetNamespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchema;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchema;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAll;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAnnotated;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAnnotation;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotation;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotation;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnnotation;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAnnotation;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAny;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAny;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAnyAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAnyAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAppInfo;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAppInfo;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAppInfo;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAppInfo;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;get_RedefinedAttributeGroup;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaAttributeGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaChoice;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaCollection;false;XmlSchemaCollection;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaCollection;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml.Schema;XmlSchemaComplexContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeUses;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeWildcard;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_ContentModel;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_ContentTypeParticle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;set_ContentModel;(System.Xml.Schema.XmlSchemaContentModel);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaComplexType;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;set_Language;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaDocumentation;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_ElementSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_ElementType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;get_SubstitutionGroup;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaElement;false;set_SubstitutionGroup;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaException;false;XmlSchemaException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaException;false;get_SourceSchemaObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;get_SchemaLocation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;set_Schema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;set_SchemaLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaExternal;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaFacet;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaFacet;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaGroup;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaGroup;false;set_Particle;(System.Xml.Schema.XmlSchemaGroupBase);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaGroupRef;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Fields;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Selector;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Selector;(System.Xml.Schema.XmlSchemaXPath);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaImport;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaImport;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaImport;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaImport;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInclude;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInclude;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];Argument[1];generated:taint", + "System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInferenceException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;get_SchemaAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;get_SchemaElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;set_MemberType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;set_SchemaAttribute;(System.Xml.Schema.XmlSchemaAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;set_SchemaElement;(System.Xml.Schema.XmlSchemaElement);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaInfo;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaKeyref;false;get_Refer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaKeyref;false;set_Refer;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;get_Public;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;get_System;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;set_Public;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaNotation;false;set_System;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;get_Namespaces;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;set_Namespaces;(System.Xml.Serialization.XmlSerializerNamespaces);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;set_Parent;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObject;false;set_SourceUri;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObjectCollection;false;Remove;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObjectCollection;false;XmlSchemaObjectCollection;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaObjectEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaObjectTable;false;get_Names;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaObjectTable;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaRedefine;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaRedefine;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaRedefine;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaRedefine;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSequence;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;Schemas;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;XmlSchemaSet;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;get_CompilationSettings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;get_GlobalAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;get_GlobalElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;get_GlobalTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;set_CompilationSettings;(System.Xml.Schema.XmlSchemaCompilationSettings);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSet;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleType;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleType;false;set_Content;(System.Xml.Schema.XmlSchemaSimpleTypeContent);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_BaseItemType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_BaseItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseMemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_MemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;set_MemberTypes;(System.Xml.XmlQualifiedName[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaType;false;get_BaseSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaType;false;get_BaseXmlSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaType;false;get_Datatype;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaType;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaValidationException;false;SetSourceObject;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidationException;false;get_SourceObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;AddSchema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;GetExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;GetExpectedParticles;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;Initialize;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;SkipToEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[3];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;ValidateWhitespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;get_LineInfoProvider;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;get_ValidationEventSender;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;set_LineInfoProvider;(System.Xml.IXmlLineInfo);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;set_SourceUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;set_ValidationEventSender;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaValidator;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Schema;XmlSchemaXPath;false;get_XPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Schema;XmlSchemaXPath;false;set_XPath;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;MakeUnique;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;CodeIdentifiers;false;ToArray;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;ImportContext;false;ImportContext;(System.Xml.Serialization.CodeIdentifiers,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;ImportContext;false;get_TypeIdentifiers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;ImportContext;false;get_Warnings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;SoapAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;get_SoapAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;get_SoapDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;get_SoapElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;get_SoapEnum;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;get_SoapType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapAttributes;false;set_SoapAttribute;(System.Xml.Serialization.SoapAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributes;false;set_SoapDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributes;false;set_SoapElement;(System.Xml.Serialization.SoapElementAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributes;false;set_SoapEnum;(System.Xml.Serialization.SoapEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapAttributes;false;set_SoapType;(System.Xml.Serialization.SoapTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapElementAttribute;false;SoapElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapEnumAttribute;false;SoapEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapIncludeAttribute;false;SoapIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[]);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapSchemaMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapSchemaMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapSchemaMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapSchemaMember;false;set_MemberType;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;SoapTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAnyElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAnyElementAttributes;false;Remove;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayAttribute;false;XmlArrayAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlArrayItemAttributes;false;Remove;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributeEventArgs;false;get_Attr;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeEventArgs;false;get_ExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlAnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlAnyElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlArray;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlArrayItems;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlChoiceIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlEnum;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlRoot;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlText;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlAnyAttribute;(System.Xml.Serialization.XmlAnyAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlArray;(System.Xml.Serialization.XmlArrayAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlAttribute;(System.Xml.Serialization.XmlAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlEnum;(System.Xml.Serialization.XmlEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlRoot;(System.Xml.Serialization.XmlRootAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlText;(System.Xml.Serialization.XmlTextAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlAttributes;false;set_XmlType;(System.Xml.Serialization.XmlTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;XmlChoiceIdentifierAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownAttribute;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownNode;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementAttributes;false;Remove;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlElementEventArgs;false;get_Element;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementEventArgs;false;get_ExpectedElements;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlElementEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlEnumAttribute;false;XmlEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlIncludeAttribute;false;XmlIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlMapping;false;SetKey;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlMapping;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlMapping;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlMapping;false;get_XsdElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlMemberMapping;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlMembersMapping;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlNodeEventArgs;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlNodeEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlNodeEventArgs;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlNodeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlNodeEventArgs;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;get_SoapAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;get_XmlAttributes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;set_MemberType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;set_SoapAttributes;(System.Xml.Serialization.SoapAttributes);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlReflectionMember;false;set_XmlAttributes;(System.Xml.Serialization.XmlAttributes);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;XmlRootAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlRootAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaEnumerator;false;XmlSchemaEnumerator;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaExporter;false;XmlSchemaExporter;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaProviderAttribute;false;XmlSchemaProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemaProviderAttribute;false;get_MethodName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[0];generated:taint", + "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemas;false;OnInsert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemas;false;OnSet;(System.Int32,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSchemas;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Collection;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_CollectionItems;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Ids;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader+Fixup;false;set_Source;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+CollectionFixup);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+Fixup);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;AddTarget;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;CollapseWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;EnsureArrayIndex;(System.Array,System.Int32,System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;GetTarget;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadNullableString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReference;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.Boolean,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ReadTypedPrimitive;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ShrinkArray;(System.Array,System.Int32,System.Type,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ToByteArrayBase64;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ToXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ToXmlName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayBase64;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayHex;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[]);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[],System.String);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementEncoded;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementLiteral;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteId;(System.Object);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncoded;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteral;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteTypedPrimitive;(System.String,System.String,System.Object,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode,System.Object);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializationWriter;false;set_Writer;(System.Xml.XmlWriter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[Qualifier];Argument[2];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[]);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[3];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[4];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;XmlSerializerVersionAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_ParentAssemblyId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_ParentAssemblyId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTextAttribute;false;XmlTextAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTextAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlTextAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlTextAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTextAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTypeAttribute;false;XmlTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Serialization;XmlTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Serialization;XmlTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[1];ReturnValue;generated:taint", + "System.Xml.XPath;XDocumentExtensions;false;ToXPathNavigable;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathDocument;false;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathDocument;false;XPathDocument;(System.Xml.XmlReader,System.Xml.XmlSpace);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.XPath;XPathException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.XPath;XPathException;false;XPathException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.XPath;XPathException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathExpression;false;Compile;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml.XPath;XPathItem;true;ValueAs;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;Compile;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;GetNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;Select;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;SelectSingleNode;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;WriteSubtree;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.XPath;XPathNavigator;true;get_InnerXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;get_OuterXml;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNavigator;true;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.XPath;XPathNodeIterator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;AncestorDocOrderIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;AncestorIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;AncestorIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;AncestorIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;AttributeContentIterator;false;Create;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;AttributeContentIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;AttributeIterator;false;Create;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;AttributeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;ContentIterator;false;Create;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ContentIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;ContentMergeIterator;false;Create;(System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ContentMergeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;DescendantIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DescendantIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DescendantIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;DescendantMergeIterator;false;Create;(System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DescendantMergeIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DescendantMergeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;DifferenceIterator;false;Create;(System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DifferenceIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DifferenceIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;DodSequenceMerge;false;AddSequence;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DodSequenceMerge;false;Create;(System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;DodSequenceMerge;false;MergeSequences;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;ElementContentIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ElementContentIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ElementContentIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ElementContentIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;FollowingSiblingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;FollowingSiblingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;FollowingSiblingIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;FollowingSiblingMergeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;IdIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;IdIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;IdIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;IntersectIterator;false;Create;(System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;IntersectIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;IntersectIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;NamespaceIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;NodeKindContentIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.XPath.XPathNodeType);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;NodeKindContentIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;NodeRangeIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;NodeRangeIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Xml.XPath.XPathNavigator);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;NodeRangeIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter,System.Xml.XPath.XPathNavigator);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;NodeRangeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;ParentIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;ParentIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;PrecedingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;PrecedingIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingDocOrderIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingDocOrderIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingDocOrderIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;PrecedingSiblingIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;StringConcat;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;StringConcat;false;get_Delimiter;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;StringConcat;false;set_Delimiter;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;UnionIterator;false;Create;(System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;UnionIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;UnionIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingMergeIterator;false;Create;(System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingMergeIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathFollowingMergeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingDocOrderIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingDocOrderIterator;false;Create;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingDocOrderIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingMergeIterator;false;Create;(System.Xml.Xsl.Runtime.XmlNavigatorFilter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingMergeIterator;false;MoveNext;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XPathPrecedingMergeIterator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;BooleanToAtomicValue;(System.Boolean,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;BytesToAtomicValue;(System.Byte[],System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;BytesToAtomicValue;(System.Byte[],System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;DateTimeToAtomicValue;(System.DateTime,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;DateTimeToAtomicValue;(System.DateTime,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;DecimalToAtomicValue;(System.Decimal,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;DoubleToAtomicValue;(System.Double,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;Int32ToAtomicValue;(System.Int32,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;Int64ToAtomicValue;(System.Int64,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;ItemsToNavigators;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;NavigatorsToItems;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;SingleToAtomicValue;(System.Single,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;StringToAtomicValue;(System.String,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;StringToAtomicValue;(System.String,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;TimeSpanToAtomicValue;(System.TimeSpan,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;TimeSpanToAtomicValue;(System.TimeSpan,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;XmlQualifiedNameToAtomicValue;(System.Xml.XmlQualifiedName,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlILStorageConverter;false;XmlQualifiedNameToAtomicValue;(System.Xml.XmlQualifiedName,System.Int32,System.Xml.Xsl.Runtime.XmlQueryRuntime);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;GetDataSource;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;GetLateBoundObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;GetParameter;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;get_DefaultDataSource;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;get_DefaultNameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryContext;false;get_QueryNameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryItemSequence;false;AddClone;(System.Xml.XPath.XPathItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryItemSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryItemSequence);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryItemSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryItemSequence,System.Xml.XPath.XPathItem);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryItemSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryItemSequence,System.Xml.XPath.XPathItem);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryItemSequence;false;XmlQueryItemSequence;(System.Xml.XPath.XPathItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;AddClone;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryNodeSequence);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryNodeSequence,System.Xml.XPath.XPathNavigator);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQueryNodeSequence,System.Xml.XPath.XPathNavigator);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;DocOrderDistinct;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;XmlQueryNodeSequence;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryNodeSequence;false;XmlQueryNodeSequence;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;StartCopy;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteItem;(System.Xml.XPath.XPathItem);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteProcessingInstruction;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartAttributeComputed;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartAttributeComputed;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartAttributeComputed;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartAttributeLocalName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartElementComputed;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartElementComputed;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartElementComputed;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartNamespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;WriteStartProcessingInstruction;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryOutput;false;XsltCopyOf;(System.Xml.XPath.XPathNavigator);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;ChangeTypeXsltArgument;(System.Int32,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;ChangeTypeXsltResult;(System.Int32,System.Object);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;DebugGetGlobalNames;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;DebugGetGlobalValue;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;DebugGetXsltValue;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;DebugSetGlobalValue;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;DocOrderDistinct;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;EndRtfConstruction;(System.Xml.Xsl.Runtime.XmlQueryOutput);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;EndSequenceConstruction;(System.Xml.Xsl.Runtime.XmlQueryOutput);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;FindIndex;(System.Xml.XPath.XPathNavigator,System.Int32,System.Xml.Xsl.Runtime.XmlILIndex);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;GetAtomizedName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;GetCollation;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;GetEarlyBoundObject;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;GetGlobalValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;GetNameFilter;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;SetGlobalValue;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;StartRtfConstruction;(System.String,System.Xml.Xsl.Runtime.XmlQueryOutput);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;StartRtfConstruction;(System.String,System.Xml.Xsl.Runtime.XmlQueryOutput);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;StartSequenceConstruction;(System.Xml.Xsl.Runtime.XmlQueryOutput);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;TextRtfConstruction;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;TextRtfConstruction;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;get_ExternalContext;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;get_Output;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQueryRuntime;false;get_XsltFunctions;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;Add;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQuerySequence<>);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQuerySequence<>,T);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;CreateOrReuse;(System.Xml.Xsl.Runtime.XmlQuerySequence<>,T);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;XmlQuerySequence;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;XmlQuerySequence;(T[],System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml.Xsl.Runtime;XmlQuerySequence<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml.Xsl.Runtime;XmlSortKeyAccumulator;false;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;EnsureNodeSet;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToNode;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToNode;(System.Xml.XPath.XPathItem);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToNodeSet;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToNodeSet;(System.Xml.XPath.XPathItem);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToString;(System.Collections.Generic.IList);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltConvert;false;ToString;(System.Xml.XPath.XPathItem);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;BaseUri;(System.Xml.XPath.XPathNavigator);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;MSLocalName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;MSNamespaceUri;(System.String,System.Xml.XPath.XPathNavigator);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;NormalizeSpace;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;OuterXml;(System.Xml.XPath.XPathNavigator);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;Substring;(System.String,System.Double);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;Substring;(System.String,System.Double,System.Double);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;SubstringAfter;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;SubstringBefore;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;SubstringBefore;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltFunctions;false;Translate;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltLibrary;false;FormatMessage;(System.String,System.Collections.Generic.IList);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltLibrary;false;FormatMessage;(System.String,System.Collections.Generic.IList);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml.Xsl.Runtime;XsltLibrary;false;NumberFormat;(System.Collections.Generic.IList,System.String,System.Double,System.String,System.String,System.Double);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl;XslCompiledTransform;false;Load;(System.Reflection.MethodInfo,System.Byte[],System.Type[]);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XslTransform;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl;XsltArgumentList;false;GetExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XsltArgumentList;false;GetParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XsltArgumentList;false;RemoveExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XsltArgumentList;false;RemoveParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XsltCompileException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Xsl;XsltException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml.Xsl;XsltException;false;XsltException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml.Xsl;XsltException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml.Xsl;XsltException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;NameTable;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;NameTable;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;NameTable;false;Get;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;NameTable;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;UniqueId;false;UniqueId;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;UniqueId;false;UniqueId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttribute;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlAttribute;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlAttribute;false;get_OwnerElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttribute;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;Remove;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlAttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.String,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlCDataSection;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlCDataSection;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlCharacterData;false;XmlCharacterData;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlCharacterData;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlCharacterData;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlCharacterData;true;AppendData;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlCharacterData;true;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlCharacterData;true;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlCharacterData;true;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlComment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;DecodeName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;EncodeLocalName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;EncodeName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;EncodeNmToken;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyNCName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyNMTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyPublicId;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlConvert;false;VerifyXmlChars;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;GetElementFromRow;(System.Data.DataRow);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;GetRowFromElement;(System.Xml.XmlElement);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDataDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDataDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDataDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDataDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDataDocument;false;XmlDataDocument;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDataDocument;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDeclaration;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDeclaration;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDeclaration;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionary;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionary;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionary;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionary;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[3];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[5];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateDictionaryReader;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadContentAsString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadElementContentAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadElementContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;false;ReadString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;GetAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;GetNonAtomizedNames;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadArray;(System.String,System.String,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsQualifiedName;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryReader;true;ReadElementContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryString;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;CreateDictionaryWriter;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteBase64Async;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteNode;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;false;WriteStartAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteQualifiedName;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteStartAttribute;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteString;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteTextNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteValue;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateDocumentFragment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateEntityReference;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDocument;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDocument;false;XmlDocument;(System.Xml.XmlImplementation);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocument;false;get_DocumentElement;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;get_Implementation;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocument;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocument;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentFragment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentFragment;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDocumentFragment;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlDocumentFragment;false;XmlDocumentFragment;(System.Xml.XmlDocument);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentType;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlDocumentType;false;get_Entities;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentType;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetAttributeNode;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;RemoveAttributeAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;RemoveAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;RemoveAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlElement;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlElement;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlElement;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlEntity;false;get_NotationName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlEntity;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlEntity;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlEntityReference;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlEntityReference;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlEntityReference;false;XmlEntityReference;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlException;false;XmlException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlImplementation;false;CreateDocument;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlImplementation;false;XmlImplementation;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlNamedNodeMap;false;Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamespaceManager;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamespaceManager;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamespaceManager;false;XmlNamespaceManager;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlNamespaceManager;false;get_DefaultNamespace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNamespaceManager;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;GetNamespaceOfPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;GetPrefixOfNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[1].Element;generated:taint", + "System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint", + "System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System.Xml;XmlNode;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNode;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[2].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[4];Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;get_NewParent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;get_NewValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;get_Node;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;get_OldParent;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeChangedEventArgs;false;get_OldValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeList;true;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;XmlNodeReader;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlNodeReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNodeReader;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNotation;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlNotation;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[1].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[4];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[5];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[6];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[7];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[9];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_DocTypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_NamespaceManager;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlParserContext;false;set_BaseURI;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_DocTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_NamespaceManager;(System.Xml.XmlNamespaceManager);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlParserContext;false;set_XmlLang;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlProcessingInstruction;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlProcessingInstruction;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlProcessingInstruction;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsDateTime;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsObject;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementContentAsString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadElementString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReader;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReaderSettings;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlReaderSettings;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlReaderSettings;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlReaderSettings;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlSecureResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlSecureResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlSecureResolver;false;XmlSecureResolver;(System.Xml.XmlResolver,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlSecureResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlSignificantWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlSignificantWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlSignificantWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlText;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlText;false;SplitText;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;GetRemainder;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.IO.TextReader,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;XmlTextReader;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextReader;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextReader;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextWriter;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextWriter;false;WriteStartAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlTextWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlTextWriter;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlUrlResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlUrlResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlUrlResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlUrlResolver;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlValidatingReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlValidatingReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlValidatingReader;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint", + "System.Xml;XmlWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.String,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.Text.StringBuilder,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteAttributeStringAsync;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteStartAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;false;WriteStartAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteAttributes;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteAttributesAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteNmToken;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteNode;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteNode;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteQualifiedName;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriter;true;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriterSettings;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlWriterSettings;false;get_IndentChars;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlWriterSettings;false;get_NewLineChars;();;Argument[Qualifier];ReturnValue;generated:taint", + "System.Xml;XmlWriterSettings;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriterSettings;false;set_IndentChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System.Xml;XmlWriterSettings;false;set_NewLineChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;AggregateException;false;AggregateException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;AggregateException;false;AggregateException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System;AggregateException;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;AggregateException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;AggregateException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;AggregateException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;AppDomain;false;ApplyPolicy;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;ArgumentException;false;ArgumentException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;ArgumentException;false;ArgumentException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;ArgumentException;false;ArgumentException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System;ArgumentException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;ArgumentException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArgumentException;false;get_ParamName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.String,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;ArgumentOutOfRangeException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;ArgumentOutOfRangeException;false;get_ActualValue;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArgumentOutOfRangeException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Array;false;Fill<>;(T[],T);;Argument[1];Argument[0].Element;generated:taint", + "System;Array;false;Fill<>;(T[],T,System.Int32,System.Int32);;Argument[1];Argument[0].Element;generated:taint", + "System;Array;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value", + "System;ArraySegment<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArraySegment<>;false;ArraySegment;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;ArraySegment<>;false;ArraySegment;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArraySegment<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArraySegment<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArraySegment<>;false;get_Array;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ArraySegment<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;BadImageFormatException;false;BadImageFormatException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System;BadImageFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;BadImageFormatException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;BadImageFormatException;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;BadImageFormatException;false;get_FusionLog;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;BadImageFormatException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;BinaryData;false;BinaryData;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint", + "System;BinaryData;false;BinaryData;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;BinaryData;false;FromBytes;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System;BinaryData;false;FromString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;BinaryData;false;ToMemory;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;BinaryData;false;ToStream;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;CultureAwareComparer;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;DBNull;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;DateOnly;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;DateOnly;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;DateTime;false;GetDateTimeFormats;(System.Char,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;DateTime;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value", + "System;DateTime;false;ToLocalTime;();;Argument[Qualifier];ReturnValue;generated:value", + "System;DateTime;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;DateTime;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;DateTime;false;ToUniversalTime;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;DateTimeOffset;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;DateTimeOffset;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;DateTimeOffset;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;Decimal;false;ToDecimal;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value", + "System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint", + "System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[1];ReturnValue;generated:taint", + "System;Delegate;false;Combine;(System.Delegate[]);;Argument[0].Element;ReturnValue;generated:taint", + "System;Delegate;false;CreateDelegate;(System.Type,System.Reflection.MethodInfo,System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System;Delegate;false;Delegate;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;Delegate;false;Delegate;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;Delegate;false;Delegate;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;Delegate;false;Delegate;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;Delegate;false;DynamicInvoke;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System;Delegate;false;Remove;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint", + "System;Delegate;false;RemoveAll;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint", + "System;Delegate;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Delegate;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Delegate;true;DynamicInvokeImpl;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System;Delegate;true;GetInvocationList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Delegate;true;GetMethodImpl;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Delegate;true;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Double;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;Double;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;Double;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;Enum;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System;Enum;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Environment;false;ExpandEnvironmentVariables;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;Exception;false;Exception;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;Exception;false;Exception;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;Exception;false;Exception;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint", + "System;Exception;false;Exception;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint", + "System;Exception;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;Exception;false;get_HelpLink;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;get_InnerException;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;get_StackTrace;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;get_TargetSite;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Exception;false;set_HelpLink;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;Exception;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;FormattableString;false;CurrentCulture;(System.FormattableString);;Argument[0];ReturnValue;generated:taint", + "System;FormattableString;false;Invariant;(System.FormattableString);;Argument[0];ReturnValue;generated:taint", + "System;FormattableString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;FormattableString;false;ToString;(System.String,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Half;false;BitDecrement;(System.Half);;Argument[0];ReturnValue;generated:taint", + "System;Half;false;BitIncrement;(System.Half);;Argument[0];ReturnValue;generated:taint", + "System;Half;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;Half;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;IntPtr;false;Abs;(System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;IntPtr;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[2];ReturnValue;generated:taint", + "System;IntPtr;false;Create<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;CreateSaturating<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;CreateTruncating<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;IntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint", + "System;IntPtr;false;Max;(System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;Max;(System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;IntPtr;false;Min;(System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;IntPtr;false;Min;(System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;IntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;IntPtr;false;TryCreate<>;(TOther,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Lazy<,>;false;Lazy;(TMetadata);;Argument[0];Argument[Qualifier];generated:taint", + "System;Lazy<,>;false;Lazy;(TMetadata,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System;Lazy<,>;false;Lazy;(TMetadata,System.Threading.LazyThreadSafetyMode);;Argument[0];Argument[Qualifier];generated:taint", + "System;Lazy<,>;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Lazy<>;false;Lazy;(T);;Argument[0];Argument[Qualifier];generated:taint", + "System;Lazy<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Math;false;Abs;(System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.IntPtr,System.IntPtr,System.IntPtr);;Argument[2];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Math;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[2];ReturnValue;generated:taint", + "System;Math;false;Max;(System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Max;(System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Math;false;Max;(System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Max;(System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Math;false;Min;(System.IntPtr,System.IntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Min;(System.IntPtr,System.IntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Math;false;Min;(System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;Math;false;Min;(System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;Memory<>;false;Memory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;Memory<>;false;Memory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;Memory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Memory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Memory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MemoryExtensions+TryWriteInterpolatedStringHandler;false;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System;MemoryExtensions+TryWriteInterpolatedStringHandler;false;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.IFormatProvider,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint", + "System;MemoryExtensions+TryWriteInterpolatedStringHandler;false;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.IFormatProvider,System.Boolean);;Argument[3];Argument[Qualifier];generated:taint", + "System;MemoryExtensions;false;AsMemory;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory;(System.String,System.Index);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory;(System.String,System.Range);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(T[],System.Index);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;AsMemory<>;(T[],System.Range);;Argument[0].Element;ReturnValue;generated:taint", + "System;MemoryExtensions;false;EnumerateLines;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim;(System.Memory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;Trim<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd;(System.Memory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimEnd<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart;(System.Memory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MemoryExtensions;false;TrimStart<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint", + "System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;MissingFieldException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MissingMemberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;MissingMemberException;false;MissingMemberException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;MissingMemberException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;MissingMethodException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MulticastDelegate;false;CombineImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value", + "System;MulticastDelegate;false;DynamicInvokeImpl;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint", + "System;MulticastDelegate;false;GetInvocationList;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MulticastDelegate;false;GetMethodImpl;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;MulticastDelegate;false;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value", + "System;NotFiniteNumberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;Nullable;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint", + "System;Nullable<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ObjectDisposedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;ObjectDisposedException;false;ObjectDisposedException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;ObjectDisposedException;false;ObjectDisposedException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;ObjectDisposedException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ObjectDisposedException;false;get_ObjectName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperatingSystem;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperatingSystem;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperatingSystem;false;get_ServicePack;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperatingSystem;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperatingSystem;false;get_VersionString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Exception,System.Threading.CancellationToken);;Argument[2];Argument[Qualifier];generated:taint", + "System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Threading.CancellationToken);;Argument[1];Argument[Qualifier];generated:taint", + "System;OperationCanceledException;false;OperationCanceledException;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System;OperationCanceledException;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;OperationCanceledException;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint", + "System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint", + "System;ReadOnlyMemory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;ReadOnlyMemory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint", + "System;ReadOnlyMemory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ReadOnlySpan<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;RuntimeFieldHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;RuntimeMethodHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;RuntimeTypeHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;SequencePosition;false;GetObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;SequencePosition;false;SequencePosition;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint", + "System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;Span<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;EnumerateRunes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;Replace;(System.String,System.String,System.Boolean,System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[1];ReturnValue;generated:taint", + "System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;ReplaceLineEndings;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;ReplaceLineEndings;(System.String);;Argument[Qualifier];ReturnValue;generated:value", + "System;String;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;String;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint", + "System;StringNormalizationExtensions;false;Normalize;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;StringNormalizationExtensions;false;Normalize;(System.String,System.Text.NormalizationForm);;Argument[0];ReturnValue;generated:taint", + "System;TimeOnly;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint", + "System;TimeOnly;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint", + "System;TimeSpan;false;op_UnaryPlus;(System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System;TimeZone;true;ToLocalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint", + "System;TimeZone;true;ToUniversalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[1];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[2];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[3];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[4];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[1];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[2];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[3];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[4];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime,System.TimeSpan);;Argument[5];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_BaseUtcOffsetDelta;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_DateEnd;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_DateStart;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_DaylightDelta;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionEnd;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionStart;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo+TransitionTime;false;CreateFixedDateRule;(System.DateTime,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo+TransitionTime;false;CreateFloatingDateRule;(System.DateTime,System.Int32,System.Int32,System.DayOfWeek);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo+TransitionTime;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;TimeZoneInfo+TransitionTime;false;get_TimeOfDay;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTimeFromUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[1];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[2];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[3];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[1];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[2];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[3];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[4];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[5].Element;ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[1];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[2];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[3];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[4];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[5].Element;ReturnValue;generated:taint", + "System;TimeZoneInfo;false;FindSystemTimeZoneById;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;TimeZoneInfo;false;GetUtcOffset;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;GetUtcOffset;(System.DateTimeOffset);;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;get_BaseUtcOffset;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;get_DaylightName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TimeZoneInfo;false;get_StandardName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,,>;false;get_Rest;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Tuple<>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToTuple<>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;TupleExtensions;false;ToValueTuple<>;(System.Tuple);;Argument[0];ReturnValue;generated:taint", + "System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetConstructor;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetConstructors;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetInterface;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMember;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMembers;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Int32,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Int32,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethod;(System.String,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetNestedTypes;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;GetProperty;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;MakeGenericSignatureType;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint", + "System;Type;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;false;get_TypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;true;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;true;GetMember;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;true;GetMemberWithSameMetadataDefinitionAs;(System.Reflection.MemberInfo);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Type;true;get_GenericTypeArguments;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TypeInitializationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;TypeInitializationException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;TypeLoadException;false;TypeLoadException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;TypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;TypeLoadException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UIntPtr;false;Abs;(System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;UIntPtr;false;Clamp;(System.UIntPtr,System.UIntPtr,System.UIntPtr);;Argument[2];ReturnValue;generated:taint", + "System;UIntPtr;false;Create<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;CreateSaturating<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;CreateTruncating<>;(TOther);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;Max;(System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;Max;(System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;UIntPtr;false;Min;(System.UIntPtr,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;Min;(System.UIntPtr,System.UIntPtr);;Argument[1];ReturnValue;generated:taint", + "System;UIntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UIntPtr;false;TryCreate<>;(TOther,System.UIntPtr);;Argument[0];ReturnValue;generated:taint", + "System;UIntPtr;false;UIntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint", + "System;UnhandledExceptionEventArgs;false;UnhandledExceptionEventArgs;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System;UnhandledExceptionEventArgs;false;get_ExceptionObject;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UnitySerializationHolder;false;UnitySerializationHolder;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;EscapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;EscapeString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;EscapeUriString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;GetComponents;(System.UriComponents,System.UriFormat);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;GetLeftPart;(System.UriPartial);;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;Uri;false;MakeRelative;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;MakeRelativeUri;(System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.String,System.UriCreationOptions,System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.String,System.UriKind,System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[1];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[1];ReturnValue;generated:taint", + "System;Uri;false;UnescapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint", + "System;Uri;false;Uri;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.String,System.UriCreationOptions);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[1];Argument[Qualifier];generated:taint", + "System;Uri;false;get_Authority;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_DnsSafeHost;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_IdnHost;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_LocalPath;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;Uri;false;get_UserInfo;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;UriBuilder;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;UriBuilder;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;get_Fragment;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Query;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;UriBuilder;false;set_Fragment;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_Query;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_Scheme;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriBuilder;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint", + "System;UriFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint", + "System;UriParser;false;Register;(System.UriParser,System.String,System.Int32);;Argument[1];Argument[0];generated:taint", + "System;UriParser;true;GetComponents;(System.Uri,System.UriComponents,System.UriFormat);;Argument[0];ReturnValue;generated:taint", + "System;UriParser;true;OnNewUri;();;Argument[Qualifier];ReturnValue;generated:value", + "System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[0];ReturnValue;generated:taint", + "System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[1];ReturnValue;generated:taint", + "System;UriTypeConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint", + "System;UriTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint", + "System;ValueTuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint", + "System;ValueTuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint" + ] + } +} diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll index 55136cd4243..3f92a46c254 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll @@ -54,8 +54,8 @@ private class SystemCollectionsIEnumerableClearFlow extends SummarizedCallable { this.hasName("Clear") } - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isThisParameter() and + override predicate clearsContent(ParameterPosition pos, DataFlow::ContentSet content) { + (if this.(Modifiable).isStatic() then pos.getPosition() = 0 else pos.isThisParameter()) and content instanceof DataFlow::ElementContent } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll index c2453755d69..349fd65750f 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll @@ -2,14 +2,14 @@ * Provides classes related to the namespace `System.Linq`. */ -private import csharp as csharp +private import csharp as CSharp private import semmle.code.csharp.frameworks.System as System private import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow /** Definitions relating to the `System.Linq` namespace. */ module SystemLinq { /** The `System.Linq` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { this.getParentNamespace() instanceof System::SystemNamespace and this.hasUndecoratedName("Linq") @@ -17,7 +17,7 @@ module SystemLinq { } /** A class in the `System.Linq` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } @@ -26,10 +26,10 @@ module SystemLinq { SystemLinqEnumerableClass() { this.hasName("Enumerable") } /** Gets a `Count()` method. */ - csharp::ExtensionMethod getACountMethod() { result = this.getAMethod("Count<>") } + CSharp::ExtensionMethod getACountMethod() { result = this.getAMethod("Count<>") } /** Gets an `Any()` method. */ - csharp::ExtensionMethod getAnAnyMethod() { result = this.getAMethod("Any<>") } + CSharp::ExtensionMethod getAnAnyMethod() { result = this.getAMethod("Any<>") } } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll index 22d0923aa9d..11c541a0f79 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll @@ -32,7 +32,7 @@ private class SystemTextStringBuilderClearFlow extends SummarizedCallable { this = any(SystemTextStringBuilderClass s).getAMethod("Clear") } - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + override predicate clearsContent(ParameterPosition pos, DataFlow::ContentSet content) { pos.isThisParameter() and content instanceof DataFlow::ElementContent } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll index e35bbc341ac..0901b400362 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll @@ -2,14 +2,14 @@ * Provides classes related to the namespace `System.Data.Common`. */ -private import csharp as csharp +private import csharp as CSharp private import semmle.code.csharp.frameworks.system.Data as Data private import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow /** Definitions relating to the `System.Data.Common` namespace. */ module SystemDataCommon { /** The `System.Data.Common` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { this.getParentNamespace() instanceof Data::SystemDataNamespace and this.hasName("Common") @@ -17,7 +17,7 @@ module SystemDataCommon { } /** A class in the `System.Data.Common` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll index 5109db04af6..a5067d860ed 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll @@ -2,13 +2,13 @@ * Provides classes related to the Entity Framework namespace `System.Data.Entity`. */ -private import csharp as csharp +private import csharp as CSharp private import semmle.code.csharp.frameworks.system.Data as Data /** Definitions relating to the `System.Data.Entity` namespace. */ module SystemDataEntity { /** The `System.Data.Entity` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { this.getParentNamespace() instanceof Data::SystemDataNamespace and this.hasName("Entity") @@ -16,7 +16,7 @@ module SystemDataEntity { } /** A class in the `System.Data.Entity` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } @@ -25,28 +25,28 @@ module SystemDataEntity { Database() { this.hasName("Database") } /** Gets the `ExecuteSqlCommand` method. */ - csharp::Method getExecuteSqlCommandMethod() { result = this.getAMethod("ExecuteSqlCommand") } + CSharp::Method getExecuteSqlCommandMethod() { result = this.getAMethod("ExecuteSqlCommand") } /** Gets the `ExecuteSqlCommandAsync` method. */ - csharp::Method getExecuteSqlCommandAsyncMethod() { + CSharp::Method getExecuteSqlCommandAsyncMethod() { result = this.getAMethod("ExecuteSqlCommandAsync") } /** Gets the `SqlQuery` method. */ - csharp::Method getSqlQueryMethod() { result = this.getAMethod("SqlQuery") } + CSharp::Method getSqlQueryMethod() { result = this.getAMethod("SqlQuery") } } /** The `System.Data.Entity.DbSet` class. */ class DbSet extends Class { DbSet() { - this.getUnboundDeclaration().(csharp::UnboundGenericClass).getUndecoratedName() = "DbSet" + this.getUnboundDeclaration().(CSharp::UnboundGenericClass).getUndecoratedName() = "DbSet" } /** Gets the `SqlQuery` method. */ - csharp::Method getSqlQueryMethod() { result = this.getAMethod("SqlQuery") } + CSharp::Method getSqlQueryMethod() { result = this.getAMethod("SqlQuery") } /** Gets the `DbSet` type, if any. */ - csharp::Type getDbSetType() { result = this.(csharp::ConstructedType).getTypeArgument(0) } + CSharp::Type getDbSetType() { result = this.(CSharp::ConstructedType).getTypeArgument(0) } } /** The `System.Data.Entity.DbContext` class. */ @@ -55,23 +55,23 @@ module SystemDataEntity { } /** A user provided sub type of `DbContext`. */ - class CustomDbContext extends csharp::Class { + class CustomDbContext extends CSharp::Class { CustomDbContext() { this.fromSource() and this.getABaseType+() instanceof DbContext } /** Gets a property that has the type `DbSet`. */ - csharp::Property getADbSetProperty() { + CSharp::Property getADbSetProperty() { result = this.getAProperty() and result.getType() instanceof DbSet } } /** An Entity Framework entity, as referenced from a `CustomDbContext`. */ - class Entity extends csharp::Class { + class Entity extends CSharp::Class { Entity() { - exists(CustomDbContext dbContext, csharp::Property p | + exists(CustomDbContext dbContext, CSharp::Property p | p = dbContext.getADbSetProperty() and this = p.getType().(DbSet).getDbSetType() ) @@ -82,7 +82,7 @@ module SystemDataEntity { /** Definitions relating to the `System.Data.Entity.Infrastructure` namespace. */ module SystemDataEntityInfrastructure { /** The `System.Data.Entity.Infrastructure` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { this.getParentNamespace() instanceof SystemDataEntity::Namespace and this.hasName("Infrastructure") @@ -90,7 +90,7 @@ module SystemDataEntityInfrastructure { } /** A class in the `System.Data.Entity.Infrastructure` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } @@ -99,7 +99,7 @@ module SystemDataEntityInfrastructure { DbRawSqlQuery() { this.getABaseType*() .getUnboundDeclaration() - .(csharp::UnboundGenericClass) + .(CSharp::UnboundGenericClass) .getUndecoratedName() = "DbRawSqlQuery" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll index c4126834d20..41c057ea51d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll @@ -2,13 +2,13 @@ * Provides classes related to the namespace `System.Linq.Expressions`. */ -private import csharp as csharp +private import csharp as CSharp private import semmle.code.csharp.frameworks.system.Linq /** Definitions relating to the `System.Linq.Expressions` namespace. */ module SystemLinqExpressions { /** The `System.Linq.Expressions` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { this.getParentNamespace() instanceof SystemLinq::Namespace and this.hasName("Expressions") @@ -16,12 +16,12 @@ module SystemLinqExpressions { } /** A class in the `System.Linq.Expressions` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } /** The `Expression` class. */ - class ExpressionDelegate extends Class, csharp::UnboundGenericClass { + class ExpressionDelegate extends Class, CSharp::UnboundGenericClass { ExpressionDelegate() { this.hasName("Expression<>") } } @@ -30,20 +30,20 @@ module SystemLinqExpressions { * or a type of the form `Expression`, where `T` is an actual * `delegate` type. */ - class DelegateExtType extends csharp::Type { - csharp::DelegateType dt; + class DelegateExtType extends CSharp::Type { + CSharp::DelegateType dt; DelegateExtType() { this = dt or this = - any(csharp::ConstructedClass cc | + any(CSharp::ConstructedClass cc | cc.getUnboundGeneric() instanceof ExpressionDelegate and dt = cc.getTypeArgument(0) ) } /** Gets the underlying `delegate` type. */ - csharp::DelegateType getDelegateType() { result = dt } + CSharp::DelegateType getDelegateType() { result = dt } } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll index 9374d7c282f..7e703f44608 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll @@ -1,20 +1,20 @@ /** Provides classes related to the namespace `System.Xml.XPath`. */ -import csharp as csharp -private import semmle.code.csharp.frameworks.system.Xml as xml +private import csharp as CSharp +private import semmle.code.csharp.frameworks.system.Xml as Xml /** Definitions relating to the `System.Xml.XPath` namespace. */ module SystemXmlXPath { /** The `System.Xml.XPath` namespace. */ - class Namespace extends csharp::Namespace { + class Namespace extends CSharp::Namespace { Namespace() { - this.getParentNamespace() instanceof xml::SystemXmlNamespace and + this.getParentNamespace() instanceof Xml::SystemXmlNamespace and this.hasName("XPath") } } /** A class in the `System.Xml.XPath` namespace. */ - class Class extends csharp::Class { + class Class extends CSharp::Class { Class() { this.getNamespace() instanceof Namespace } } @@ -28,17 +28,17 @@ module SystemXmlXPath { XPathNavigator() { this.hasName("XPathNavigator") } /** Gets a method that selects nodes. */ - csharp::Method getASelectMethod() { + CSharp::Method getASelectMethod() { result = this.getAMethod() and result.getName().matches("Select%") } /** Gets the `Compile` method. */ - csharp::Method getCompileMethod() { result = this.getAMethod("Compile") } + CSharp::Method getCompileMethod() { result = this.getAMethod("Compile") } /** Gets an `Evaluate` method. */ - csharp::Method getAnEvaluateMethod() { result = this.getAMethod("Evaluate") } + CSharp::Method getAnEvaluateMethod() { result = this.getAMethod("Evaluate") } /** Gets a `Matches` method. */ - csharp::Method getAMatchesMethod() { result = this.getAMethod("Matches") } + CSharp::Method getAMatchesMethod() { result = this.getAMethod("Matches") } } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll index 34cff98208d..744632c5f76 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll @@ -5,22 +5,24 @@ import csharp private import semmle.code.csharp.dataflow.flowsources.Remote -private import semmle.code.csharp.dataflow.TaintTracking private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.dataflow.FlowSummary /** * A callable that is considered a "safe" external API from a security perspective. */ -abstract class SafeExternalAPICallable extends Callable { } +abstract class SafeExternalApiCallable extends Callable { } -private class SummarizedCallableSafe extends SafeExternalAPICallable { +/** DEPRECATED: Alias for SafeExternalApiCallable */ +deprecated class SafeExternalAPICallable = SafeExternalApiCallable; + +private class SummarizedCallableSafe extends SafeExternalApiCallable { SummarizedCallableSafe() { this instanceof SummarizedCallable } } /** The default set of "safe" external APIs. */ -private class DefaultSafeExternalAPICallable extends SafeExternalAPICallable { - DefaultSafeExternalAPICallable() { +private class DefaultSafeExternalApiCallable extends SafeExternalApiCallable { + DefaultSafeExternalApiCallable() { this instanceof EqualsMethod or this instanceof IEquatableEqualsMethod or this = any(SystemObjectClass s).getEqualsMethod() or @@ -36,11 +38,11 @@ private class DefaultSafeExternalAPICallable extends SafeExternalAPICallable { } /** A node representing data being passed to an external API. */ -class ExternalAPIDataNode extends DataFlow::Node { +class ExternalApiDataNode extends DataFlow::Node { Call call; int i; - ExternalAPIDataNode() { + ExternalApiDataNode() { ( // Argument to call this.asExpr() = call.getArgument(i) @@ -59,7 +61,7 @@ class ExternalAPIDataNode extends DataFlow::Node { m.fromSource() ) and // Not a call to a known safe external API - not call.getTarget().getUnboundDeclaration() instanceof SafeExternalAPICallable + not call.getTarget().getUnboundDeclaration() instanceof SafeExternalApiCallable } /** Gets the called API callable. */ @@ -72,38 +74,47 @@ class ExternalAPIDataNode extends DataFlow::Node { string getCallableDescription() { result = this.getCallable().getQualifiedName() } } -/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalAPIDataNode`s. */ -class UntrustedDataToExternalAPIConfig extends TaintTracking::Configuration { - UntrustedDataToExternalAPIConfig() { this = "UntrustedDataToExternalAPIConfig" } +/** DEPRECATED: Alias for ExternalApiDataNode */ +deprecated class ExternalAPIDataNode = ExternalApiDataNode; + +/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { + UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfig" } override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalAPIDataNode } + override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -/** A node representing untrusted data being passed to an external API. */ -class UntrustedExternalAPIDataNode extends ExternalAPIDataNode { - private UntrustedDataToExternalAPIConfig c; +/** DEPRECATED: Alias for UntrustedDataToExternalApiConfig */ +deprecated class UntrustedDataToExternalAPIConfig = UntrustedDataToExternalApiConfig; - UntrustedExternalAPIDataNode() { c.hasFlow(_, this) } +/** A node representing untrusted data being passed to an external API. */ +class UntrustedExternalApiDataNode extends ExternalApiDataNode { + private UntrustedDataToExternalApiConfig c; + + UntrustedExternalApiDataNode() { c.hasFlow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { c.hasFlow(result, this) } } -private newtype TExternalAPI = - TExternalAPIParameter(Callable m, int index) { - exists(UntrustedExternalAPIDataNode n | +/** DEPRECATED: Alias for UntrustedExternalApiDataNode */ +deprecated class UntrustedExternalAPIDataNode = UntrustedExternalApiDataNode; + +private newtype TExternalApi = + TExternalApiParameter(Callable m, int index) { + exists(UntrustedExternalApiDataNode n | m = n.getCallable().getUnboundDeclaration() and index = n.getIndex() ) } /** An external API which is used with untrusted data. */ -class ExternalAPIUsedWithUntrustedData extends TExternalAPI { +class ExternalApiUsedWithUntrustedData extends TExternalApi { /** Gets a possibly untrusted use of this external API. */ - UntrustedExternalAPIDataNode getUntrustedDataNode() { - this = TExternalAPIParameter(result.getCallable().getUnboundDeclaration(), result.getIndex()) + UntrustedExternalApiDataNode getUntrustedDataNode() { + this = TExternalApiParameter(result.getCallable().getUnboundDeclaration(), result.getIndex()) } /** Gets the number of untrusted sources used with this external API. */ @@ -116,10 +127,13 @@ class ExternalAPIUsedWithUntrustedData extends TExternalAPI { exists(Callable m, int index, string indexString | if index = -1 then indexString = "qualifier" else indexString = "param " + index | - this = TExternalAPIParameter(m, index) and + this = TExternalApiParameter(m, index) and result = m.getDeclaringType().getQualifiedName() + "." + m.toStringWithTypes() + " [" + indexString + "]" ) } } + +/** DEPRECATED: Alias for ExternalApiUsedWithUntrustedData */ +deprecated class ExternalAPIUsedWithUntrustedData = ExternalApiUsedWithUntrustedData; diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll index 5aa27202f4f..6f985463763 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll @@ -117,12 +117,15 @@ class SearchRequestFilterSink extends Sink { * * This will match the encoding methods provided by the AntiXSS library. */ -class LDAPEncodeSanitizer extends Sanitizer { - LDAPEncodeSanitizer() { +class LdapEncodeSanitizer extends Sanitizer { + LdapEncodeSanitizer() { this.getExpr().(MethodCall).getTarget().getName().regexpMatch("(?i)LDAP.*Encode.*") } } +/** DEPRECATED: Alias for LdapEncodeSanitizer */ +deprecated class LDAPEncodeSanitizer = LdapEncodeSanitizer; + private class SimpleTypeSanitizer extends Sanitizer, SimpleTypeSanitizedExpr { } private class GuidSanitizer extends Sanitizer, GuidSanitizedExpr { } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll index cf27d2db49b..d49ecd7c900 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll @@ -28,10 +28,10 @@ abstract class Sink extends DataFlow::ExprNode { abstract string getReason(); } -private class InsecureXMLSink extends Sink { +private class InsecureXmlSink extends Sink { private string reason; - InsecureXMLSink() { + InsecureXmlSink() { exists(InsecureXML::InsecureXmlProcessing r | r.isUnsafe(reason) | this.getExpr() = r.getAnArgument() ) diff --git a/csharp/ql/lib/semmle/code/dotnet/Declaration.qll b/csharp/ql/lib/semmle/code/dotnet/Declaration.qll index 60e434f9ae6..046cb99944e 100644 --- a/csharp/ql/lib/semmle/code/dotnet/Declaration.qll +++ b/csharp/ql/lib/semmle/code/dotnet/Declaration.qll @@ -21,13 +21,6 @@ class Declaration extends NamedElement, @dotnet_declaration { /** Gets the type containing this declaration, if any. */ Type getDeclaringType() { none() } - /** - * DEPRECATED: Use `getUnboundDeclaration()` instaed. - * - * Gets the unbound version of this declaration. - */ - deprecated final Declaration getSourceDeclaration() { result = this.getUnboundDeclaration() } - /** * Gets the unbound version of this declaration, that is, the declaration where * all type arguments have been removed. For example, in diff --git a/csharp/ql/src/API Abuse/IncorrectCompareToSignature.ql b/csharp/ql/src/API Abuse/IncorrectCompareToSignature.ql index b3fea8d8419..9f9eff6f1f6 100644 --- a/csharp/ql/src/API Abuse/IncorrectCompareToSignature.ql +++ b/csharp/ql/src/API Abuse/IncorrectCompareToSignature.ql @@ -1,6 +1,6 @@ /** * @name Potentially incorrect CompareTo(...) signature - * @description The declaring type of a method with signature 'CompareTo(T)' does not implement 'IComparable'. + * @description The declaring type of a method with signature `CompareTo(T)` does not implement `IComparable`. * @kind problem * @problem.severity warning * @precision medium diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 0de57f8d135..77df7a74581 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,30 @@ +## 0.1.2 + +## 0.1.1 + +## 0.1.0 + +## 0.0.13 + +## 0.0.12 + +## 0.0.11 + +### Minor Analysis Improvements + +* Casts to `dynamic` are excluded from the useless upcasts check (`cs/useless-upcast`). +* The C# extractor now accepts an extractor option `buildless`, which is used to decide what type of extraction that should be performed. If `true` then buildless (standalone) extraction will be performed. Otherwise tracing extraction will be performed (default). +The option is added via `codeql database create --language=csharp -Obuildless=true ...`. +* The C# extractor now accepts an extractor option `trap.compression`, which is used to decide the compression format for TRAP files. The legal values are `brotli` (default), `gzip` or `none`. +The option is added via `codeql database create --language=csharp -Otrap.compression=value ...`. + +## 0.0.10 + +### Query Metadata Changes + +* The precision of hardcoded credentials queries (`cs/hardcoded-credentials` and +`cs/hardcoded-connection-string-credentials`) have been downgraded to medium. + ## 0.0.9 ## 0.0.8 diff --git a/csharp/ql/src/Concurrency/UnsafeLazyInitialization.ql b/csharp/ql/src/Concurrency/UnsafeLazyInitialization.ql index 95594a08c0e..97b4fbdba8e 100644 --- a/csharp/ql/src/Concurrency/UnsafeLazyInitialization.ql +++ b/csharp/ql/src/Concurrency/UnsafeLazyInitialization.ql @@ -14,24 +14,12 @@ import csharp import semmle.code.csharp.commons.StructuralComparison -class DoubleCheckedLock extends StructuralComparisonConfiguration { - DoubleCheckedLock() { this = "double checked lock" } - - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(IfStmt unlockedIf, IfStmt lockedIf, LockStmt lock | - x = unlockedIf.getCondition() and - y = lockedIf.getCondition() and - lock = unlockedIf.getThen().stripSingletonBlocks() and - lockedIf.getParent*() = lock.getBlock() - ) - } -} - -predicate doubleCheckedLock(Field field, IfStmt ifs) { - exists(DoubleCheckedLock config, LockStmt lock, Expr eq1, Expr eq2 | ifs.getCondition() = eq1 | - lock = ifs.getThen().stripSingletonBlocks() and - config.same(eq1, eq2) and - field.getAnAccess() = eq1.getAChildExpr*() +predicate doubleCheckedLock(Field field, IfStmt unlockedIf) { + exists(LockStmt lock, IfStmt lockedIf | + lock = unlockedIf.getThen().stripSingletonBlocks() and + lockedIf.getParent*() = lock.getBlock() and + sameGvn(unlockedIf.getCondition(), lockedIf.getCondition()) and + field.getAnAccess() = unlockedIf.getCondition().getAChildExpr*() ) } diff --git a/csharp/ql/src/Documentation/Documentation.qll b/csharp/ql/src/Documentation/Documentation.qll index 19fd1d5dd8a..c15f53027c3 100644 --- a/csharp/ql/src/Documentation/Documentation.qll +++ b/csharp/ql/src/Documentation/Documentation.qll @@ -26,7 +26,7 @@ class SourceMethodOrConstructor extends SourceDeclaration, Callable { } /** Gets an XML comment bound to this declaration. */ -XmlComment getADeclarationXmlComment(Declaration d) { +XmlCommentLine getADeclarationXmlComment(Declaration d) { result = getADeclarationCommentBlock(d).getAChild() } @@ -58,7 +58,7 @@ predicate isDocumentationNeeded(Modifiable decl) { } /** An XML comment containing a `` tag. */ -class ReturnsXmlComment extends XmlComment { +class ReturnsXmlComment extends XmlCommentLine { ReturnsXmlComment() { this.getOpenTag(_) = "returns" } /** Holds if the element in this comment has a body at offset `offset`. */ @@ -72,7 +72,7 @@ class ReturnsXmlComment extends XmlComment { } /** An XML comment containing an `` tag. */ -class ExceptionXmlComment extends XmlComment { +class ExceptionXmlComment extends XmlCommentLine { ExceptionXmlComment() { this.getOpenTag(_) = "exception" } /** Gets a `cref` attribute at offset `offset`, if any. */ @@ -83,7 +83,7 @@ class ExceptionXmlComment extends XmlComment { } /** An XML comment containing a `` tag. */ -class ParamXmlComment extends XmlComment { +class ParamXmlComment extends XmlCommentLine { ParamXmlComment() { this.getOpenTag(_) = "param" } /** Gets the name of this parameter at offset `offset`. */ @@ -94,7 +94,7 @@ class ParamXmlComment extends XmlComment { } /** An XML comment containing a `` tag. */ -class TypeparamXmlComment extends XmlComment { +class TypeparamXmlComment extends XmlCommentLine { TypeparamXmlComment() { this.getOpenTag(_) = "typeparam" } /** Gets the `name` attribute of this element at offset `offset`. */ @@ -105,7 +105,7 @@ class TypeparamXmlComment extends XmlComment { } /** An XML comment containing a `` tag. */ -class SummaryXmlComment extends XmlComment { +class SummaryXmlComment extends XmlCommentLine { SummaryXmlComment() { this.getOpenTag(_) = "summary" } /** Holds if the element in this comment has a body at offset `offset`. */ @@ -119,6 +119,6 @@ class SummaryXmlComment extends XmlComment { } /** An XML comment containing an `` tag. */ -class InheritDocXmlComment extends XmlComment { +class InheritDocXmlComment extends XmlCommentLine { InheritDocXmlComment() { this.getOpenTag(_) = "inheritdoc" } } diff --git a/csharp/ql/src/Documentation/XmldocExtraParam.ql b/csharp/ql/src/Documentation/XmldocExtraParam.ql index be42720d439..a745edfb6d8 100644 --- a/csharp/ql/src/Documentation/XmldocExtraParam.ql +++ b/csharp/ql/src/Documentation/XmldocExtraParam.ql @@ -1,6 +1,6 @@ /** * @name Incorrect parameter name in documentation - * @description The parameter name given in a '' tag does not exist. Rename the parameter or + * @description The parameter name given in a `` tag does not exist. Rename the parameter or * change the name in the documentation to ensure that they are the same. * @kind problem * @problem.severity recommendation diff --git a/csharp/ql/src/Documentation/XmldocExtraTypeParam.ql b/csharp/ql/src/Documentation/XmldocExtraTypeParam.ql index 4763b3d958c..76c2039920d 100644 --- a/csharp/ql/src/Documentation/XmldocExtraTypeParam.ql +++ b/csharp/ql/src/Documentation/XmldocExtraTypeParam.ql @@ -1,6 +1,6 @@ /** * @name Incorrect type parameter name in documentation - * @description The type parameter name given in a '' tag does not exist. Rename the parameter or + * @description The type parameter name given in a `` tag does not exist. Rename the parameter or * change the name in the documentation to ensure that they are the same. * @kind problem * @problem.severity recommendation diff --git a/csharp/ql/src/Documentation/XmldocMissingException.ql b/csharp/ql/src/Documentation/XmldocMissingException.ql index 87af9c299f5..a5c06c598c7 100644 --- a/csharp/ql/src/Documentation/XmldocMissingException.ql +++ b/csharp/ql/src/Documentation/XmldocMissingException.ql @@ -1,6 +1,6 @@ /** * @name Missing documentation for exception - * @description Exceptions thrown by the method should be documented using ' ' tags. + * @description Exceptions thrown by the method should be documented using ` ` tags. * Ensure that the correct type of the exception is given in the 'cref' attribute. * @kind problem * @problem.severity recommendation diff --git a/csharp/ql/src/Documentation/XmldocMissingParam.ql b/csharp/ql/src/Documentation/XmldocMissingParam.ql index 1926bee4eb6..adf9fcd5718 100644 --- a/csharp/ql/src/Documentation/XmldocMissingParam.ql +++ b/csharp/ql/src/Documentation/XmldocMissingParam.ql @@ -1,6 +1,6 @@ /** * @name Missing documentation for parameter - * @description All parameters should be documented using ' ' tags. + * @description All parameters should be documented using ` ` tags. * Ensure that the name attribute matches the name of the parameter. * @kind problem * @problem.severity recommendation diff --git a/csharp/ql/src/Documentation/XmldocMissingReturn.ql b/csharp/ql/src/Documentation/XmldocMissingReturn.ql index 112c6238d97..05c93227c3c 100644 --- a/csharp/ql/src/Documentation/XmldocMissingReturn.ql +++ b/csharp/ql/src/Documentation/XmldocMissingReturn.ql @@ -1,7 +1,7 @@ /** * @name Missing documentation for return value * @description The method returns a value, but the return value is not documented using - * a '' tag. + * a `` tag. * @kind problem * @problem.severity recommendation * @precision low diff --git a/csharp/ql/src/Documentation/XmldocMissingSummary.ql b/csharp/ql/src/Documentation/XmldocMissingSummary.ql index 74238b63ed4..312848b6bdf 100644 --- a/csharp/ql/src/Documentation/XmldocMissingSummary.ql +++ b/csharp/ql/src/Documentation/XmldocMissingSummary.ql @@ -1,6 +1,6 @@ /** * @name Missing a summary in documentation comment - * @description The documentation comment does not contain a '' tag. + * @description The documentation comment does not contain a `` tag. * @kind problem * @problem.severity recommendation * @precision high diff --git a/csharp/ql/src/Documentation/XmldocMissingTypeParam.ql b/csharp/ql/src/Documentation/XmldocMissingTypeParam.ql index d559783146c..cd1e0eeea3e 100644 --- a/csharp/ql/src/Documentation/XmldocMissingTypeParam.ql +++ b/csharp/ql/src/Documentation/XmldocMissingTypeParam.ql @@ -1,6 +1,6 @@ /** * @name Missing documentation for type parameter - * @description All type parameters should be documented using ' ' tags. + * @description All type parameters should be documented using ` ` tags. * Ensure that the 'name' attribute matches the name of the type parameter. * @kind problem * @problem.severity recommendation diff --git a/csharp/ql/src/Language Abuse/ForeachCapture.ql b/csharp/ql/src/Language Abuse/ForeachCapture.ql index 7bef3bc3405..b3597418390 100644 --- a/csharp/ql/src/Language Abuse/ForeachCapture.ql +++ b/csharp/ql/src/Language Abuse/ForeachCapture.ql @@ -13,6 +13,7 @@ import csharp import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl +import semmle.code.csharp.dataflow.internal.DataFlowDispatch as DataFlowDispatch import semmle.code.csharp.dataflow.internal.DataFlowPrivate as DataFlowPrivate import semmle.code.csharp.frameworks.system.Collections import semmle.code.csharp.frameworks.system.collections.Generic @@ -76,7 +77,8 @@ Element getAssignmentTarget(Expr e) { Element getCollectionAssignmentTarget(Expr e) { // Store into collection via method exists(DataFlowPrivate::PostUpdateNode postNode | - FlowSummaryImpl::Private::Steps::summarySetterStep(DataFlow::exprNode(e), _, postNode) and + FlowSummaryImpl::Private::Steps::summarySetterStep(DataFlow::exprNode(e), _, postNode, + any(DataFlowDispatch::DataFlowSummarizedCallable sc)) and result.(Variable).getAnAccess() = postNode.getPreUpdateNode().asExpr() ) or diff --git a/csharp/ql/src/Language Abuse/MissedTernaryOpportunity.ql b/csharp/ql/src/Language Abuse/MissedTernaryOpportunity.ql index 9c13f1060a4..b8da7e43cc5 100644 --- a/csharp/ql/src/Language Abuse/MissedTernaryOpportunity.ql +++ b/csharp/ql/src/Language Abuse/MissedTernaryOpportunity.ql @@ -12,25 +12,8 @@ import csharp import semmle.code.csharp.commons.StructuralComparison -class StructuralComparisonConfig extends StructuralComparisonConfiguration { - StructuralComparisonConfig() { this = "MissedTernaryOpportunity" } - - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(IfStmt is, AssignExpr ae1 | - ae1 = is.getThen().stripSingletonBlocks().(ExprStmt).getExpr() - | - x = ae1.getLValue() and - exists(AssignExpr ae2 | ae2 = is.getElse().stripSingletonBlocks().(ExprStmt).getExpr() | - y = ae2.getLValue() - ) - ) - } - - IfStmt getIfStmt() { - exists(AssignExpr ae | ae = result.getThen().stripSingletonBlocks().(ExprStmt).getExpr() | - same(ae.getLValue(), _) - ) - } +private Expr getAssignedExpr(Stmt stmt) { + result = stmt.stripSingletonBlocks().(ExprStmt).getExpr().(AssignExpr).getLValue() } from IfStmt is, string what @@ -40,10 +23,8 @@ where is.getElse().stripSingletonBlocks() instanceof ReturnStmt and what = "return" or - exists(StructuralComparisonConfig c | - is = c.getIfStmt() and - what = "write to the same variable" - ) + sameGvn(getAssignedExpr(is.getThen()), getAssignedExpr(is.getElse())) and + what = "write to the same variable" ) and not exists(IfStmt other | is = other.getElse()) select is, diff --git a/csharp/ql/src/Language Abuse/UselessIsBeforeAs.ql b/csharp/ql/src/Language Abuse/UselessIsBeforeAs.ql index 0f2c8f709df..e784bb4258d 100644 --- a/csharp/ql/src/Language Abuse/UselessIsBeforeAs.ql +++ b/csharp/ql/src/Language Abuse/UselessIsBeforeAs.ql @@ -13,35 +13,26 @@ import csharp import semmle.code.csharp.commons.StructuralComparison -class StructuralComparisonConfig extends StructuralComparisonConfiguration { - StructuralComparisonConfig() { this = "UselessIsBeforeAs" } +private predicate candidate(AsExpr ae, IsExpr ie) { + exists(IfStmt is, TypeAccessPatternExpr tape | + ie = is.getCondition().getAChild*() and + tape = ie.getPattern() and + ae.getTargetType() = tape.getTarget() + | + ae = is.getThen().getAChild*() + or + ae = is.getElse().getAChild*() + ) +} - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(IfStmt is, AsExpr ae, IsExpr ie, TypeAccessPatternExpr tape | - ie = is.getCondition().getAChild*() and - tape = ie.getPattern() and - ae.getTargetType() = tape.getTarget() and - x = ie.getExpr() and - y = ae.getExpr() - | - ae = is.getThen().getAChild*() - or - ae = is.getElse().getAChild*() - ) - } - - predicate uselessIsBeforeAs(AsExpr ae, IsExpr ie) { - exists(Expr x, Expr y | - same(x, y) and - ie.getExpr() = x and - ae.getExpr() = y - ) - } +private predicate uselessIsBeforeAs(AsExpr ae, IsExpr ie) { + candidate(ae, ie) and + sameGvn(ie.getExpr(), ae.getExpr()) } from AsExpr ae, IsExpr ie where - exists(StructuralComparisonConfig c | c.uselessIsBeforeAs(ae, ie)) and + uselessIsBeforeAs(ae, ie) and not exists(MethodCall mc | ae = mc.getAnArgument().getAChildExpr*()) select ae, "This 'as' expression performs a type test - it should be directly compared against null, rendering the 'is' $@ potentially redundant.", diff --git a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql index 1b0e9712328..ec73df23741 100644 --- a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql +++ b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql @@ -14,24 +14,22 @@ import csharp import semmle.code.csharp.commons.StructuralComparison -class StructuralComparisonConfig extends StructuralComparisonConfiguration { - StructuralComparisonConfig() { this = "UselessNullCoalescingExpression" } - - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(NullCoalescingExpr nce | - x.(Access) = nce.getLeftOperand() and - y.(Access) = nce.getRightOperand().getAChildExpr*() - ) - } - - NullCoalescingExpr getUselessNullCoalescingExpr() { - exists(AssignableAccess x | - result.getLeftOperand() = x and - forex(AssignableAccess y | same(x, y) | y instanceof AssignableRead and not y.isRefArgument()) - ) - } +pragma[noinline] +private predicate same(AssignableAccess x, AssignableAccess y) { + exists(NullCoalescingExpr nce | + x = nce.getLeftOperand() and + y = nce.getRightOperand().getAChildExpr*() + ) and + sameGvn(x, y) } -from StructuralComparisonConfig c, NullCoalescingExpr nce -where nce = c.getUselessNullCoalescingExpr() +private predicate uselessNullCoalescingExpr(NullCoalescingExpr nce) { + exists(AssignableAccess x | + nce.getLeftOperand() = x and + forex(AssignableAccess y | same(x, y) | y instanceof AssignableRead and not y.isRefArgument()) + ) +} + +from NullCoalescingExpr nce +where uselessNullCoalescingExpr(nce) select nce, "Both operands of this null-coalescing expression access the same variable or property." diff --git a/csharp/ql/src/Language Abuse/UselessUpcast.ql b/csharp/ql/src/Language Abuse/UselessUpcast.ql index a1b8d65cc2c..827d16038b2 100644 --- a/csharp/ql/src/Language Abuse/UselessUpcast.ql +++ b/csharp/ql/src/Language Abuse/UselessUpcast.ql @@ -204,6 +204,8 @@ class ExplicitUpcast extends ExplicitCast { this = any(LocalVariableDeclAndInitExpr decl | decl.isImplicitlyTyped()).getInitializer() or exists(LambdaExpr c | c.canReturn(this)) + or + dest instanceof DynamicType } } diff --git a/csharp/ql/src/Likely Bugs/EqualityCheckOnFloats.ql b/csharp/ql/src/Likely Bugs/EqualityCheckOnFloats.ql index 5cbbbb83751..1884cd5cc5f 100644 --- a/csharp/ql/src/Likely Bugs/EqualityCheckOnFloats.ql +++ b/csharp/ql/src/Likely Bugs/EqualityCheckOnFloats.ql @@ -11,13 +11,6 @@ import csharp -class ZeroFloatLiteral extends FloatLiteral { - ZeroFloatLiteral() { - this.getValue() = "0" or - this.getValue() = "0.0" - } -} - from EqualityOperation e where e.getAnOperand().getType() instanceof FloatingPointType and diff --git a/csharp/ql/src/Likely Bugs/ICryptoTransform.qll b/csharp/ql/src/Likely Bugs/ICryptoTransform.qll index 5570e51bdfc..574dd1e69af 100644 --- a/csharp/ql/src/Likely Bugs/ICryptoTransform.qll +++ b/csharp/ql/src/Likely Bugs/ICryptoTransform.qll @@ -1,6 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.DataFlow -import csharp class ImplementsICryptoTransform extends Class { ImplementsICryptoTransform() { diff --git a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql index 6dab3dfcfab..838406ab82e 100644 --- a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql +++ b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.ql @@ -11,7 +11,6 @@ import csharp import DataFlow::PathGraph -import semmle.code.csharp.dataflow.TaintTracking class UnsafeYearCreationFromArithmeticConfiguration extends TaintTracking::Configuration { UnsafeYearCreationFromArithmeticConfiguration() { @@ -21,7 +20,7 @@ class UnsafeYearCreationFromArithmeticConfiguration extends TaintTracking::Confi override predicate isSource(DataFlow::Node source) { exists(ArithmeticOperation ao, PropertyAccess pa | ao = source.asExpr() | pa = ao.getAChild*() and - pa.getProperty().getQualifiedName().matches("System.DateTime.Year") + pa.getProperty().hasQualifiedName("System.DateTime.Year") ) } diff --git a/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql b/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql index 6eb41f08026..b231f641778 100644 --- a/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql +++ b/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql @@ -15,18 +15,6 @@ import csharp import semmle.code.csharp.commons.ComparisonTest import semmle.code.csharp.commons.StructuralComparison as SC -/** A structural comparison configuration for comparing the conditions of nested `for` loops. */ -class NestedForConditions extends SC::StructuralComparisonConfiguration { - NestedForConditions() { this = "Compare nested for conditions" } - - override predicate candidate(ControlFlowElement e1, ControlFlowElement e2) { - exists(NestedForLoopSameVariable nested | - e1 = nested.getInnerForStmt().getCondition() and - e2 = nested.getOuterForStmt().getCondition() - ) - } -} - private predicate hasChild(Stmt outer, Element child) { outer = child.getParent() and (outer instanceof ForStmt or outer = any(ForStmt f).getBody()) @@ -61,9 +49,7 @@ class NestedForLoopSameVariable extends ForStmt { } private predicate haveSameCondition() { - exists(NestedForConditions config | - config.same(this.getInnerForStmt().getCondition(), this.getOuterForStmt().getCondition()) - ) + SC::sameGvn(this.getInnerForStmt().getCondition(), this.getOuterForStmt().getCondition()) } private predicate haveSameUpdate() { diff --git a/csharp/ql/src/Likely Bugs/ParallelSink.qll b/csharp/ql/src/Likely Bugs/ParallelSink.qll index 0b2cac08152..ee807b6d95e 100644 --- a/csharp/ql/src/Likely Bugs/ParallelSink.qll +++ b/csharp/ql/src/Likely Bugs/ParallelSink.qll @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.DataFlow abstract class ParallelSink extends DataFlow::Node { } diff --git a/csharp/ql/src/Likely Bugs/SelfAssignment.ql b/csharp/ql/src/Likely Bugs/SelfAssignment.ql index 01c5d904cd4..dd63ba87627 100644 --- a/csharp/ql/src/Likely Bugs/SelfAssignment.ql +++ b/csharp/ql/src/Likely Bugs/SelfAssignment.ql @@ -13,37 +13,25 @@ import csharp import semmle.code.csharp.commons.StructuralComparison -class StructuralComparisonConfig extends StructuralComparisonConfiguration { - StructuralComparisonConfig() { this = "SelfAssignment" } - - override predicate candidate(ControlFlowElement x, ControlFlowElement y) { - exists(AssignExpr ae | - // Member initializers are never self-assignments, in particular - // not initializers such as `new C { F = F };` - not ae instanceof MemberInitializer and - // Enum field initializers are never self assignments. `enum E { A = 42 }` - not ae.getParent().(Field).getDeclaringType() instanceof Enum - | - ae.getLValue() = x and - ae.getRValue() = y - ) and - forall(Expr e | e = x.(Expr).getAChildExpr*() | - // Non-trivial property accesses may have side-effects, - // so these are not considered - e instanceof PropertyAccess implies e instanceof TrivialPropertyAccess - ) - } - - AssignExpr getSelfAssignExpr() { - exists(Expr x, Expr y | - same(x, y) and - result.getLValue() = x and - result.getRValue() = y - ) - } +private predicate candidate(AssignExpr ae) { + // Member initializers are never self-assignments, in particular + // not initializers such as `new C { F = F };` + not ae instanceof MemberInitializer and + // Enum field initializers are never self assignments. `enum E { A = 42 }` + not ae.getParent().(Field).getDeclaringType() instanceof Enum and + forall(Expr e | e = ae.getLValue().getAChildExpr*() | + // Non-trivial property accesses may have side-effects, + // so these are not considered + e instanceof PropertyAccess implies e instanceof TrivialPropertyAccess + ) } -Declaration getDeclaration(Expr e) { +private predicate selfAssignExpr(AssignExpr ae) { + candidate(ae) and + sameGvn(ae.getLValue(), ae.getRValue()) +} + +private Declaration getDeclaration(Expr e) { result = e.(VariableAccess).getTarget() or result = e.(MemberAccess).getTarget() @@ -51,6 +39,6 @@ Declaration getDeclaration(Expr e) { result = getDeclaration(e.(ArrayAccess).getQualifier()) } -from StructuralComparisonConfig c, AssignExpr ae, Declaration target -where ae = c.getSelfAssignExpr() and target = getDeclaration(ae.getLValue()) +from AssignExpr ae, Declaration target +where selfAssignExpr(ae) and target = getDeclaration(ae.getLValue()) select ae, "This assignment assigns $@ to itself.", target, target.getName() diff --git a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql index 7787a1bd622..9ed4963169f 100644 --- a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql +++ b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransformLambda.ql @@ -15,7 +15,6 @@ */ import csharp -import semmle.code.csharp.dataflow.DataFlow import ParallelSink import ICryptoTransform diff --git a/csharp/ql/src/Metrics/Summaries/FrameworkCoverage.ql b/csharp/ql/src/Metrics/Summaries/FrameworkCoverage.ql new file mode 100644 index 00000000000..625c4e3e881 --- /dev/null +++ b/csharp/ql/src/Metrics/Summaries/FrameworkCoverage.ql @@ -0,0 +1,18 @@ +/** + * @id csharp/summary/framework-coverage + * @name Metrics of framework coverage + * @description Expose metrics for the number of API endpoints covered by CSV models. + * @kind metric + * @tags summary + */ + +import csharp +import semmle.code.csharp.dataflow.ExternalFlow + +from string namespaceAndType, int rows +where + exists(string namespace, string type | + namespaceAndType = namespace + ";" + type and + rows = strictsum(int n, string kind | modelCoverage(namespace, _, kind, type, n) | n) + ) +select namespaceAndType, rows diff --git a/csharp/ql/src/Performance/UseTryGetValue.ql b/csharp/ql/src/Performance/UseTryGetValue.ql index 276901cf61a..67b57e90347 100644 --- a/csharp/ql/src/Performance/UseTryGetValue.ql +++ b/csharp/ql/src/Performance/UseTryGetValue.ql @@ -13,19 +13,14 @@ import csharp import semmle.code.csharp.commons.StructuralComparison import semmle.code.csharp.controlflow.Guards as G -class SameElement extends StructuralComparisonConfiguration { - SameElement() { this = "Same element" } - - override predicate candidate(ControlFlowElement e1, ControlFlowElement e2) { - exists(MethodCall mc, IndexerRead access | - mc.getTarget().hasName("ContainsKey") and - access.getQualifier().(G::GuardedExpr).isGuardedBy(mc, mc.getQualifier(), _) and - e1 = mc.getArgument(0) and - e2 = access.getIndex(0) - ) - } +pragma[noinline] +private predicate candidate(MethodCall mc, IndexerRead access) { + mc.getTarget().hasName("ContainsKey") and + access.getQualifier().(G::GuardedExpr).isGuardedBy(mc, mc.getQualifier(), _) } -from SameElement element, MethodCall call, IndexerAccess index -where element.same(call.getArgument(0), index.getIndex(0)) +from MethodCall call, IndexerRead index +where + candidate(call, index) and + sameGvn(call.getArgument(0), index.getIndex(0)) select call, "Inefficient use of 'ContainsKey' and $@.", index, "indexer" diff --git a/csharp/ql/src/Security Features/CWE-011/ASPNetDebug.ql b/csharp/ql/src/Security Features/CWE-011/ASPNetDebug.ql index 3bccd9b0331..8477401fe17 100644 --- a/csharp/ql/src/Security Features/CWE-011/ASPNetDebug.ql +++ b/csharp/ql/src/Security Features/CWE-011/ASPNetDebug.ql @@ -17,7 +17,7 @@ import csharp import semmle.code.asp.WebConfig -from SystemWebXMLElement web, XMLAttribute debugAttribute +from SystemWebXmlElement web, XMLAttribute debugAttribute where debugAttribute = web.getAChild("compilation").getAttribute("debug") and not debugAttribute.getValue().toLowerCase() = "false" diff --git a/csharp/ql/src/Security Features/CWE-016/ASPNetMaxRequestLength.ql b/csharp/ql/src/Security Features/CWE-016/ASPNetMaxRequestLength.ql index 5a527c96084..d6b4da2c258 100644 --- a/csharp/ql/src/Security Features/CWE-016/ASPNetMaxRequestLength.ql +++ b/csharp/ql/src/Security Features/CWE-016/ASPNetMaxRequestLength.ql @@ -14,7 +14,7 @@ import csharp import semmle.code.asp.WebConfig -from SystemWebXMLElement web, XMLAttribute maxReqLength +from SystemWebXmlElement web, XMLAttribute maxReqLength where maxReqLength = web.getAChild(any(string s | s.toLowerCase() = "httpruntime")) diff --git a/csharp/ql/src/Security Features/CWE-016/ASPNetPagesValidateRequest.ql b/csharp/ql/src/Security Features/CWE-016/ASPNetPagesValidateRequest.ql index f093a888446..3a8208c270f 100644 --- a/csharp/ql/src/Security Features/CWE-016/ASPNetPagesValidateRequest.ql +++ b/csharp/ql/src/Security Features/CWE-016/ASPNetPagesValidateRequest.ql @@ -13,7 +13,7 @@ import csharp import semmle.code.asp.WebConfig -from SystemWebXMLElement web, XMLAttribute requestvalidateAttribute +from SystemWebXmlElement web, XMLAttribute requestvalidateAttribute where requestvalidateAttribute = web.getAChild("pages").getAttribute("validateRequest") and requestvalidateAttribute.getValue().toLowerCase() = "false" diff --git a/csharp/ql/src/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.ql b/csharp/ql/src/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.ql index 8b6a657ecd4..b07b1093ec8 100644 --- a/csharp/ql/src/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.ql +++ b/csharp/ql/src/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.ql @@ -11,7 +11,7 @@ import csharp import semmle.code.csharp.security.dataflow.ExternalAPIsQuery -from ExternalAPIUsedWithUntrustedData externalAPI -select externalAPI, count(externalAPI.getUntrustedDataNode()) as numberOfUses, - externalAPI.getNumberOfUntrustedSources() as numberOfUntrustedSources order by +from ExternalApiUsedWithUntrustedData externalApi +select externalApi, count(externalApi.getUntrustedDataNode()) as numberOfUses, + externalApi.getNumberOfUntrustedSources() as numberOfUntrustedSources order by numberOfUntrustedSources desc diff --git a/csharp/ql/src/Security Features/CWE-020/UntrustedDataToExternalAPI.ql b/csharp/ql/src/Security Features/CWE-020/UntrustedDataToExternalAPI.ql index 3db73db09d4..01faeb6ba75 100644 --- a/csharp/ql/src/Security Features/CWE-020/UntrustedDataToExternalAPI.ql +++ b/csharp/ql/src/Security Features/CWE-020/UntrustedDataToExternalAPI.ql @@ -10,12 +10,11 @@ */ import csharp -import semmle.code.csharp.dataflow.TaintTracking import semmle.code.csharp.security.dataflow.ExternalAPIsQuery import DataFlow::PathGraph -from UntrustedDataToExternalAPIConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +from UntrustedDataToExternalApiConfig config, DataFlow::PathNode source, DataFlow::PathNode sink where config.hasFlowPath(source, sink) select sink, source, sink, - "Call to " + sink.getNode().(ExternalAPIDataNode).getCallableDescription() + + "Call to " + sink.getNode().(ExternalApiDataNode).getCallableDescription() + " with untrusted data from $@.", source, source.toString() diff --git a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql index 1ad4fad9e41..02aa158a120 100644 --- a/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql +++ b/csharp/ql/src/Security Features/CWE-091/XMLInjection.ql @@ -2,7 +2,7 @@ * @name XML injection * @description Building an XML document from user-controlled sources is vulnerable to insertion of * malicious code by the user. - * @kind problem + * @kind path-problem * @id cs/xml-injection * @problem.severity error * @security-severity 8.8 @@ -12,6 +12,7 @@ */ import csharp +import DataFlow::PathGraph import semmle.code.csharp.security.dataflow.flowsources.Remote import semmle.code.csharp.frameworks.system.Xml @@ -45,6 +46,6 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { } } -from TaintTrackingConfiguration c, DataFlow::Node source, DataFlow::Node sink -where c.hasFlow(source, sink) -select sink, "$@ flows to here and is inserted as XML.", source, "User-provided value" +from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink +where c.hasFlowPath(source, sink) +select sink, source, sink, "$@ flows to here and is inserted as XML.", source, "User-provided value" diff --git a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql index d079c4f9ac9..f2b0918e1e5 100644 --- a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql +++ b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql @@ -14,7 +14,6 @@ import csharp import semmle.code.csharp.security.dataflow.flowsources.Remote import semmle.code.csharp.security.dataflow.flowsources.Local -import semmle.code.csharp.dataflow.TaintTracking import semmle.code.csharp.frameworks.Format import DataFlow::PathGraph diff --git a/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql b/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql index 34f45c0c64e..7f9c87de5fc 100644 --- a/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql +++ b/csharp/ql/src/Security Features/CWE-209/ExceptionInformationExposure.ql @@ -28,13 +28,6 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { exists(Expr exceptionExpr | // Writing an exception directly is bad source.asExpr() = exceptionExpr - or - // Writing an exception property is bad - source.asExpr().(PropertyAccess).getQualifier() = exceptionExpr - or - // Writing the result of ToString is bad - source.asExpr() = - any(MethodCall mc | mc.getQualifier() = exceptionExpr and mc.getTarget().hasName("ToString")) | // Expr has type `System.Exception`. exceptionExpr.getType().(RefType).getABaseType*() instanceof SystemExceptionClass and @@ -47,12 +40,26 @@ class TaintTrackingConfiguration extends TaintTracking::Configuration { ) } + override predicate isAdditionalTaintStep(DataFlow::Node source, DataFlow::Node sink) { + sink.asExpr() = + any(MethodCall mc | + source.asExpr() = mc.getQualifier() and + mc.getTarget().hasName("ToString") and + mc.getQualifier().getType().(RefType).getABaseType*() instanceof SystemExceptionClass + ) + } + override predicate isSink(DataFlow::Node sink) { sink instanceof RemoteFlowSink } override predicate isSanitizer(DataFlow::Node sanitizer) { // Do not flow through Message sanitizer.asExpr() = any(SystemExceptionClass se).getProperty("Message").getAnAccess() } + + override predicate isSanitizerIn(DataFlow::Node sanitizer) { + // Do not flow through Message + sanitizer.asExpr().getType().(RefType).getABaseType*() instanceof SystemExceptionClass + } } from TaintTrackingConfiguration c, DataFlow::PathNode source, DataFlow::PathNode sink diff --git a/csharp/ql/src/Security Features/CWE-248/MissingASPNETGlobalErrorHandler.ql b/csharp/ql/src/Security Features/CWE-248/MissingASPNETGlobalErrorHandler.ql index 416608b9115..f37d4c497de 100644 --- a/csharp/ql/src/Security Features/CWE-248/MissingASPNETGlobalErrorHandler.ql +++ b/csharp/ql/src/Security Features/CWE-248/MissingASPNETGlobalErrorHandler.ql @@ -14,7 +14,6 @@ import csharp import semmle.code.asp.WebConfig -import semmle.code.csharp.XML class Application_Error extends Method { Application_Error() { @@ -24,7 +23,7 @@ class Application_Error extends Method { } } -from CustomErrorsXMLElement customError +from CustomErrorsXmlElement customError where // `` must be set to "off" to be dangerous customError.getAttributeValue("mode").toLowerCase() = "off" and diff --git a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql index 67f3ae1d7b8..9e51b663038 100644 --- a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql +++ b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql @@ -19,7 +19,7 @@ import semmle.code.csharp.frameworks.system.Web /** * Holds if the `Web.config` file `webConfig` adds an `X-Frame-Options` header. */ -predicate hasWebConfigXFrameOptions(WebConfigXML webConfig) { +predicate hasWebConfigXFrameOptions(WebConfigXml webConfig) { // Looking for an entry in `webConfig` that looks like this: // ```xml // @@ -52,7 +52,7 @@ predicate hasCodeXFrameOptions() { ) } -from WebConfigXML webConfig +from WebConfigXml webConfig where not hasWebConfigXFrameOptions(webConfig) and not hasCodeXFrameOptions() diff --git a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.ql b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.ql index 9416fa32f0a..2337ecfc4cf 100644 --- a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.ql +++ b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.ql @@ -13,7 +13,7 @@ import csharp import semmle.code.asp.WebConfig -from SystemWebServerXMLElement ws, XMLAttribute a +from SystemWebServerXmlElement ws, XMLAttribute a where ws.getAChild("directoryBrowse").getAttribute("enabled") = a and a.getValue() = "true" diff --git a/csharp/ql/src/Security Features/HeaderCheckingDisabled.ql b/csharp/ql/src/Security Features/HeaderCheckingDisabled.ql index 631b408a5a3..5d0958d06f9 100644 --- a/csharp/ql/src/Security Features/HeaderCheckingDisabled.ql +++ b/csharp/ql/src/Security Features/HeaderCheckingDisabled.ql @@ -27,7 +27,7 @@ where ) or // header checking is disabled in a configuration file - exists(HttpRuntimeXMLElement e, XMLAttribute a | + exists(HttpRuntimeXmlElement e, XMLAttribute a | a = e.getAttribute("enableHeaderChecking") and a.getValue().toLowerCase() = "false" and a = l diff --git a/csharp/ql/src/Stubs/make_stubs_nuget.py b/csharp/ql/src/Stubs/make_stubs_nuget.py index c95ab3a0258..f06fc75e0de 100644 --- a/csharp/ql/src/Stubs/make_stubs_nuget.py +++ b/csharp/ql/src/Stubs/make_stubs_nuget.py @@ -71,7 +71,7 @@ if (version != "latest"): cmd.append(version) run_cmd(cmd) -sdk_version = '6.0.101' +sdk_version = '6.0.202' print("\n* Creating new global.json file and setting SDK to " + sdk_version) run_cmd(['dotnet', 'new', 'globaljson', '--force', '--sdk-version', sdk_version, '--output', workDir]) diff --git a/csharp/ql/src/Telemetry/ExternalApi.qll b/csharp/ql/src/Telemetry/ExternalApi.qll new file mode 100644 index 00000000000..b47c9c2c077 --- /dev/null +++ b/csharp/ql/src/Telemetry/ExternalApi.qll @@ -0,0 +1,109 @@ +/** Provides classes and predicates related to handling APIs from external libraries. */ + +private import csharp +private import dotnet +private import semmle.code.csharp.dispatch.Dispatch +private import semmle.code.csharp.dataflow.ExternalFlow +private import semmle.code.csharp.dataflow.FlowSummary +private import semmle.code.csharp.dataflow.internal.DataFlowImplCommon as DataFlowImplCommon +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate +private import semmle.code.csharp.dataflow.internal.DataFlowDispatch as DataFlowDispatch +private import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate +private import semmle.code.csharp.security.dataflow.flowsources.Remote + +/** + * A test library. + */ +class TestLibrary extends RefType { + TestLibrary() { + this.getNamespace() + .getName() + .matches(["NUnit.Framework%", "Xunit%", "Microsoft.VisualStudio.TestTools.UnitTesting%"]) + } +} + +/** + * An external API from either the C# Standard Library or a 3rd party library. + */ +class ExternalApi extends DotNet::Callable { + ExternalApi() { this.isUnboundDeclaration() and this.fromLibrary() } + + /** + * Gets the unbound type, name and parameter types of this API. + */ + private string getSignature() { + result = + this.getDeclaringType().getUnboundDeclaration() + "." + this.getName() + "(" + + parameterQualifiedTypeNamesToString(this) + ")" + } + + /** + * Gets the namespace of this API. + */ + private string getNamespace() { this.getDeclaringType().hasQualifiedName(result, _) } + + /** + * Gets the assembly file name containing this API. + */ + private string getAssembly() { result = this.getFile().getBaseName() } + + /** + * Gets the assembly file name and namespace of this API. + */ + string getInfoPrefix() { result = this.getAssembly() + "#" + this.getNamespace() } + + /** + * Gets the assembly file name, namespace and signature of this API. + */ + string getInfo() { result = this.getInfoPrefix() + "#" + this.getSignature() } + + /** Gets a call to this API callable. */ + DispatchCall getACall() { + this = result.getADynamicTarget().getUnboundDeclaration() + or + this = result.getAStaticTarget().getUnboundDeclaration() + } + + /** Gets a node that is an input to a call to this API. */ + private ArgumentNode getAnInput() { + result.getCall().(DataFlowDispatch::NonDelegateDataFlowCall).getDispatchCall() = this.getACall() + } + + /** Gets a node that is an output from a call to this API. */ + private DataFlow::Node getAnOutput() { + exists(DataFlowDispatch::NonDelegateDataFlowCall call, DataFlowImplCommon::ReturnKindExt ret | + result = ret.getAnOutNode(call) + | + this.getACall() = call.getDispatchCall() + ) + } + + /** Holds if this API has a supported summary. */ + predicate hasSummary() { + this instanceof SummarizedCallable + or + defaultAdditionalTaintStep(this.getAnInput(), _) + } + + /** Holds if this API is is a constructor without parameters. */ + private predicate isParameterlessConstructor() { + this instanceof Constructor and this.getNumberOfParameters() = 0 + } + + /** Holds if this API is part of a common testing library or framework. */ + private predicate isTestLibrary() { this.getDeclaringType() instanceof TestLibrary } + + /** Holds if this API is not worth supporting. */ + predicate isUninteresting() { this.isTestLibrary() or this.isParameterlessConstructor() } + + /** Holds if this API is a known source. */ + predicate isSource() { + this.getAnOutput() instanceof RemoteFlowSource or sourceNode(this.getAnOutput(), _) + } + + /** Holds if this API is a known sink. */ + predicate isSink() { sinkNode(this.getAnInput(), _) } + + /** Holds if this API is supported by existing CodeQL libraries, that is, it is either a recognized source or sink or has a flow summary. */ + predicate isSupported() { this.hasSummary() or this.isSource() or this.isSink() } +} diff --git a/csharp/ql/src/Telemetry/ExternalLibraryUsage.ql b/csharp/ql/src/Telemetry/ExternalLibraryUsage.ql new file mode 100644 index 00000000000..51ae5609025 --- /dev/null +++ b/csharp/ql/src/Telemetry/ExternalLibraryUsage.ql @@ -0,0 +1,21 @@ +/** + * @name External libraries + * @description A list of external libraries used in the code + * @kind metric + * @tags summary telemetry + * @id csharp/telemetry/external-libs + */ + +private import csharp +private import semmle.code.csharp.dispatch.Dispatch +private import ExternalApi + +from int usages, string info +where + usages = + strictcount(DispatchCall c, ExternalApi api | + c = api.getACall() and + api.getInfoPrefix() = info and + not api.isUninteresting() + ) +select info, usages order by usages desc diff --git a/csharp/ql/src/Telemetry/SupportedExternalSinks.ql b/csharp/ql/src/Telemetry/SupportedExternalSinks.ql new file mode 100644 index 00000000000..2f13c334ba4 --- /dev/null +++ b/csharp/ql/src/Telemetry/SupportedExternalSinks.ql @@ -0,0 +1,18 @@ +/** + * @name Supported sinks in external libraries + * @description A list of 3rd party APIs detected as sinks. Excludes APIs exposed by test libraries. + * @kind metric + * @tags summary telemetry + * @id csharp/telemetry/supported-external-api-sinks + */ + +private import csharp +private import semmle.code.csharp.dispatch.Dispatch +private import ExternalApi + +from ExternalApi api, int usages +where + not api.isUninteresting() and + api.isSink() and + usages = strictcount(DispatchCall c | c = api.getACall()) +select api.getInfo() as info, usages order by usages desc diff --git a/csharp/ql/src/Telemetry/SupportedExternalSources.ql b/csharp/ql/src/Telemetry/SupportedExternalSources.ql new file mode 100644 index 00000000000..9a81f7a7ffd --- /dev/null +++ b/csharp/ql/src/Telemetry/SupportedExternalSources.ql @@ -0,0 +1,18 @@ +/** + * @name Supported sources in external libraries + * @description A list of 3rd party APIs detected as sources. Excludes APIs exposed by test libraries. + * @kind metric + * @tags summary telemetry + * @id csharp/telemetry/supported-external-api-sources + */ + +private import csharp +private import semmle.code.csharp.dispatch.Dispatch +private import ExternalApi + +from ExternalApi api, int usages +where + not api.isUninteresting() and + api.isSource() and + usages = strictcount(DispatchCall c | c = api.getACall()) +select api.getInfo() as info, usages order by usages desc diff --git a/csharp/ql/src/Telemetry/SupportedExternalTaint.ql b/csharp/ql/src/Telemetry/SupportedExternalTaint.ql new file mode 100644 index 00000000000..022c935f77e --- /dev/null +++ b/csharp/ql/src/Telemetry/SupportedExternalTaint.ql @@ -0,0 +1,18 @@ +/** + * @name Supported flow steps in external libraries + * @description A list of 3rd party APIs detected as flow steps. Excludes APIs exposed by test libraries. + * @kind metric + * @tags summary telemetry + * @id csharp/telemetry/supported-external-api-taint + */ + +private import csharp +private import semmle.code.csharp.dispatch.Dispatch +private import ExternalApi + +from ExternalApi api, int usages +where + not api.isUninteresting() and + api.hasSummary() and + usages = strictcount(DispatchCall c | c = api.getACall()) +select api.getInfo() as info, usages order by usages desc diff --git a/csharp/ql/src/Telemetry/UnsupportedExternalAPIs.ql b/csharp/ql/src/Telemetry/UnsupportedExternalAPIs.ql new file mode 100644 index 00000000000..c9428be413f --- /dev/null +++ b/csharp/ql/src/Telemetry/UnsupportedExternalAPIs.ql @@ -0,0 +1,18 @@ +/** + * @name Usage of unsupported APIs coming from external libraries + * @description A list of 3rd party APIs used in the codebase. Excludes APIs exposed by test libraries. + * @kind metric + * @tags summary telemetry + * @id csharp/telemetry/unsupported-external-api + */ + +private import csharp +private import semmle.code.csharp.dispatch.Dispatch +private import ExternalApi + +from ExternalApi api, int usages +where + not api.isUninteresting() and + not api.isSupported() and + usages = strictcount(DispatchCall c | c = api.getACall()) +select api.getInfo() as info, usages order by usages desc diff --git a/csharp/ql/src/change-notes/2022-02-15-hardcoded-credentials-downgrade.md b/csharp/ql/src/change-notes/2022-02-15-hardcoded-credentials-downgrade.md deleted file mode 100644 index a33c09ab18d..00000000000 --- a/csharp/ql/src/change-notes/2022-02-15-hardcoded-credentials-downgrade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: queryMetadata ---- -The precision of hardcoded credentials queries (`cs/hardcoded-credentials` and -`cs/hardcoded-connection-string-credentials`) have been downgraded to medium. \ No newline at end of file diff --git a/csharp/ql/src/change-notes/released/0.0.10.md b/csharp/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..9b4d2ccc75f --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,6 @@ +## 0.0.10 + +### Query Metadata Changes + +* The precision of hardcoded credentials queries (`cs/hardcoded-credentials` and +`cs/hardcoded-connection-string-credentials`) have been downgraded to medium. diff --git a/csharp/ql/src/change-notes/released/0.0.11.md b/csharp/ql/src/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..68db1093830 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.11.md @@ -0,0 +1,9 @@ +## 0.0.11 + +### Minor Analysis Improvements + +* Casts to `dynamic` are excluded from the useless upcasts check (`cs/useless-upcast`). +* The C# extractor now accepts an extractor option `buildless`, which is used to decide what type of extraction that should be performed. If `true` then buildless (standalone) extraction will be performed. Otherwise tracing extraction will be performed (default). +The option is added via `codeql database create --language=csharp -Obuildless=true ...`. +* The C# extractor now accepts an extractor option `trap.compression`, which is used to decide the compression format for TRAP files. The legal values are `brotli` (default), `gzip` or `none`. +The option is added via `codeql database create --language=csharp -Otrap.compression=value ...`. diff --git a/csharp/ql/src/change-notes/released/0.0.12.md b/csharp/ql/src/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..a8e2f0b468e --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.12.md @@ -0,0 +1 @@ +## 0.0.12 diff --git a/csharp/ql/src/change-notes/released/0.0.13.md b/csharp/ql/src/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..30ff8ab8dd0 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.13.md @@ -0,0 +1 @@ +## 0.0.13 diff --git a/csharp/ql/src/change-notes/released/0.1.0.md b/csharp/ql/src/change-notes/released/0.1.0.md new file mode 100644 index 00000000000..716b38240a4 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.1.0.md @@ -0,0 +1 @@ +## 0.1.0 diff --git a/csharp/ql/src/change-notes/released/0.1.1.md b/csharp/ql/src/change-notes/released/0.1.1.md new file mode 100644 index 00000000000..f8f257d7250 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.1.1.md @@ -0,0 +1 @@ +## 0.1.1 diff --git a/csharp/ql/src/change-notes/released/0.1.2.md b/csharp/ql/src/change-notes/released/0.1.2.md new file mode 100644 index 00000000000..66bd49d11eb --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.1.2.md @@ -0,0 +1 @@ +## 0.1.2 diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index ecdd64fbab8..6abd14b1ef8 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.9 +lastReleaseVersion: 0.1.2 diff --git a/csharp/ql/src/definitions.qll b/csharp/ql/src/definitions.qll index 8580f88d05d..4feaf20629c 100644 --- a/csharp/ql/src/definitions.qll +++ b/csharp/ql/src/definitions.qll @@ -105,7 +105,7 @@ private class AccessUse extends Access, Use { not this.(PropertyAccess).getParent().getParent() instanceof Property // Property initializer } - /** Gets the qualifier of this acccess, if any. */ + /** Gets the qualifier of this access, if any. */ private Expr getFormatQualifier() { result = this.(QualifiableExpr).getQualifier() and not result.isImplicit() diff --git a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql index 5a10f091b29..edcbf425497 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql @@ -10,7 +10,6 @@ import csharp import semmle.code.csharp.dataflow.DataFlow2 -import semmle.code.csharp.dataflow.TaintTracking import semmle.code.csharp.dataflow.TaintTracking2 import DataFlow::PathGraph diff --git a/csharp/ql/src/experimental/Security Features/backdoor/PotentialTimeBomb.ql b/csharp/ql/src/experimental/Security Features/backdoor/PotentialTimeBomb.ql index 31c00e8a378..4745daf6b8b 100644 --- a/csharp/ql/src/experimental/Security Features/backdoor/PotentialTimeBomb.ql +++ b/csharp/ql/src/experimental/Security Features/backdoor/PotentialTimeBomb.ql @@ -70,7 +70,7 @@ class DateTimeStruct extends Struct { } /** - * Holds if the Callable is used for DateTime comparision + * Holds if the Callable is used for DateTime comparison */ Callable getAComparisonCallable() { (result = this.getAnOperator() or result = this.getAMethod()) and diff --git a/csharp/ql/src/experimental/ir/implementation/EdgeKind.qll b/csharp/ql/src/experimental/ir/implementation/EdgeKind.qll index 32e36bb6787..91e1fe03e23 100644 --- a/csharp/ql/src/experimental/ir/implementation/EdgeKind.qll +++ b/csharp/ql/src/experimental/ir/implementation/EdgeKind.qll @@ -67,7 +67,7 @@ class DefaultEdge extends EdgeKind, TDefaultEdge { /** * A "case" edge, representing the successor of a `Switch` instruction when the - * the condition value matches a correponding `case` label. + * the condition value matches a corresponding `case` label. */ class CaseEdge extends EdgeKind, TCaseEdge { string minValue; diff --git a/csharp/ql/src/experimental/ir/implementation/internal/TInstruction.qll b/csharp/ql/src/experimental/ir/implementation/internal/TInstruction.qll index 4b3f19cbdde..5a7099d9fa2 100644 --- a/csharp/ql/src/experimental/ir/implementation/internal/TInstruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/internal/TInstruction.qll @@ -19,24 +19,24 @@ newtype TInstruction = ) { IRConstruction::Raw::hasInstruction(tag1, tag2) } or - TUnaliasedSSAPhiInstruction( - TRawInstruction blockStartInstr, UnaliasedSSA::SSA::MemoryLocation memoryLocation + TUnaliasedSsaPhiInstruction( + TRawInstruction blockStartInstr, UnaliasedSsa::SSA::MemoryLocation memoryLocation ) { - UnaliasedSSA::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) + UnaliasedSsa::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) } or - TUnaliasedSSAChiInstruction(TRawInstruction primaryInstruction) { none() } or - TUnaliasedSSAUnreachedInstruction(IRFunctionBase irFunc) { - UnaliasedSSA::SSA::hasUnreachedInstruction(irFunc) + TUnaliasedSsaChiInstruction(TRawInstruction primaryInstruction) { none() } or + TUnaliasedSsaUnreachedInstruction(IRFunctionBase irFunc) { + UnaliasedSsa::SSA::hasUnreachedInstruction(irFunc) } or - TAliasedSSAPhiInstruction( + TAliasedSsaPhiInstruction( TRawInstruction blockStartInstr, AliasedSSA::SSA::MemoryLocation memoryLocation ) { AliasedSSA::SSA::hasPhiInstruction(blockStartInstr, memoryLocation) } or - TAliasedSSAChiInstruction(TRawInstruction primaryInstruction) { + TAliasedSsaChiInstruction(TRawInstruction primaryInstruction) { AliasedSSA::SSA::hasChiInstruction(primaryInstruction) } or - TAliasedSSAUnreachedInstruction(IRFunctionBase irFunc) { + TAliasedSsaUnreachedInstruction(IRFunctionBase irFunc) { AliasedSSA::SSA::hasUnreachedInstruction(irFunc) } @@ -46,58 +46,64 @@ newtype TInstruction = * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module UnaliasedSSAInstructions { - class TPhiInstruction = TUnaliasedSSAPhiInstruction; +module UnaliasedSsaInstructions { + class TPhiInstruction = TUnaliasedSsaPhiInstruction; TPhiInstruction phiInstruction( - TRawInstruction blockStartInstr, UnaliasedSSA::SSA::MemoryLocation memoryLocation + TRawInstruction blockStartInstr, UnaliasedSsa::SSA::MemoryLocation memoryLocation ) { - result = TUnaliasedSSAPhiInstruction(blockStartInstr, memoryLocation) + result = TUnaliasedSsaPhiInstruction(blockStartInstr, memoryLocation) } TRawInstruction reusedPhiInstruction(TRawInstruction blockStartInstr) { none() } - class TChiInstruction = TUnaliasedSSAChiInstruction; + class TChiInstruction = TUnaliasedSsaChiInstruction; TChiInstruction chiInstruction(TRawInstruction primaryInstruction) { - result = TUnaliasedSSAChiInstruction(primaryInstruction) + result = TUnaliasedSsaChiInstruction(primaryInstruction) } - class TUnreachedInstruction = TUnaliasedSSAUnreachedInstruction; + class TUnreachedInstruction = TUnaliasedSsaUnreachedInstruction; TUnreachedInstruction unreachedInstruction(IRFunctionBase irFunc) { - result = TUnaliasedSSAUnreachedInstruction(irFunc) + result = TUnaliasedSsaUnreachedInstruction(irFunc) } } +/** DEPRECATED: Alias for UnaliasedSsaInstructions */ +deprecated module UnaliasedSSAInstructions = UnaliasedSsaInstructions; + /** * Provides wrappers for the constructors of each branch of `TInstruction` that is used by the * aliased SSA stage. * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module AliasedSSAInstructions { - class TPhiInstruction = TAliasedSSAPhiInstruction or TUnaliasedSSAPhiInstruction; +module AliasedSsaInstructions { + class TPhiInstruction = TAliasedSsaPhiInstruction or TUnaliasedSsaPhiInstruction; TPhiInstruction phiInstruction( TRawInstruction blockStartInstr, AliasedSSA::SSA::MemoryLocation memoryLocation ) { - result = TAliasedSSAPhiInstruction(blockStartInstr, memoryLocation) + result = TAliasedSsaPhiInstruction(blockStartInstr, memoryLocation) } TPhiInstruction reusedPhiInstruction(TRawInstruction blockStartInstr) { - result = TUnaliasedSSAPhiInstruction(blockStartInstr, _) + result = TUnaliasedSsaPhiInstruction(blockStartInstr, _) } - class TChiInstruction = TAliasedSSAChiInstruction; + class TChiInstruction = TAliasedSsaChiInstruction; TChiInstruction chiInstruction(TRawInstruction primaryInstruction) { - result = TAliasedSSAChiInstruction(primaryInstruction) + result = TAliasedSsaChiInstruction(primaryInstruction) } - class TUnreachedInstruction = TAliasedSSAUnreachedInstruction; + class TUnreachedInstruction = TAliasedSsaUnreachedInstruction; TUnreachedInstruction unreachedInstruction(IRFunctionBase irFunc) { - result = TAliasedSSAUnreachedInstruction(irFunc) + result = TAliasedSsaUnreachedInstruction(irFunc) } } + +/** DEPRECATED: Alias for AliasedSsaInstructions */ +deprecated module AliasedSSAInstructions = AliasedSsaInstructions; diff --git a/csharp/ql/src/experimental/ir/implementation/internal/TInstructionInternal.qll b/csharp/ql/src/experimental/ir/implementation/internal/TInstructionInternal.qll index 978d2c41aa7..252f390bf55 100644 --- a/csharp/ql/src/experimental/ir/implementation/internal/TInstructionInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/internal/TInstructionInternal.qll @@ -1,4 +1,4 @@ import experimental.ir.internal.IRCSharpLanguage as Language import experimental.ir.implementation.raw.internal.IRConstruction as IRConstruction -import experimental.ir.implementation.unaliased_ssa.internal.SSAConstruction as UnaliasedSSA +import experimental.ir.implementation.unaliased_ssa.internal.SSAConstruction as UnaliasedSsa import AliasedSSAStub as AliasedSSA diff --git a/csharp/ql/src/experimental/ir/implementation/internal/TOperand.qll b/csharp/ql/src/experimental/ir/implementation/internal/TOperand.qll index 20fe77f8223..6327c603901 100644 --- a/csharp/ql/src/experimental/ir/implementation/internal/TOperand.qll +++ b/csharp/ql/src/experimental/ir/implementation/internal/TOperand.qll @@ -29,7 +29,7 @@ private module Internal { TNoOperand() { none() } or // Can be "removed" later when there's unreachable code // These operands can be reused across all three stages. They just get different defs. - TNonSSAMemoryOperand(Raw::Instruction useInstr, MemoryOperandTag tag) { + TNonSsaMemoryOperand(Raw::Instruction useInstr, MemoryOperandTag tag) { // Has no definition in raw but will get definitions later useInstr.getOpcode().hasOperand(tag) } or @@ -57,13 +57,21 @@ private module Shared { result = Internal::TRegisterOperand(useInstr, tag, defInstr) } - class TNonSSAMemoryOperand = Internal::TNonSSAMemoryOperand; + class TNonSsaMemoryOperand = Internal::TNonSsaMemoryOperand; + + /** DEPRECATED: Alias for TNonSsaMemoryOperand */ + deprecated class TNonSSAMemoryOperand = TNonSsaMemoryOperand; /** * Returns the non-Phi memory operand with the specified parameters. */ - TNonSSAMemoryOperand nonSSAMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { - result = Internal::TNonSSAMemoryOperand(useInstr, tag) + TNonSsaMemoryOperand nonSsaMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { + result = Internal::TNonSsaMemoryOperand(useInstr, tag) + } + + /** DEPRECATED: Alias for nonSsaMemoryOperand */ + deprecated TNonSSAMemoryOperand nonSSAMemoryOperand(TRawInstruction useInstr, MemoryOperandTag tag) { + result = nonSsaMemoryOperand(useInstr, tag) } } @@ -80,7 +88,7 @@ module RawOperands { class TChiOperand = Internal::TNoOperand; - class TNonPhiMemoryOperand = TNonSSAMemoryOperand or TChiOperand; + class TNonPhiMemoryOperand = TNonSsaMemoryOperand or TChiOperand; /** * Returns the Phi operand with the specified parameters. @@ -114,14 +122,14 @@ module RawOperands { * These wrappers are not parameterized because it is not possible to invoke an IPA constructor via * a class alias. */ -module UnaliasedSSAOperands { +module UnaliasedSsaOperands { import Shared class TPhiOperand = Internal::TUnaliasedPhiOperand; class TChiOperand = Internal::TNoOperand; - class TNonPhiMemoryOperand = TNonSSAMemoryOperand or TChiOperand; + class TNonPhiMemoryOperand = TNonSsaMemoryOperand or TChiOperand; /** * Returns the Phi operand with the specified parameters. @@ -148,3 +156,6 @@ module UnaliasedSSAOperands { */ TChiOperand chiOperand(Unaliased::Instruction useInstr, ChiOperandTag tag) { none() } } + +/** DEPRECATED: Alias for UnaliasedSsaOperands */ +deprecated module UnaliasedSSAOperands = UnaliasedSsaOperands; diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll index 82db3146630..bac7634cbd0 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll @@ -161,8 +161,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock dominanceFrontier() { - this.dominates(result.getAPredecessor()) and - not this.strictlyDominates(result) + this.getASuccessor() = result and + not this.immediatelyDominates(result) + or + exists(IRBlock prev | result = prev.dominanceFrontier() | + this.immediatelyDominates(prev) and + not this.immediatelyDominates(result) + ) } /** @@ -201,8 +206,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock postDominanceFrontier() { - this.postDominates(result.getASuccessor()) and - not this.strictlyPostDominates(result) + this.getAPredecessor() = result and + not this.immediatelyPostDominates(result) + or + exists(IRBlock prev | result = prev.postDominanceFrontier() | + this.immediatelyPostDominates(prev) and + not this.immediatelyPostDominates(result) + ) } /** diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRVariable.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRVariable.qll index 146fc270738..ca4708857a7 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IRVariable.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IRVariable.qll @@ -55,7 +55,10 @@ class IRVariable extends TIRVariable { * Gets the AST node that declared this variable, or that introduced this * variable as part of the AST-to-IR translation. */ - Language::AST getAST() { none() } + Language::AST getAst() { none() } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = getAst() } /** * Gets an identifier string for the variable. This identifier is unique @@ -66,7 +69,7 @@ class IRVariable extends TIRVariable { /** * Gets the source location of this variable. */ - final Language::Location getLocation() { result = getAST().getLocation() } + final Language::Location getLocation() { result = getAst().getLocation() } /** * Gets the IR for the function that references this variable. @@ -90,7 +93,10 @@ class IRUserVariable extends IRVariable, TIRUserVariable { final override string toString() { result = getVariable().toString() } - final override Language::AST getAST() { result = var } + final override Language::AST getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } final override string getUniqueId() { result = getVariable().toString() + " " + getVariable().getLocation().toString() @@ -157,7 +163,10 @@ class IRGeneratedVariable extends IRVariable { final override Language::LanguageType getLanguageType() { result = type } - final override Language::AST getAST() { result = ast } + final override Language::AST getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } override string toString() { result = getBaseString() + getLocationString() } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll index 1c2cc493338..e5a908bbf9a 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll @@ -41,7 +41,7 @@ class Instruction extends Construction::TStageInstruction { } /** Gets a textual representation of this element. */ - final string toString() { result = this.getOpcode().toString() + ": " + this.getAST().toString() } + final string toString() { result = this.getOpcode().toString() + ": " + this.getAst().toString() } /** * Gets a string showing the result, opcode, and operands of the instruction, equivalent to what @@ -136,7 +136,7 @@ class Instruction extends Construction::TStageInstruction { string getResultId() { this.shouldGenerateDumpStrings() and result = - this.getResultPrefix() + this.getAST().getLocation().getStartLine() + "_" + this.getLineRank() + this.getResultPrefix() + this.getAst().getLocation().getStartLine() + "_" + this.getLineRank() } /** @@ -208,12 +208,15 @@ class Instruction extends Construction::TStageInstruction { /** * Gets the AST that caused this instruction to be generated. */ - final Language::AST getAST() { result = Construction::getInstructionAST(this) } + final Language::AST getAst() { result = Construction::getInstructionAst(this) } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Gets the location of the source code for this instruction. */ - final Language::Location getLocation() { result = this.getAST().getLocation() } + final Language::Location getLocation() { result = this.getAst().getLocation() } /** * Gets the `Expr` whose result is computed by this instruction, if any. The `Expr` may be a @@ -459,7 +462,10 @@ class VariableInstruction extends Instruction { /** * Gets the AST variable that this instruction's IR variable refers to, if one exists. */ - final Language::Variable getASTVariable() { result = var.(IRUserVariable).getVariable() } + final Language::Variable getAstVariable() { result = var.(IRUserVariable).getVariable() } + + /** DEPRECATED: Alias for getAstVariable */ + deprecated Language::Variable getASTVariable() { result = this.getAstVariable() } } /** diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll b/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll index 89b82657c3b..c1e997d5844 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll @@ -18,7 +18,7 @@ private import internal.OperandInternal * of `TOperand` that are used in this stage. */ private class TStageOperand = - TRegisterOperand or TNonSSAMemoryOperand or TPhiOperand or TChiOperand; + TRegisterOperand or TNonSsaMemoryOperand or TPhiOperand or TChiOperand; /** * A known location. Testing `loc instanceof KnownLocation` will account for non existing locations, as @@ -38,7 +38,7 @@ class Operand extends TStageOperand { // Ensure that the operand does not refer to instructions from earlier stages that are unreachable here exists(Instruction use, Instruction def | this = registerOperand(use, _, def)) or - exists(Instruction use | this = nonSSAMemoryOperand(use, _)) + exists(Instruction use | this = nonSsaMemoryOperand(use, _)) or exists(Instruction use, Instruction def, IRBlock predecessorBlock | this = phiOperand(use, def, predecessorBlock, _) or @@ -209,7 +209,7 @@ class Operand extends TStageOperand { class MemoryOperand extends Operand { cached MemoryOperand() { - this instanceof TNonSSAMemoryOperand or + this instanceof TNonSsaMemoryOperand or this instanceof TPhiOperand or this instanceof TChiOperand } @@ -249,7 +249,7 @@ class NonPhiOperand extends Operand { NonPhiOperand() { this = registerOperand(useInstr, tag, _) or - this = nonSSAMemoryOperand(useInstr, tag) or + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } @@ -299,7 +299,7 @@ class NonPhiMemoryOperand extends NonPhiOperand, MemoryOperand, TNonPhiMemoryOpe cached NonPhiMemoryOperand() { - this = nonSSAMemoryOperand(useInstr, tag) + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/gvn/ValueNumbering.qll b/csharp/ql/src/experimental/ir/implementation/raw/gvn/ValueNumbering.qll index 796fb792366..ca3c378cd7e 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/gvn/ValueNumbering.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/gvn/ValueNumbering.qll @@ -34,7 +34,7 @@ class ValueNumber extends TValueNumber { final Instruction getAnInstruction() { this = valueNumber(result) } /** - * Gets one of the instructions that was assigned this value number. The chosen instuction is + * Gets one of the instructions that was assigned this value number. The chosen instruction is * deterministic but arbitrary. Intended for use only in debugging. */ final Instruction getExampleInstruction() { diff --git a/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll b/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll index 2467d961892..2dc735f49df 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll @@ -99,13 +99,19 @@ private predicate filteredNumberableInstruction(Instruction instr) { // count rather than strictcount to handle missing AST elements // separate instanceof and inline casts to avoid failed casts with a count of 0 instr instanceof VariableAddressInstruction and - count(instr.(VariableAddressInstruction).getIRVariable().getAST()) != 1 + count(instr.(VariableAddressInstruction).getIRVariable().getAst()) != 1 or instr instanceof ConstantInstruction and count(instr.getResultIRType()) != 1 or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // 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. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAst()) = ast } private predicate initializeParameterValueNumber( @@ -126,15 +131,14 @@ private predicate initializeParameterValueNumber( // 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. - instr.getIRVariable().getAST() = var + instr.getIRVariable().getAst() = var } private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/IRConstruction.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/IRConstruction.qll index 956a95e0667..db6bd5c24e5 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/IRConstruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/IRConstruction.qll @@ -13,7 +13,6 @@ private import TranslatedExpr private import TranslatedStmt private import desugar.Foreach private import TranslatedFunction -private import experimental.ir.Util private import experimental.ir.internal.IRCSharpLanguage as Language TranslatedElement getInstructionTranslatedElement(Instruction instruction) { @@ -62,7 +61,7 @@ module Raw { Callable callable, Language::AST ast, TempVariableTag tag, CSharpType type ) { exists(TranslatedElement element | - element.getAST() = ast and + element.getAst() = ast and callable = element.getFunction() and element.hasTempVariable(tag, type) ) @@ -105,7 +104,7 @@ module Raw { tag = getInstructionTag(instruction) and ( result = element.getInstructionVariable(tag) or - result.(IRStringLiteral).getAST() = element.getInstructionStringLiteral(tag) + result.(IRStringLiteral).getAst() = element.getInstructionStringLiteral(tag) ) ) } @@ -357,7 +356,7 @@ private module Cached { exists(TranslatedElement s, GotoStmt goto | goto instanceof GotoStmt and not isStrictlyForwardGoto(goto) and - goto = s.getAST() and + goto = s.getAst() and exists(InstructionTag tag | result = s.getInstructionSuccessor(tag, kind) and instruction = s.getInstruction(tag) @@ -372,8 +371,14 @@ private module Cached { } cached - Language::AST getInstructionAST(Instruction instruction) { - result = getInstructionTranslatedElement(instruction).getAST() + Language::AST getInstructionAst(Instruction instruction) { + result = getInstructionTranslatedElement(instruction).getAst() + } + + /** DEPRECATED: Alias for getInstructionAst */ + cached + deprecated Language::AST getInstructionAST(Instruction instruction) { + result = getInstructionAst(instruction) } cached diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCall.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCall.qll index a2c6a708c72..e131a26be65 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCall.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCall.qll @@ -5,7 +5,6 @@ private import InstructionTag private import TranslatedElement private import TranslatedExpr private import TranslatedInitialization -private import experimental.ir.Util private import experimental.ir.implementation.raw.internal.common.TranslatedCallBase private import experimental.ir.internal.IRCSharpLanguage as Language diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCondition.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCondition.qll index 99833c70d0b..fe555344b2f 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedCondition.qll @@ -15,7 +15,10 @@ abstract class TranslatedCondition extends ConditionBase { final override string toString() { result = expr.toString() } - final override Language::AST getAST() { result = expr } + final override Language::AST getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final Expr getExpr() { result = expr } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedDeclaration.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedDeclaration.qll index 9b4fbbba723..74d72f4f438 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedDeclaration.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedDeclaration.qll @@ -14,7 +14,7 @@ private import common.TranslatedDeclarationBase * `entry`. */ TranslatedLocalDeclaration getTranslatedLocalDeclaration(LocalVariableDeclExpr declExpr) { - result.getAST() = declExpr + result.getAst() = declExpr } /** @@ -29,7 +29,10 @@ abstract class TranslatedLocalDeclaration extends TranslatedElement, TTranslated final override string toString() { result = expr.toString() } - final override Language::AST getAST() { result = expr } + final override Language::AST getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } } /** diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedElement.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedElement.qll index ea1ad7931cb..7fc54f80b80 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedElement.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedElement.qll @@ -10,7 +10,6 @@ private import TranslatedCondition private import TranslatedFunction private import TranslatedStmt private import IRConstruction -private import experimental.ir.Util private import experimental.ir.internal.IRCSharpLanguage as Language private import desugar.Foreach private import desugar.Delegate @@ -27,7 +26,7 @@ IRUserVariable getIRUserVariable(Language::Function func, Language::Variable var } IRTempVariable getIRTempVariable(Language::AST ast, TempVariableTag tag) { - result.getAST() = ast and + result.getAst() = ast and result.getTag() = tag } @@ -365,7 +364,10 @@ abstract class TranslatedElement extends TTranslatedElement { /** * Gets the AST node being translated. */ - abstract Language::AST getAST(); + abstract Language::AST getAst(); + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Get the first instruction to be executed in the evaluation of this element. @@ -558,7 +560,7 @@ abstract class TranslatedElement extends TTranslatedElement { * Gets the temporary variable generated by this element with tag `tag`. */ final IRTempVariable getTempVariable(TempVariableTag tag) { - result.getAST() = this.getAST() and + result.getAst() = this.getAst() and result.getTag() = tag and this.hasTempVariable(tag, _) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll index 4f4c1a5f073..c4ad2428202 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedExpr.qll @@ -16,7 +16,6 @@ private import common.TranslatedExprBase private import desugar.Delegate private import desugar.internal.TranslatedCompilerGeneratedCall import TranslatedCall -private import experimental.ir.Util private import experimental.ir.internal.IRCSharpLanguage as Language /** @@ -62,7 +61,10 @@ abstract class TranslatedExpr extends TranslatedExprBase { */ final Type getResultType() { result = expr.getType() } - final override Language::AST getAST() { result = expr } + final override Language::AST getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final override Callable getFunction() { result = expr.getEnclosingCallable() } @@ -577,9 +579,9 @@ class TranslatedArrayAccess extends TranslatedNonConstantExpr { result = this.getInstruction(ElementsAddressTag(0)) or // The successor of an offset expression is a `PointerAdd` expression. - child = this.getOffsetOperand(child.getAST().getIndex()) and - child.getAST().getIndex() >= 0 and - result = this.getInstruction(PointerAddTag(child.getAST().getIndex())) + child = this.getOffsetOperand(child.getAst().getIndex()) and + child.getAst().getIndex() >= 0 and + result = this.getInstruction(PointerAddTag(child.getAst().getIndex())) } override Instruction getResult() { @@ -2039,7 +2041,7 @@ class TranslatedObjectCreation extends TranslatedCreation { // Since calls are also expressions, we can't // use the predicate getTranslatedExpr (since that would // also return `this`). - result.getAST() = this.getAST() + result.getAst() = this.getAst() } override predicate needsLoad() { expr.getObjectType().isValueType() } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedFunction.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedFunction.qll index 94b48b0985d..24f340a8718 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedFunction.qll @@ -15,7 +15,7 @@ private import experimental.ir.internal.IRCSharpLanguage as Language /** * Gets the `TranslatedFunction` that represents function `callable`. */ -TranslatedFunction getTranslatedFunction(Callable callable) { result.getAST() = callable } +TranslatedFunction getTranslatedFunction(Callable callable) { result.getAst() = callable } /** * Represents the IR translation of a function. This is the root element for @@ -28,7 +28,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final override string toString() { result = callable.toString() } - final override Language::AST getAST() { result = callable } + final override Language::AST getAst() { result = callable } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } /** * Gets the function being translated. @@ -269,7 +272,7 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { /** * Gets the `TranslatedParameter` that represents parameter `param`. */ -TranslatedParameter getTranslatedParameter(Parameter param) { result.getAST() = param } +TranslatedParameter getTranslatedParameter(Parameter param) { result.getAst() = param } /** * Represents the IR translation of a function parameter, including the @@ -282,7 +285,10 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter { final override string toString() { result = param.toString() } - final override Language::AST getAST() { result = param } + final override Language::AST getAst() { result = param } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final override Callable getFunction() { result = param.getCallable() } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedInitialization.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedInitialization.qll index 77e41c15e72..d5b287ddbde 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -11,7 +11,6 @@ private import InstructionTag private import TranslatedElement private import TranslatedExpr private import TranslatedFunction -private import experimental.ir.Util private import IRInternal private import desugar.Delegate @@ -51,7 +50,10 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn final override Callable getFunction() { result = expr.getEnclosingCallable() } - final override Language::AST getAST() { result = expr } + final override Language::AST getAst() { result = expr } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } /** * Gets the expression that is doing the initialization. @@ -206,7 +208,10 @@ abstract class TranslatedElementInitialization extends TranslatedElement { result = initList.toString() + "[" + this.getElementIndex().toString() + "]" } - final override Language::AST getAST() { result = initList } + final override Language::AST getAst() { result = initList } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final override Callable getFunction() { result = initList.getEnclosingCallable() } @@ -310,7 +315,10 @@ abstract class TranslatedConstructorCallFromConstructor extends TranslatedElemen ConstructorCallContext { Call call; - final override Language::AST getAST() { result = call } + final override Language::AST getAst() { result = call } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final override TranslatedElement getChild(int id) { id = 0 and result = this.getConstructorCall() @@ -327,7 +335,7 @@ abstract class TranslatedConstructorCallFromConstructor extends TranslatedElemen } TranslatedConstructorInitializer getTranslatedConstructorInitializer(ConstructorInitializer ci) { - result.getAST() = ci + result.getAst() = ci } /** diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedStmt.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedStmt.qll index ac69a9c0f28..d95a73e4e42 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/TranslatedStmt.qll @@ -15,7 +15,7 @@ private import experimental.ir.internal.IRUtilities private import desugar.Foreach private import desugar.Lock -TranslatedStmt getTranslatedStmt(Stmt stmt) { result.getAST() = stmt } +TranslatedStmt getTranslatedStmt(Stmt stmt) { result.getAst() = stmt } abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { Stmt stmt; @@ -24,7 +24,10 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { final override string toString() { result = stmt.toString() } - final override Language::AST getAST() { result = stmt } + final override Language::AST getAst() { result = stmt } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = this.getAst() } final override Callable getFunction() { result = stmt.getEnclosingCallable() } } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/common/TranslatedCallBase.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/common/TranslatedCallBase.qll index a870ed02648..f14a420cfeb 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/common/TranslatedCallBase.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/common/TranslatedCallBase.qll @@ -9,7 +9,6 @@ private import experimental.ir.implementation.internal.OperandTag private import experimental.ir.implementation.raw.internal.InstructionTag private import experimental.ir.implementation.raw.internal.TranslatedElement private import experimental.ir.implementation.raw.internal.TranslatedExpr -private import experimental.ir.Util private import experimental.ir.internal.CSharpType private import experimental.ir.internal.IRCSharpLanguage as Language private import TranslatedExprBase diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Common.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Common.qll index ef40d716fea..19b773c2622 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Common.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Common.qll @@ -183,7 +183,7 @@ abstract class TranslatedCompilerGeneratedVariableAccess extends TranslatedCompi override Instruction getChildSuccessor(TranslatedElement child) { none() } /** - * Returns the type of the accessed variable. Can be overriden when the return + * Returns the type of the accessed variable. Can be overridden when the return * type is different than the type of the underlying variable. */ Type getVariableType() { result = getResultType() } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Delegate.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Delegate.qll index f7c80e497fa..5e51073900e 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Delegate.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Delegate.qll @@ -27,10 +27,10 @@ private import experimental.ir.implementation.raw.internal.common.TranslatedExpr */ module DelegateElements { TranslatedDelegateConstructorCall getConstructor(DelegateCreation generatedBy) { - result.getAST() = generatedBy + result.getAst() = generatedBy } - TranslatedDelegateInvokeCall getInvoke(DelegateCall generatedBy) { result.getAST() = generatedBy } + TranslatedDelegateInvokeCall getInvoke(DelegateCall generatedBy) { result.getAst() = generatedBy } int noGeneratedElements(Element generatedBy) { ( diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Foreach.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Foreach.qll index 195072ed124..bc8ec748648 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Foreach.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Foreach.qll @@ -56,9 +56,9 @@ private import internal.TranslatedCompilerGeneratedElement * Module that exposes the functions needed for the translation of the `foreach` stmt. */ module ForeachElements { - TranslatedForeachTry getTry(ForeachStmt generatedBy) { result.getAST() = generatedBy } + TranslatedForeachTry getTry(ForeachStmt generatedBy) { result.getAst() = generatedBy } - TranslatedForeachEnumerator getEnumDecl(ForeachStmt generatedBy) { result.getAST() = generatedBy } + TranslatedForeachEnumerator getEnumDecl(ForeachStmt generatedBy) { result.getAst() = generatedBy } int noGeneratedElements() { result = 13 } } @@ -71,14 +71,14 @@ private class TranslatedForeachTry extends TranslatedCompilerGeneratedTry, override TranslatedElement getFinally() { exists(TranslatedForeachFinally ff | - ff.getAST() = generatedBy and + ff.getAst() = generatedBy and result = ff ) } override TranslatedElement getBody() { exists(TranslatedForeachWhile fw | - fw.getAST() = generatedBy and + fw.getAst() = generatedBy and result = fw ) } @@ -96,7 +96,7 @@ private class TranslatedForeachFinally extends TranslatedCompilerGeneratedBlock, override TranslatedElement getStmt(int index) { index = 0 and exists(TranslatedForeachDispose fd | - fd.getAST() = generatedBy and + fd.getAst() = generatedBy and result = fd ) } @@ -147,14 +147,14 @@ class TranslatedForeachWhile extends TranslatedCompilerGeneratedStmt, ConditionC TranslatedElement getInit() { exists(TranslatedForeachIterVar iv | - iv.getAST() = generatedBy and + iv.getAst() = generatedBy and result = iv ) } ValueConditionBase getCondition() { exists(TranslatedForeachWhileCondition cond | - cond.getAST() = generatedBy and + cond.getAst() = generatedBy and result = cond ) } @@ -180,7 +180,7 @@ private class TranslatedForeachMoveNext extends TranslatedCompilerGeneratedCall, override TranslatedExprBase getQualifier() { exists(TranslatedMoveNextEnumAcc acc | - acc.getAST() = generatedBy and + acc.getAst() = generatedBy and result = acc ) } @@ -230,7 +230,7 @@ private class TranslatedForeachCurrent extends TranslatedCompilerGeneratedCall, override TranslatedExprBase getQualifier() { exists(TranslatedForeachCurrentEnumAcc acc | - acc.getAST() = generatedBy and + acc.getAst() = generatedBy and result = acc ) } @@ -263,7 +263,7 @@ private class TranslatedForeachDispose extends TranslatedCompilerGeneratedCall, override TranslatedExprBase getQualifier() { exists(TranslatedForeachDisposeEnumAcc acc | - acc.getAST() = generatedBy and + acc.getAst() = generatedBy and result = acc ) } @@ -282,7 +282,7 @@ private class TranslatedForeachWhileCondition extends TranslatedCompilerGenerate override TranslatedCompilerGeneratedCall getValueExpr() { exists(TranslatedForeachMoveNext mn | - mn.getAST() = generatedBy and + mn.getAst() = generatedBy and result = mn ) } @@ -311,7 +311,7 @@ private class TranslatedForeachEnumerator extends TranslatedCompilerGeneratedDec override TranslatedCompilerGeneratedCall getInitialization() { exists(TranslatedForeachGetEnumerator ge | - ge.getAST() = generatedBy and + ge.getAst() = generatedBy and result = ge ) } @@ -339,7 +339,7 @@ private class TranslatedForeachIterVar extends TranslatedCompilerGeneratedDeclar override TranslatedCompilerGeneratedCall getInitialization() { exists(TranslatedForeachCurrent crtProp | - crtProp.getAST() = generatedBy and + crtProp.getAst() = generatedBy and result = crtProp ) } @@ -361,7 +361,7 @@ private class TranslatedMoveNextEnumAcc extends TTranslatedCompilerGeneratedElem override Type getVariableType() { exists(TranslatedForeachGetEnumerator ge | - ge.getAST() = generatedBy and + ge.getAst() = generatedBy and result = ge.getCallResultType() ) } @@ -393,7 +393,7 @@ private class TranslatedForeachCurrentEnumAcc extends TTranslatedCompilerGenerat override Type getVariableType() { exists(TranslatedForeachGetEnumerator ge | - ge.getAST() = generatedBy and + ge.getAst() = generatedBy and result = ge.getCallResultType() ) } @@ -425,7 +425,7 @@ private class TranslatedForeachDisposeEnumAcc extends TTranslatedCompilerGenerat override Type getVariableType() { exists(TranslatedForeachGetEnumerator ge | - ge.getAST() = generatedBy and + ge.getAst() = generatedBy and result = ge.getCallResultType() ) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Lock.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Lock.qll index c83957d9b94..e061a1371b2 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Lock.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/Lock.qll @@ -42,12 +42,12 @@ private import internal.TranslatedCompilerGeneratedExpr * Module that exposes the functions needed for the translation of the `lock` stmt. */ module LockElements { - TranslatedLockedVarDecl getLockedVarDecl(LockStmt generatedBy) { result.getAST() = generatedBy } + TranslatedLockedVarDecl getLockedVarDecl(LockStmt generatedBy) { result.getAst() = generatedBy } - TranslatedLockTry getTry(LockStmt generatedBy) { result.getAST() = generatedBy } + TranslatedLockTry getTry(LockStmt generatedBy) { result.getAst() = generatedBy } TranslatedLockWasTakenDecl getLockWasTakenDecl(LockStmt generatedBy) { - result.getAST() = generatedBy + result.getAst() = generatedBy } int noGeneratedElements() { result = 14 } @@ -64,14 +64,14 @@ private class TranslatedLockTry extends TranslatedCompilerGeneratedTry, override TranslatedElement getFinally() { exists(TranslatedLockFinally fin | - fin.getAST() = generatedBy and + fin.getAst() = generatedBy and result = fin ) } override TranslatedElement getBody() { exists(TranslatedLockTryBody ltb | - ltb.getAST() = generatedBy and + ltb.getAst() = generatedBy and result = ltb ) } @@ -89,7 +89,7 @@ private class TranslatedLockTryBody extends TranslatedCompilerGeneratedBlock, override TranslatedElement getStmt(int index) { index = 0 and exists(TranslatedMonitorEnter me | - me.getAST() = generatedBy and + me.getAst() = generatedBy and result = me ) or @@ -110,7 +110,7 @@ private class TranslatedLockFinally extends TranslatedCompilerGeneratedBlock, override TranslatedElement getStmt(int index) { index = 0 and exists(TranslatedFinallyIf fif | - fif.getAST() = generatedBy and + fif.getAst() = generatedBy and result = fif ) } @@ -138,7 +138,7 @@ private class TranslatedMonitorExit extends TranslatedCompilerGeneratedCall, override TranslatedExprBase getArgument(int id) { id = 0 and exists(TranslatedMonitorExitVarAcc var | - var.getAST() = generatedBy and + var.getAst() = generatedBy and result = var ) } @@ -170,13 +170,13 @@ private class TranslatedMonitorEnter extends TranslatedCompilerGeneratedCall, override TranslatedExprBase getArgument(int id) { id = 0 and exists(TranslatedMonitorEnterVarAcc var | - var.getAST() = generatedBy and + var.getAst() = generatedBy and result = var ) or id = 1 and exists(TranslatedLockWasTakenRefArg refArg | - refArg.getAST() = generatedBy and + refArg.getAst() = generatedBy and result = refArg ) } @@ -197,7 +197,7 @@ private class TranslatedIfCondition extends TranslatedCompilerGeneratedValueCond override TranslatedCompilerGeneratedExpr getValueExpr() { exists(TranslatedLockWasTakenCondVarAcc condVar | - condVar.getAST() = generatedBy and + condVar.getAst() = generatedBy and result = condVar ) } @@ -216,14 +216,14 @@ private class TranslatedFinallyIf extends TranslatedCompilerGeneratedIfStmt, override TranslatedCompilerGeneratedValueCondition getCondition() { exists(TranslatedIfCondition cond | - cond.getAST() = generatedBy and + cond.getAst() = generatedBy and result = cond ) } override TranslatedCompilerGeneratedCall getThen() { exists(TranslatedMonitorExit me | - me.getAST() = generatedBy and + me.getAst() = generatedBy and result = me ) } @@ -271,7 +271,7 @@ private class TranslatedLockWasTakenDecl extends TranslatedCompilerGeneratedDecl override TranslatedCompilerGeneratedExpr getInitialization() { exists(TranslatedWasTakenConst const | - const.getAST() = generatedBy and + const.getAst() = generatedBy and result = const ) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/internal/TranslatedCompilerGeneratedElement.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/internal/TranslatedCompilerGeneratedElement.qll index 1eb7520eda4..ffcc400a9bc 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/internal/TranslatedCompilerGeneratedElement.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/desugar/internal/TranslatedCompilerGeneratedElement.qll @@ -18,5 +18,8 @@ abstract class TranslatedCompilerGeneratedElement extends TranslatedElement, final override Callable getFunction() { result = generatedBy.getEnclosingCallable() } - final override Language::AST getAST() { result = generatedBy } + final override Language::AST getAst() { result = generatedBy } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/internal/reachability/DominanceInternal.qll b/csharp/ql/src/experimental/ir/implementation/raw/internal/reachability/DominanceInternal.qll index cee8fa1543b..aaa4cc7bd53 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/internal/reachability/DominanceInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/internal/reachability/DominanceInternal.qll @@ -1,7 +1,5 @@ private import ReachableBlock as Reachability -private module ReachabilityGraph = Reachability::Graph; - module Graph { import Reachability::Graph diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll index 82db3146630..bac7634cbd0 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll @@ -161,8 +161,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock dominanceFrontier() { - this.dominates(result.getAPredecessor()) and - not this.strictlyDominates(result) + this.getASuccessor() = result and + not this.immediatelyDominates(result) + or + exists(IRBlock prev | result = prev.dominanceFrontier() | + this.immediatelyDominates(prev) and + not this.immediatelyDominates(result) + ) } /** @@ -201,8 +206,13 @@ class IRBlock extends IRBlockBase { */ pragma[noinline] final IRBlock postDominanceFrontier() { - this.postDominates(result.getASuccessor()) and - not this.strictlyPostDominates(result) + this.getAPredecessor() = result and + not this.immediatelyPostDominates(result) + or + exists(IRBlock prev | result = prev.postDominanceFrontier() | + this.immediatelyPostDominates(prev) and + not this.immediatelyPostDominates(result) + ) } /** diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRVariable.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRVariable.qll index 146fc270738..ca4708857a7 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRVariable.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRVariable.qll @@ -55,7 +55,10 @@ class IRVariable extends TIRVariable { * Gets the AST node that declared this variable, or that introduced this * variable as part of the AST-to-IR translation. */ - Language::AST getAST() { none() } + Language::AST getAst() { none() } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = getAst() } /** * Gets an identifier string for the variable. This identifier is unique @@ -66,7 +69,7 @@ class IRVariable extends TIRVariable { /** * Gets the source location of this variable. */ - final Language::Location getLocation() { result = getAST().getLocation() } + final Language::Location getLocation() { result = getAst().getLocation() } /** * Gets the IR for the function that references this variable. @@ -90,7 +93,10 @@ class IRUserVariable extends IRVariable, TIRUserVariable { final override string toString() { result = getVariable().toString() } - final override Language::AST getAST() { result = var } + final override Language::AST getAst() { result = var } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } final override string getUniqueId() { result = getVariable().toString() + " " + getVariable().getLocation().toString() @@ -157,7 +163,10 @@ class IRGeneratedVariable extends IRVariable { final override Language::LanguageType getLanguageType() { result = type } - final override Language::AST getAST() { result = ast } + final override Language::AST getAst() { result = ast } + + /** DEPRECATED: Alias for getAst */ + deprecated override Language::AST getAST() { result = getAst() } override string toString() { result = getBaseString() + getLocationString() } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll index 1c2cc493338..e5a908bbf9a 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll @@ -41,7 +41,7 @@ class Instruction extends Construction::TStageInstruction { } /** Gets a textual representation of this element. */ - final string toString() { result = this.getOpcode().toString() + ": " + this.getAST().toString() } + final string toString() { result = this.getOpcode().toString() + ": " + this.getAst().toString() } /** * Gets a string showing the result, opcode, and operands of the instruction, equivalent to what @@ -136,7 +136,7 @@ class Instruction extends Construction::TStageInstruction { string getResultId() { this.shouldGenerateDumpStrings() and result = - this.getResultPrefix() + this.getAST().getLocation().getStartLine() + "_" + this.getLineRank() + this.getResultPrefix() + this.getAst().getLocation().getStartLine() + "_" + this.getLineRank() } /** @@ -208,12 +208,15 @@ class Instruction extends Construction::TStageInstruction { /** * Gets the AST that caused this instruction to be generated. */ - final Language::AST getAST() { result = Construction::getInstructionAST(this) } + final Language::AST getAst() { result = Construction::getInstructionAst(this) } + + /** DEPRECATED: Alias for getAst */ + deprecated Language::AST getAST() { result = this.getAst() } /** * Gets the location of the source code for this instruction. */ - final Language::Location getLocation() { result = this.getAST().getLocation() } + final Language::Location getLocation() { result = this.getAst().getLocation() } /** * Gets the `Expr` whose result is computed by this instruction, if any. The `Expr` may be a @@ -459,7 +462,10 @@ class VariableInstruction extends Instruction { /** * Gets the AST variable that this instruction's IR variable refers to, if one exists. */ - final Language::Variable getASTVariable() { result = var.(IRUserVariable).getVariable() } + final Language::Variable getAstVariable() { result = var.(IRUserVariable).getVariable() } + + /** DEPRECATED: Alias for getAstVariable */ + deprecated Language::Variable getASTVariable() { result = this.getAstVariable() } } /** diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll index 89b82657c3b..c1e997d5844 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll @@ -18,7 +18,7 @@ private import internal.OperandInternal * of `TOperand` that are used in this stage. */ private class TStageOperand = - TRegisterOperand or TNonSSAMemoryOperand or TPhiOperand or TChiOperand; + TRegisterOperand or TNonSsaMemoryOperand or TPhiOperand or TChiOperand; /** * A known location. Testing `loc instanceof KnownLocation` will account for non existing locations, as @@ -38,7 +38,7 @@ class Operand extends TStageOperand { // Ensure that the operand does not refer to instructions from earlier stages that are unreachable here exists(Instruction use, Instruction def | this = registerOperand(use, _, def)) or - exists(Instruction use | this = nonSSAMemoryOperand(use, _)) + exists(Instruction use | this = nonSsaMemoryOperand(use, _)) or exists(Instruction use, Instruction def, IRBlock predecessorBlock | this = phiOperand(use, def, predecessorBlock, _) or @@ -209,7 +209,7 @@ class Operand extends TStageOperand { class MemoryOperand extends Operand { cached MemoryOperand() { - this instanceof TNonSSAMemoryOperand or + this instanceof TNonSsaMemoryOperand or this instanceof TPhiOperand or this instanceof TChiOperand } @@ -249,7 +249,7 @@ class NonPhiOperand extends Operand { NonPhiOperand() { this = registerOperand(useInstr, tag, _) or - this = nonSSAMemoryOperand(useInstr, tag) or + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } @@ -299,7 +299,7 @@ class NonPhiMemoryOperand extends NonPhiOperand, MemoryOperand, TNonPhiMemoryOpe cached NonPhiMemoryOperand() { - this = nonSSAMemoryOperand(useInstr, tag) + this = nonSsaMemoryOperand(useInstr, tag) or this = chiOperand(useInstr, tag) } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll index 796fb792366..ca3c378cd7e 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll @@ -34,7 +34,7 @@ class ValueNumber extends TValueNumber { final Instruction getAnInstruction() { this = valueNumber(result) } /** - * Gets one of the instructions that was assigned this value number. The chosen instuction is + * Gets one of the instructions that was assigned this value number. The chosen instruction is * deterministic but arbitrary. Intended for use only in debugging. */ final Instruction getExampleInstruction() { diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll index 2467d961892..2dc735f49df 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -99,13 +99,19 @@ private predicate filteredNumberableInstruction(Instruction instr) { // count rather than strictcount to handle missing AST elements // separate instanceof and inline casts to avoid failed casts with a count of 0 instr instanceof VariableAddressInstruction and - count(instr.(VariableAddressInstruction).getIRVariable().getAST()) != 1 + count(instr.(VariableAddressInstruction).getIRVariable().getAst()) != 1 or instr instanceof ConstantInstruction and count(instr.getResultIRType()) != 1 or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // 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. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAst()) = ast } private predicate initializeParameterValueNumber( @@ -126,15 +131,14 @@ private predicate initializeParameterValueNumber( // 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. - instr.getIRVariable().getAST() = var + instr.getIRVariable().getAst() = var } private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/OperandInternal.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/OperandInternal.qll index 88a4e6f8551..e522599abe9 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/OperandInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/OperandInternal.qll @@ -1,2 +1,2 @@ private import experimental.ir.implementation.internal.TOperand -import UnaliasedSSAOperands +import UnaliasedSsaOperands diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/PrintSSA.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/PrintSSA.qll index 72bb239c153..c7487872512 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/PrintSSA.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/PrintSSA.qll @@ -2,7 +2,7 @@ private import SSAConstructionInternal private import OldIR private import Alias private import SSAConstruction -private import DebugSSA +private import DebugSsa bindingset[offset] private string getKeySuffixForOffset(int offset) { diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll index 5686bb439eb..1c75529be00 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll @@ -1,2 +1,2 @@ private import SSAConstruction as SSA -import SSA::SSAConsistency +import SSA::SsaConsistency diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll index 5092e921cb3..303a9683011 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll @@ -112,7 +112,7 @@ private module Cached { exists(Alias::getResultMemoryLocation(oldInstruction)) or // This result was already modeled by a previous iteration of SSA. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) } cached @@ -182,7 +182,7 @@ private module Cached { * unreachable, this predicate will recurse through any degenerate `Phi` instructions to find the * true definition. */ - private Instruction getNewDefinitionFromOldSSA(OldIR::MemoryOperand oldOperand, Overlap overlap) { + private Instruction getNewDefinitionFromOldSsa(OldIR::MemoryOperand oldOperand, Overlap overlap) { exists(Overlap originalOverlap | originalOverlap = oldOperand.getDefinitionOverlap() and ( @@ -191,7 +191,7 @@ private module Cached { or exists(OldIR::PhiInputOperand phiOperand, Overlap phiOperandOverlap | phiOperand = getDegeneratePhiOperand(oldOperand.getAnyDef()) and - result = getNewDefinitionFromOldSSA(phiOperand, phiOperandOverlap) and + result = getNewDefinitionFromOldSsa(phiOperand, phiOperandOverlap) and overlap = combineOverlap(pragma[only_bind_out](phiOperandOverlap), pragma[only_bind_out](originalOverlap)) @@ -233,7 +233,7 @@ private module Cached { ) or exists(OldIR::NonPhiMemoryOperand oldOperand | - result = getNewDefinitionFromOldSSA(oldOperand, overlap) and + result = getNewDefinitionFromOldSsa(oldOperand, overlap) and oldOperand.getUse() = instruction and tag = oldOperand.getOperandTag() ) @@ -307,13 +307,13 @@ private module Cached { * Gets the new definition instruction for the operand of `instr` that flows from the block * `newPredecessorBlock`, based on that operand's definition in the old IR. */ - private Instruction getNewPhiOperandDefinitionFromOldSSA( + private Instruction getNewPhiOperandDefinitionFromOldSsa( Instruction instr, IRBlock newPredecessorBlock, Overlap overlap ) { exists(OldIR::PhiInstruction oldPhi, OldIR::PhiInputOperand oldOperand | oldPhi = getOldInstruction(instr) and oldOperand = oldPhi.getInputOperand(getOldBlock(newPredecessorBlock)) and - result = getNewDefinitionFromOldSSA(oldOperand, overlap) + result = getNewDefinitionFromOldSsa(oldOperand, overlap) ) } @@ -333,7 +333,7 @@ private module Cached { overlap = Alias::getOverlap(actualDefLocation, useLocation) ) or - result = getNewPhiOperandDefinitionFromOldSSA(instr, newPredecessorBlock, overlap) + result = getNewPhiOperandDefinitionFromOldSsa(instr, newPredecessorBlock, overlap) } cached @@ -412,17 +412,17 @@ private module Cached { } cached - Language::AST getInstructionAST(Instruction instr) { - result = getOldInstruction(instr).getAST() + Language::AST getInstructionAst(Instruction instr) { + result = getOldInstruction(instr).getAst() or exists(RawIR::Instruction blockStartInstr | instr = phiInstruction(blockStartInstr, _) and - result = blockStartInstr.getAST() + result = blockStartInstr.getAst() ) or exists(RawIR::Instruction primaryInstr | instr = chiInstruction(primaryInstr) and - result = primaryInstr.getAST() + result = primaryInstr.getAst() ) or exists(IRFunctionBase irFunc | @@ -430,6 +430,12 @@ private module Cached { ) } + /** DEPRECATED: Alias for getInstructionAst */ + cached + deprecated Language::AST getInstructionAST(Instruction instr) { + result = getInstructionAst(instr) + } + cached Language::LanguageType getInstructionResultType(Instruction instr) { result = instr.(RawIR::Instruction).getResultLanguageType() @@ -975,35 +981,41 @@ module DefUse { } } -predicate canReuseSSAForMemoryResult(Instruction instruction) { +predicate canReuseSsaForMemoryResult(Instruction instruction) { exists(OldInstruction oldInstruction | oldInstruction = getOldInstruction(instruction) and ( // The previous iteration said it was reusable, so we should mark it as reusable as well. - Alias::canReuseSSAForOldResult(oldInstruction) + Alias::canReuseSsaForOldResult(oldInstruction) or // The current alias analysis says it is reusable. - Alias::getResultMemoryLocation(oldInstruction).canReuseSSA() + Alias::getResultMemoryLocation(oldInstruction).canReuseSsa() ) ) or exists(Alias::MemoryLocation defLocation | // This is a `Phi` for a reusable location, so the result of the `Phi` is reusable as well. instruction = phiInstruction(_, defLocation) and - defLocation.canReuseSSA() + defLocation.canReuseSsa() ) // We don't support reusing SSA for any location that could create a `Chi` instruction. } +/** DEPRECATED: Alias for canReuseSsaForMemoryResult */ +deprecated predicate canReuseSSAForMemoryResult = canReuseSsaForMemoryResult/1; + /** - * Expose some of the internal predicates to PrintSSA.qll. We do this by publically importing those modules in the + * Expose some of the internal predicates to PrintSSA.qll. We do this by publicly importing those modules in the * `DebugSSA` module, which is then imported by PrintSSA. */ -module DebugSSA { +module DebugSsa { import PhiInsertion import DefUse } +/** DEPRECATED: Alias for DebugSsa */ +deprecated module DebugSSA = DebugSsa; + import CachedForDebugging cached @@ -1038,7 +1050,7 @@ private module CachedForDebugging { private OldIR::IRTempVariable getOldTempVariable(IRTempVariable var) { result.getEnclosingFunction() = var.getEnclosingFunction() and - result.getAST() = var.getAST() and + result.getAst() = var.getAst() and result.getTag() = var.getTag() } @@ -1061,7 +1073,7 @@ private module CachedForDebugging { int maxValue() { result = 2147483647 } } -module SSAConsistency { +module SsaConsistency { /** * Holds if a `MemoryOperand` has more than one `MemoryLocation` assigned by alias analysis. */ @@ -1114,6 +1126,9 @@ module SSAConsistency { } } +/** DEPRECATED: Alias for SsaConsistency */ +deprecated module SSAConsistency = SsaConsistency; + /** * Provides the portion of the parameterized IR interface that is used to construct the SSA stages * of the IR. The raw stage of the IR does not expose these predicates. diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll index 8f726b81345..005ea53b018 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll @@ -3,7 +3,7 @@ import experimental.ir.implementation.raw.internal.reachability.ReachableBlock a import experimental.ir.implementation.raw.internal.reachability.Dominance as Dominance import experimental.ir.implementation.unaliased_ssa.IR as NewIR import experimental.ir.implementation.raw.internal.IRConstruction as RawStage -import experimental.ir.implementation.internal.TInstruction::UnaliasedSSAInstructions as SSAInstructions +import experimental.ir.implementation.internal.TInstruction::UnaliasedSsaInstructions as SSAInstructions import experimental.ir.internal.IRCSharpLanguage as Language import SimpleSSA as Alias -import experimental.ir.implementation.internal.TOperand::UnaliasedSSAOperands as SSAOperands +import experimental.ir.implementation.internal.TOperand::UnaliasedSsaOperands as SSAOperands diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll index f3e02c9f6a8..ec2e6f5ef34 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll @@ -41,11 +41,14 @@ predicate isVariableModeled(Allocation var) { * subsequent iterations will recompute SSA for any variable that we assumed did not escape, but * actually would have escaped if we had used a sound escape analysis. */ -predicate canReuseSSAForVariable(IRAutomaticVariable var) { +predicate canReuseSsaForVariable(IRAutomaticVariable var) { isVariableModeled(var) and not allocationEscapes(var) } +/** DEPRECATED: Alias for canReuseSsaForVariable */ +deprecated predicate canReuseSSAForVariable = canReuseSsaForVariable/1; + private newtype TMemoryLocation = MkMemoryLocation(Allocation var) { isVariableModeled(var) } private MemoryLocation getMemoryLocation(Allocation var) { result.getAllocation() = var } @@ -69,10 +72,16 @@ class MemoryLocation extends TMemoryLocation { final string getUniqueId() { result = var.getUniqueId() } - final predicate canReuseSSA() { canReuseSSAForVariable(var) } + final predicate canReuseSsa() { canReuseSsaForVariable(var) } + + /** DEPRECATED: Alias for canReuseSsa */ + deprecated predicate canReuseSSA() { canReuseSsa() } } -predicate canReuseSSAForOldResult(Instruction instr) { none() } +predicate canReuseSsaForOldResult(Instruction instr) { none() } + +/** DEPRECATED: Alias for canReuseSsaForOldResult */ +deprecated predicate canReuseSSAForOldResult = canReuseSsaForOldResult/1; /** * Represents a set of `MemoryLocation`s that cannot overlap with diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll index cee8fa1543b..aaa4cc7bd53 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll @@ -1,7 +1,5 @@ private import ReachableBlock as Reachability -private module ReachabilityGraph = Reachability::Graph; - module Graph { import Reachability::Graph diff --git a/csharp/ql/src/experimental/ir/internal/CSharpType.qll b/csharp/ql/src/experimental/ir/internal/CSharpType.qll index 02dee3edff9..d87596ae643 100644 --- a/csharp/ql/src/experimental/ir/internal/CSharpType.qll +++ b/csharp/ql/src/experimental/ir/internal/CSharpType.qll @@ -88,15 +88,6 @@ predicate hasAddressType(int byteSize) { */ predicate hasFunctionAddressType(int byteSize) { byteSize = getTypeSize(any(NullType type)) } -private int getBaseClassSize(ValueOrRefType type) { - if exists(type.getBaseClass()) then result = getContentSize(type.getBaseClass()) else result = 0 -} - -private int getContentSize(ValueOrRefType type) { - result = - getBaseClassSize(type) + sum(Field field | not field.isStatic() | getTypeSize(field.getType())) -} - private predicate isOpaqueType(ValueOrRefType type) { type instanceof Struct or type instanceof NullableType or diff --git a/csharp/ql/src/experimental/ir/internal/IRGuards.qll b/csharp/ql/src/experimental/ir/internal/IRGuards.qll index a87788eb9a0..91e2208c6f7 100644 --- a/csharp/ql/src/experimental/ir/internal/IRGuards.qll +++ b/csharp/ql/src/experimental/ir/internal/IRGuards.qll @@ -28,8 +28,8 @@ class GuardCondition extends Expr { or // the IR short-circuits if(!x) // don't produce a guard condition for `y = !x` and other non-short-circuited cases - not exists(Instruction inst | this = inst.getAST()) and - exists(IRGuardCondition ir | this.(LogicalNotExpr).getOperand() = ir.getAST()) + not exists(Instruction inst | this = inst.getAst()) and + exists(IRGuardCondition ir | this.(LogicalNotExpr).getOperand() = ir.getAst()) } /** @@ -172,8 +172,8 @@ private class GuardConditionFromBinaryLogicalOperator extends GuardCondition { */ private class GuardConditionFromShortCircuitNot extends GuardCondition, LogicalNotExpr { GuardConditionFromShortCircuitNot() { - not exists(Instruction inst | this = inst.getAST()) and - exists(IRGuardCondition ir | this.getOperand() = ir.getAST()) + not exists(Instruction inst | this = inst.getAst()) and + exists(IRGuardCondition ir | this.getOperand() = ir.getAst()) } override predicate controls(BasicBlock controlled, boolean testIsTrue) { @@ -267,7 +267,7 @@ private class GuardConditionFromIR extends GuardCondition { private predicate controlsBlock1(BasicBlock controlled, boolean testIsTrue) { exists(IRBlock irb | forex(IRGuardCondition inst | inst = ir | inst.controls(irb, testIsTrue)) and - irb.getAnInstruction().getAST().(ControlFlowElement).getAControlFlowNode().getBasicBlock() = + irb.getAnInstruction().getAst().(ControlFlowElement).getAControlFlowNode().getBasicBlock() = controlled and not isUnreachedBlock(irb) ) diff --git a/csharp/ql/src/experimental/ir/rangeanalysis/RangeAnalysis.qll b/csharp/ql/src/experimental/ir/rangeanalysis/RangeAnalysis.qll index ccc6b9ea30e..ebdca09414f 100644 --- a/csharp/ql/src/experimental/ir/rangeanalysis/RangeAnalysis.qll +++ b/csharp/ql/src/experimental/ir/rangeanalysis/RangeAnalysis.qll @@ -623,7 +623,7 @@ private predicate boundedInstruction( ) or exists(PropertyAccess pa | - i.(CallInstruction).getAST() = pa and + i.(CallInstruction).getAst() = pa and pa.getProperty().getName() = "Length" and b instanceof ZeroBound and delta = origdelta and diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index fe6c62e31b6..873dbdff8c6 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.0.10-dev +version: 0.1.3-dev groups: - csharp - queries diff --git a/csharp/ql/src/utils/model-generator/CaptureDiscardedSummaryModels.ql b/csharp/ql/src/utils/model-generator/CaptureDiscardedSummaryModels.ql new file mode 100644 index 00000000000..d4dd1f72de3 --- /dev/null +++ b/csharp/ql/src/utils/model-generator/CaptureDiscardedSummaryModels.ql @@ -0,0 +1,13 @@ +/** + * @name Capture discarded summary models. + * @description Finds summary models that are discarded as handwritten counterparts exist. + * @id csharp/utils/model-generator/discarded-summary-models + */ + +private import semmle.code.csharp.dataflow.ExternalFlow +private import internal.CaptureModels +private import internal.CaptureFlow + +from TargetApi api, string flow +where flow = captureFlow(api) and hasSummary(api, false) +select flow order by flow diff --git a/csharp/ql/src/utils/model-generator/CaptureSinkModels.ql b/csharp/ql/src/utils/model-generator/CaptureSinkModels.ql new file mode 100644 index 00000000000..8aab373447e --- /dev/null +++ b/csharp/ql/src/utils/model-generator/CaptureSinkModels.ql @@ -0,0 +1,13 @@ +/** + * @name Capture sink models. + * @description Finds public methods that act as sinks as they flow into a a known sink. + * @kind diagnostic + * @id cs/utils/model-generator/sink-models + * @tags model-generator + */ + +private import internal.CaptureModels + +from TargetApi api, string sink +where sink = captureSink(api) +select sink order by sink diff --git a/csharp/ql/src/utils/model-generator/CaptureSourceModels.ql b/csharp/ql/src/utils/model-generator/CaptureSourceModels.ql new file mode 100644 index 00000000000..f60682b2b6d --- /dev/null +++ b/csharp/ql/src/utils/model-generator/CaptureSourceModels.ql @@ -0,0 +1,13 @@ +/** + * @name Capture source models. + * @description Finds APIs that act as sources as they expose already known sources. + * @kind diagnostic + * @id cs/utils/model-generator/source-models + * @tags model-generator + */ + +private import internal.CaptureModels + +from TargetApi api, string source +where source = captureSource(api) +select source order by source diff --git a/csharp/ql/src/utils/model-generator/CaptureSummaryModels.ql b/csharp/ql/src/utils/model-generator/CaptureSummaryModels.ql new file mode 100644 index 00000000000..ffc98bd2250 --- /dev/null +++ b/csharp/ql/src/utils/model-generator/CaptureSummaryModels.ql @@ -0,0 +1,15 @@ +/** + * @name Capture summary models. + * @description Finds applicable summary models to be used by other queries. + * @kind diagnostic + * @id cs/utils/model-generator/summary-models + * @tags model-generator + */ + +private import semmle.code.csharp.dataflow.ExternalFlow +private import internal.CaptureModels +private import internal.CaptureFlow + +from TargetApi api, string flow +where flow = captureFlow(api) and not hasSummary(api, false) +select flow order by flow diff --git a/csharp/ql/src/utils/model-generator/GenerateFlowModel.py b/csharp/ql/src/utils/model-generator/GenerateFlowModel.py new file mode 100755 index 00000000000..7b89b4829f3 --- /dev/null +++ b/csharp/ql/src/utils/model-generator/GenerateFlowModel.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 + +import sys +import os.path +import subprocess + +# Add Model as Data script directory to sys.path. +gitroot = subprocess.check_output(["git", "rev-parse", "--show-toplevel"]).decode("utf-8").strip() +madpath = os.path.join(gitroot, "misc/scripts/models-as-data/") # Note that this has been changed. +sys.path.append(madpath) + +import generate_flow_model as model + +language = "csharp" +model.Generator.make(language).run() \ No newline at end of file diff --git a/csharp/ql/src/utils/model-generator/internal/CaptureFlow.qll b/csharp/ql/src/utils/model-generator/internal/CaptureFlow.qll new file mode 100644 index 00000000000..249615f900c --- /dev/null +++ b/csharp/ql/src/utils/model-generator/internal/CaptureFlow.qll @@ -0,0 +1,81 @@ +private import CaptureModels + +/** + * Capture fluent APIs that return `this`. + * Example of a fluent API: + * ```csharp + * public class BasicFlow { + * public BasicFlow ReturnThis(object input) + * { + * // some side effect + * return this; + * } + * ``` + * Captured Model: + * ```Summaries;BasicFlow;false;ReturnThis;(System.Object);Argument[Qualifier];ReturnValue;value``` + * Capture APIs that transfer taint from an input parameter to an output return + * value or parameter. + * Allows a sequence of read steps followed by a sequence of store steps. + * + * Examples: + * + * ```csharp + * public class BasicFlow { + * private string tainted; + * + * public String ReturnField() + * { + * return tainted; + * } + * + * public void AssignFieldToArray(object[] target) + * { + * target[0] = tainted; + * } + * } + * ``` + * Captured Models: + * ``` + * Summaries;BasicFlow;false;ReturnField;();Argument[Qualifier];ReturnValue;taint | + * Summaries;BasicFlow;false;AssignFieldToArray;(System.Object[]);Argument[Qualifier];Argument[0].Element;taint + * ``` + * + * ```csharp + * public class BasicFlow { + * private string tainted; + * + * public void SetField(string s) + * { + * tainted = s; + * } + * } + * ``` + * Captured Model: + * ```Summaries;BasicFlow;false;SetField;(System.String);Argument[0];Argument[Qualifier];taint``` + * + * ```csharp + * public class BasicFlow { + * public void ReturnSubstring(string s) + * { + * return s.Substring(0, 1); + * } + * } + * ``` + * Captured Model: + * ```Summaries;BasicFlow;false;ReturnSubstring;(System.String);Argument[0];ReturnValue;taint``` + * + * ```csharp + * public class BasicFlow { + * public void AssignToArray(int data, int[] target) + * { + * target[0] = data; + * } + * } + * ``` + * Captured Model: + * ```Summaries;BasicFlow;false;AssignToArray;(System.Int32,System.Int32[]);Argument[0];Argument[1].Element;taint``` + */ +string captureFlow(TargetApi api) { + result = captureQualifierFlow(api) or + result = captureThroughFlow(api) +} diff --git a/csharp/ql/src/utils/model-generator/internal/CaptureModels.qll b/csharp/ql/src/utils/model-generator/internal/CaptureModels.qll new file mode 100644 index 00000000000..84af7b57938 --- /dev/null +++ b/csharp/ql/src/utils/model-generator/internal/CaptureModels.qll @@ -0,0 +1,260 @@ +/** + * Provides classes and predicates related to capturing summary, source, + * and sink models of the Standard or a 3rd party library. + */ + +private import CaptureModelsSpecific + +class TargetApi = TargetApiSpecific; + +/** + * Holds if data can flow from `node1` to `node2` either via a read or a write of an intermediate field `f`. + */ +private predicate isRelevantTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + exists(DataFlow::Content f | + DataFlowPrivate::readStep(node1, f, node2) and + if f instanceof DataFlow::FieldContent + then isRelevantType(f.(DataFlow::FieldContent).getField().getType()) + else + if f instanceof DataFlow::SyntheticFieldContent + then isRelevantType(f.(DataFlow::SyntheticFieldContent).getField().getType()) + else any() + ) + or + exists(DataFlow::Content f | DataFlowPrivate::storeStep(node1, f, node2) | + DataFlowPrivate::containerContent(f) + ) +} + +/** + * Holds if content `c` is either a field or synthetic field of a relevant type + * or a container like content. + */ +private predicate isRelevantContent(DataFlow::Content c) { + isRelevantType(c.(DataFlow::FieldContent).getField().getType()) or + isRelevantType(c.(DataFlow::SyntheticFieldContent).getField().getType()) or + DataFlowPrivate::containerContent(c) +} + +/** + * Gets the summary model for `api` with `input`, `output` and `kind`. + */ +bindingset[input, output, kind] +private string asSummaryModel(TargetApi api, string input, string output, string kind) { + result = + asPartialModel(api) + input + ";" // + + output + ";" // + + "generated:" + kind +} + +/** + * Gets the value summary model for `api` with `input` and `output`. + */ +bindingset[input, output] +private string asValueModel(TargetApi api, string input, string output) { + result = asSummaryModel(api, input, output, "value") +} + +/** + * Gets the taint summary model for `api` with `input` and `output`. + */ +bindingset[input, output] +private string asTaintModel(TargetApi api, string input, string output) { + result = asSummaryModel(api, input, output, "taint") +} + +/** + * Gets the sink model for `api` with `input` and `kind`. + */ +bindingset[input, kind] +private string asSinkModel(TargetApi api, string input, string kind) { + result = asPartialModel(api) + input + ";" + "generated:" + kind +} + +/** + * Gets the source model for `api` with `output` and `kind`. + */ +bindingset[output, kind] +private string asSourceModel(TargetApi api, string output, string kind) { + result = asPartialModel(api) + output + ";" + "generated:" + kind +} + +/** + * Gets the summary model of `api`, if it follows the `fluent` programming pattern (returns `this`). + */ +string captureQualifierFlow(TargetApi api) { + exists(DataFlowImplCommon::ReturnNodeExt ret | + api = returnNodeEnclosingCallable(ret) and + isOwnInstanceAccessNode(ret) + ) and + result = asValueModel(api, qualifierString(), "ReturnValue") +} + +private int accessPathLimit() { result = 2 } + +/** + * A FlowState representing a tainted read. + */ +private class TaintRead extends DataFlow::FlowState { + private int step; + + TaintRead() { this = "TaintRead(" + step + ")" and step in [0 .. accessPathLimit()] } + + /** + * Gets the flow state step number. + */ + int getStep() { result = step } +} + +/** + * A FlowState representing a tainted write. + */ +private class TaintStore extends DataFlow::FlowState { + private int step; + + TaintStore() { this = "TaintStore(" + step + ")" and step in [1 .. accessPathLimit()] } + + /** + * Gets the flow state step number. + */ + int getStep() { result = step } +} + +/** + * A TaintTracking Configuration used for tracking flow through APIs. + * The sources are the parameters of an API and the sinks are the return values (excluding `this`) and parameters. + * + * This can be used to generate Flow summaries for APIs from parameter to return. + */ +private class ThroughFlowConfig extends TaintTracking::Configuration { + ThroughFlowConfig() { this = "ThroughFlowConfig" } + + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + source instanceof DataFlow::ParameterNode and + source.getEnclosingCallable() instanceof TargetApi and + state.(TaintRead).getStep() = 0 + } + + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + sink instanceof DataFlowImplCommon::ReturnNodeExt and + not isOwnInstanceAccessNode(sink) and + not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and + (state instanceof TaintRead or state instanceof TaintStore) + } + + override predicate isAdditionalTaintStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + exists(DataFlowImplCommon::TypedContent tc | + DataFlowImplCommon::store(node1, tc, node2, _) and + isRelevantContent(tc.getContent()) and + ( + state1 instanceof TaintRead and state2.(TaintStore).getStep() = 1 + or + state1.(TaintStore).getStep() + 1 = state2.(TaintStore).getStep() + ) + ) + or + exists(DataFlow::Content c | + DataFlowPrivate::readStep(node1, c, node2) and + isRelevantContent(c) and + state1.(TaintRead).getStep() + 1 = state2.(TaintRead).getStep() + ) + } + + override predicate isSanitizer(DataFlow::Node n) { + exists(Type t | t = n.getType() and not isRelevantType(t)) + } + + override DataFlow::FlowFeature getAFeature() { + result instanceof DataFlow::FeatureEqualSourceSinkCallContext + } +} + +/** + * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. + */ +string captureThroughFlow(TargetApi api) { + exists( + ThroughFlowConfig config, DataFlow::ParameterNode p, + DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output + | + config.hasFlow(p, returnNodeExt) and + returnNodeExt.getEnclosingCallable() = api and + input = parameterNodeAsInput(p) and + output = returnNodeAsOutput(returnNodeExt) and + input != output and + result = asTaintModel(api, input, output) + ) +} + +/** + * A TaintTracking Configuration used for tracking flow through APIs. + * The sources are the already known existing sources and the sinks are the API return nodes. + * + * This can be used to generate Source summaries for an API, if the API expose an already known source + * via its return (then the API itself becomes a source). + */ +private class FromSourceConfiguration extends TaintTracking::Configuration { + FromSourceConfiguration() { this = "FromSourceConfiguration" } + + override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } + + override predicate isSink(DataFlow::Node sink) { + exists(TargetApi c | + sink instanceof DataFlowImplCommon::ReturnNodeExt and + sink.getEnclosingCallable() = c + ) + } + + override DataFlow::FlowFeature getAFeature() { + result instanceof DataFlow::FeatureHasSinkCallContext + } + + override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + isRelevantTaintStep(node1, node2) + } +} + +/** + * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. + */ +string captureSource(TargetApi api) { + exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | + config.hasFlow(source, sink) and + ExternalFlow::sourceNode(source, kind) and + api = sink.getEnclosingCallable() and + result = asSourceModel(api, returnNodeAsOutput(sink), kind) + ) +} + +/** + * A TaintTracking Configuration used for tracking flow through APIs. + * The sources are the parameters of the API and the fields of the enclosing type. + * + * This can be used to generate Sink summaries for APIs, if the API propgates a parameter (or enclosing type field) + * into an existing known sink (then the API itself becomes a sink). + */ +private class PropagateToSinkConfiguration extends PropagateToSinkConfigurationSpecific { + PropagateToSinkConfiguration() { this = "parameters or fields flowing into sinks" } + + override predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } + + override DataFlow::FlowFeature getAFeature() { + result instanceof DataFlow::FeatureHasSourceCallContext + } +} + +/** + * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. + */ +string captureSink(TargetApi api) { + exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind | + config.hasFlow(src, sink) and + ExternalFlow::sinkNode(sink, kind) and + api = src.getEnclosingCallable() and + isRelevantSinkKind(kind) and + result = asSinkModel(api, asInputArgument(src), kind) + ) +} diff --git a/csharp/ql/src/utils/model-generator/internal/CaptureModelsSpecific.qll b/csharp/ql/src/utils/model-generator/internal/CaptureModelsSpecific.qll new file mode 100644 index 00000000000..f33f18abee2 --- /dev/null +++ b/csharp/ql/src/utils/model-generator/internal/CaptureModelsSpecific.qll @@ -0,0 +1,166 @@ +/** + * Provides predicates related to capturing summary models of the Standard or a 3rd party library. + */ + +private import csharp as CS +private import dotnet +private import semmle.code.csharp.commons.Util as Util +private import semmle.code.csharp.commons.Collections as Collections +private import semmle.code.csharp.dataflow.internal.DataFlowDispatch +private import semmle.code.csharp.frameworks.System as System +private import semmle.code.csharp.frameworks.system.linq.Expressions +import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow +import semmle.code.csharp.dataflow.internal.DataFlowImplCommon as DataFlowImplCommon +import semmle.code.csharp.dataflow.internal.DataFlowPrivate as DataFlowPrivate + +module DataFlow = CS::DataFlow; + +module TaintTracking = CS::TaintTracking; + +class Type = CS::Type; + +/** + * Holds if any of the parameters of `api` are `System.Func<>`. + */ +private predicate isHigherOrder(CS::Callable api) { + exists(Type t | t = api.getAParameter().getType().getUnboundDeclaration() | + t instanceof SystemLinqExpressions::DelegateExtType + ) +} + +/** + * Holds if it is relevant to generate models for `api`. + */ +private predicate isRelevantForModels(CS::Callable api) { + [api.(CS::Modifiable), api.(CS::Accessor).getDeclaration()].isEffectivelyPublic() and + api.getDeclaringType().getNamespace().getQualifiedName() != "" and + not api instanceof CS::ConversionOperator and + not api instanceof Util::MainMethod and + not isHigherOrder(api) +} + +/** + * A class of callables that are relevant generating summary, source and sinks models for. + * + * In the Standard library and 3rd party libraries it the callables that can be called + * from outside the library itself. + */ +class TargetApiSpecific extends DotNet::Callable { + TargetApiSpecific() { + this.fromSource() and + this.isUnboundDeclaration() and + isRelevantForModels(this) + } +} + +predicate asPartialModel = DataFlowPrivate::Csv::asPartialModel/1; + +/** + * Holds for type `t` for fields that are relevant as an intermediate + * read or write step in the data flow analysis. + * That is, flow through any data-flow node that does not have a relevant type + * will be excluded. + */ +predicate isRelevantType(CS::Type t) { + not t instanceof CS::SimpleType and + not t instanceof CS::Enum +} + +/** + * Gets the CSV string representation of the qualifier. + */ +string qualifierString() { result = "Argument[Qualifier]" } + +private string parameterAccess(CS::Parameter p) { + if Collections::isCollectionType(p.getType()) + then result = "Argument[" + p.getPosition() + "].Element" + else result = "Argument[" + p.getPosition() + "]" +} + +/** + * Gets the CSV string representation of the parameter node `p`. + */ +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = qualifierString() and p instanceof DataFlowPrivate::InstanceParameterNode +} + +pragma[nomagic] +private CS::Parameter getParameter(DataFlowImplCommon::ReturnNodeExt node, ParameterPosition pos) { + result = node.getEnclosingCallable().getParameter(pos.getPosition()) +} + +/** + * Gets the CSV string represention of the the return node `node`. + */ +string returnNodeAsOutput(DataFlowImplCommon::ReturnNodeExt node) { + if node.getKind() instanceof DataFlowImplCommon::ValueReturnKind + then result = "ReturnValue" + else + exists(ParameterPosition pos | + pos = node.getKind().(DataFlowImplCommon::ParamUpdateReturnKind).getPosition() + | + result = parameterAccess(getParameter(node, pos)) + or + pos.isThisParameter() and + result = qualifierString() + ) +} + +/** + * Gets the enclosing callable of `ret`. + */ +CS::Callable returnNodeEnclosingCallable(DataFlowImplCommon::ReturnNodeExt ret) { + result = DataFlowImplCommon::getNodeEnclosingCallable(ret).getUnderlyingCallable() +} + +/** + * Holds if `node` is an own instance access. + */ +predicate isOwnInstanceAccessNode(DataFlowPrivate::ReturnNode node) { + node.asExpr() instanceof CS::ThisAccess +} + +private predicate isRelevantMemberAccess(DataFlow::Node node) { + exists(CS::MemberAccess access | access = node.asExpr() | + access.hasThisQualifier() and + access.getTarget().isEffectivelyPublic() and + ( + access instanceof CS::FieldAccess + or + access.getTarget().(CS::Property).getSetter().isPublic() + ) + ) +} + +/** + * Language specific parts of the `PropagateToSinkConfiguration`. + */ +class PropagateToSinkConfigurationSpecific extends CS::TaintTracking::Configuration { + PropagateToSinkConfigurationSpecific() { this = "parameters or fields flowing into sinks" } + + override predicate isSource(DataFlow::Node source) { + (isRelevantMemberAccess(source) or source instanceof DataFlow::ParameterNode) and + isRelevantForModels(source.getEnclosingCallable()) + } +} + +/** + * Gets the CSV input string representation of `source`. + */ +string asInputArgument(DataFlow::Node source) { + exists(int pos | + pos = source.(DataFlow::ParameterNode).getParameter().getPosition() and + result = "Argument[" + pos + "]" + ) + or + source.asExpr() instanceof DataFlowPrivate::FieldOrPropertyAccess and + result = qualifierString() +} + +/** + * Holds if `kind` is a relevant sink kind for creating sink models. + */ +bindingset[kind] +predicate isRelevantSinkKind(string kind) { any() } diff --git a/csharp/ql/test/TestUtilities/InlineExpectationsTest.qll b/csharp/ql/test/TestUtilities/InlineExpectationsTest.qll index 7d605a491ee..3891fcf13a1 100644 --- a/csharp/ql/test/TestUtilities/InlineExpectationsTest.qll +++ b/csharp/ql/test/TestUtilities/InlineExpectationsTest.qll @@ -124,7 +124,9 @@ abstract class InlineExpectationsTest extends string { abstract predicate hasActualResult(Location location, string element, string tag, string value); /** - * Like `hasActualResult`, but returns results that do not require a matching annotation. + * Holds if there is an optional result on the specified location. + * + * This is similar to `hasActualResult`, but returns results that do not require a matching annotation. * A failure will still arise if there is an annotation that does not match any results, but not vice versa. * Override this predicate to specify optional results. */ @@ -179,7 +181,7 @@ private string expectationCommentPattern() { result = "\\s*\\$((?:[^/]|/[^/])*)( /** * The possible columns in an expectation comment. The `TDefaultColumn` branch represents the first * column in a comment. This column is not precedeeded by a name. `TNamedColumn(name)` represents a - * column containing expected results preceeded by the string `name:`. + * column containing expected results preceded by the string `name:`. */ private newtype TColumn = TDefaultColumn() or diff --git a/csharp/ql/test/TestUtilities/InlineExpectationsTestPrivate.qll b/csharp/ql/test/TestUtilities/InlineExpectationsTestPrivate.qll index 3df85cc0fd6..4f3c3f6bef5 100644 --- a/csharp/ql/test/TestUtilities/InlineExpectationsTestPrivate.qll +++ b/csharp/ql/test/TestUtilities/InlineExpectationsTestPrivate.qll @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.Comments /** * A class representing line comments in C# used by the InlineExpectations core code diff --git a/csharp/ql/test/experimental/ir/offbyone/OffByOneRA.ql b/csharp/ql/test/experimental/ir/offbyone/OffByOneRA.ql index 7518386e6d2..38386d47568 100644 --- a/csharp/ql/test/experimental/ir/offbyone/OffByOneRA.ql +++ b/csharp/ql/test/experimental/ir/offbyone/OffByOneRA.ql @@ -10,17 +10,17 @@ predicate boundedArrayAccess(ElementAccess aa, int k) { exists(Instruction index, Instruction usage, Bound b, int delta | ( // indexer access - usage.(CallInstruction).getAST() = aa + usage.(CallInstruction).getAst() = aa or // array access - usage.(PointerAddInstruction).getAST() = aa + usage.(PointerAddInstruction).getAst() = aa ) and usage.getAnOperand().getDef() = index and boundedInstruction(index, b, delta, true, _) | exists(PropertyAccess pa | k = delta and - b.getInstruction().getAST() = pa and + b.getInstruction().getAst() = pa and pa.getProperty().getName() = "Length" and pa.(QualifiableExpr).getQualifier().(VariableAccess).getTarget() = aa.getQualifier().(VariableAccess).getTarget() diff --git a/csharp/ql/test/library-tests/cil/attributes/attribute.expected b/csharp/ql/test/library-tests/cil/attributes/attribute.expected index 8c2a9d89762..caf7df91c55 100644 --- a/csharp/ql/test/library-tests/cil/attributes/attribute.expected +++ b/csharp/ql/test/library-tests/cil/attributes/attribute.expected @@ -2342,7 +2342,7 @@ attrArgPositional | System.Number.BigInteger | [ObsoleteAttribute(...)] | 0 | Types with embedded references are not supported in this version of your compiler. | | System.Number.BigInteger | [ObsoleteAttribute(...)] | 1 | True | | System.Number.BigInteger._blocks | [FixedBufferAttribute(...)] | 0 | System.UInt32 | -| System.Number.BigInteger._blocks | [FixedBufferAttribute(...)] | 1 | 115 | +| System.Number.BigInteger._blocks | [FixedBufferAttribute(...)] | 1 | 116 | | System.Number.DiyFp | [ObsoleteAttribute(...)] | 0 | Types with embedded references are not supported in this version of your compiler. | | System.Number.DiyFp | [ObsoleteAttribute(...)] | 1 | True | | System.Number.NumberBuffer | [ObsoleteAttribute(...)] | 0 | Types with embedded references are not supported in this version of your compiler. | diff --git a/csharp/ql/test/library-tests/cil/dataflow/TaintTracking.ql b/csharp/ql/test/library-tests/cil/dataflow/TaintTracking.ql index 5879865ac85..4a6397d2bbf 100644 --- a/csharp/ql/test/library-tests/cil/dataflow/TaintTracking.ql +++ b/csharp/ql/test/library-tests/cil/dataflow/TaintTracking.ql @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.TaintTracking // Test that all the copies of the taint tracking library can be imported // simultaneously without errors. import semmle.code.csharp.dataflow.TaintTracking2 diff --git a/csharp/ql/test/library-tests/cil/typeAnnotations/typeAnnotations.expected b/csharp/ql/test/library-tests/cil/typeAnnotations/typeAnnotations.expected index e7a5bdfbdaa..26409836c35 100644 --- a/csharp/ql/test/library-tests/cil/typeAnnotations/typeAnnotations.expected +++ b/csharp/ql/test/library-tests/cil/typeAnnotations/typeAnnotations.expected @@ -1178,6 +1178,7 @@ | Parameter 1 of System.Runtime.InteropServices.MemoryMarshal.TryRead | parameter | 32 | | Parameter 1 of System.Runtime.InteropServices.MemoryMarshal.TryWrite | parameter | 32 | | Parameter 1 of System.Runtime.InteropServices.MemoryMarshal.Write | parameter | 32 | +| Parameter 1 of System.Runtime.InteropServices.NFloat.TryParse | parameter | 32 | | Parameter 1 of System.Runtime.InteropServices.NativeLibrary.TryLoad | parameter | 32 | | Parameter 1 of System.Runtime.InteropServices.ObjectiveC.ObjectiveCMarshal.CreateReferenceTrackingHandle | parameter | 32 | | Parameter 1 of System.Runtime.InteropServices.ObjectiveC.ObjectiveCMarshal.UnhandledExceptionPropagationHandler.EndInvoke | parameter | 32 | @@ -1673,6 +1674,7 @@ | Parameter 2 of System.Runtime.InteropServices.Marshal.QueryInterface | parameter | 32 | | Parameter 2 of System.Runtime.InteropServices.MemoryMarshal.TryGetMemoryManager | parameter | 32 | | Parameter 2 of System.Runtime.InteropServices.MemoryMarshal.TryGetString | parameter | 32 | +| Parameter 2 of System.Runtime.InteropServices.NFloat.TryFormat | parameter | 32 | | Parameter 2 of System.Runtime.InteropServices.NativeLibrary.TryGetExport | parameter | 32 | | Parameter 2 of System.Runtime.Serialization.SerializationInfo.GetElement | parameter | 32 | | Parameter 2 of System.Runtime.Serialization.SerializationInfo.GetElementNoThrow | parameter | 32 | @@ -1971,6 +1973,7 @@ | Parameter 3 of System.Runtime.InteropServices.ComWrappers.TryGetOrCreateComInterfaceForObjectInternal | parameter | 32 | | Parameter 3 of System.Runtime.InteropServices.MemoryMarshal.TryGetMemoryManager | parameter | 32 | | Parameter 3 of System.Runtime.InteropServices.MemoryMarshal.TryGetString | parameter | 32 | +| Parameter 3 of System.Runtime.InteropServices.NFloat.TryParse | parameter | 32 | | Parameter 3 of System.Runtime.InteropServices.NativeLibrary.TryLoad | parameter | 32 | | Parameter 3 of System.Runtime.InteropServices.ObjectiveC.ObjectiveCMarshal.UnhandledExceptionPropagationHandler.BeginInvoke | parameter | 32 | | Parameter 3 of System.Runtime.InteropServices.ObjectiveC.ObjectiveCMarshal.UnhandledExceptionPropagationHandler.Invoke | parameter | 32 | diff --git a/csharp/ql/test/library-tests/comments/Comments.ql b/csharp/ql/test/library-tests/comments/Comments.ql index 5ef8d3d75b9..84957e2252f 100644 --- a/csharp/ql/test/library-tests/comments/Comments.ql +++ b/csharp/ql/test/library-tests/comments/Comments.ql @@ -21,6 +21,8 @@ query predicate multilineComment( commentLine(c, l, numLines, text, rawText) } -query predicate xmlComment(CommentBlock c, XmlComment l, int numLines, string text, string rawText) { +query predicate xmlComment( + CommentBlock c, XmlCommentLine l, int numLines, string text, string rawText +) { commentLine(c, l, numLines, text, rawText) } diff --git a/csharp/ql/test/library-tests/commons/Disposal/DisposedVariables.ql b/csharp/ql/test/library-tests/commons/Disposal/DisposedVariables.ql index 5a6abf3fb11..4013d84e21b 100644 --- a/csharp/ql/test/library-tests/commons/Disposal/DisposedVariables.ql +++ b/csharp/ql/test/library-tests/commons/Disposal/DisposedVariables.ql @@ -1,5 +1,4 @@ import semmle.code.csharp.commons.Disposal -import csharp from Variable v where diff --git a/csharp/ql/test/library-tests/conversion/operator/Operator.expected b/csharp/ql/test/library-tests/conversion/operator/Operator.expected index bc9b3aae5b4..fb03f013375 100644 --- a/csharp/ql/test/library-tests/conversion/operator/Operator.expected +++ b/csharp/ql/test/library-tests/conversion/operator/Operator.expected @@ -3,18 +3,27 @@ | ArraySegment | ReadOnlySpan<> | | ArraySegment | Span<> | | Byte | Decimal | +| Byte | NFloat | | Char | Decimal | +| Char | NFloat | | Char | StandardFormat | | DateTime | DateTimeOffset | | Int16 | Decimal | +| Int16 | NFloat | | Int32 | C | | Int32 | Decimal | | Int32 | Index | | Int32 | MetadataToken | +| Int32 | NFloat | | Int64 | Decimal | +| Int64 | NFloat | +| IntPtr | NFloat | | Memory<> | ReadOnlyMemory | | MetadataToken | Int32 | +| NFloat | Double | | SByte | Decimal | +| SByte | NFloat | +| Single | NFloat | | Span<> | ReadOnlySpan | | String | ReadOnlySpan | | T | Nullable<> | @@ -24,5 +33,9 @@ | T[] | ReadOnlySpan<> | | T[] | Span<> | | UInt16 | Decimal | +| UInt16 | NFloat | | UInt32 | Decimal | +| UInt32 | NFloat | | UInt64 | Decimal | +| UInt64 | NFloat | +| UIntPtr | NFloat | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index cbc107fe973..d5302764f5c 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -206,7 +206,9 @@ | CSharp7.cs:283:13:283:62 | SSA def(list) | CSharp7.cs:285:39:285:42 | access to local variable list | | CSharp7.cs:283:20:283:62 | call to method Select,(Int32,String)> | CSharp7.cs:283:13:283:62 | SSA def(list) | | CSharp7.cs:283:32:283:35 | item | CSharp7.cs:283:41:283:44 | access to parameter item | +| CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:41:283:48 | access to property Key | | CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:51:283:54 | access to parameter item | +| CSharp7.cs:283:51:283:54 | access to parameter item | CSharp7.cs:283:51:283:60 | access to property Value | | CSharp7.cs:285:39:285:42 | access to local variable list | CSharp7.cs:287:36:287:39 | access to local variable list | | CSharp7.cs:287:36:287:39 | access to local variable list | CSharp7.cs:289:32:289:35 | access to local variable list | | CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.ql b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.ql index ed293efc2ba..897085a92e2 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.ql +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.ql @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.TaintTracking from DataFlow::Node pred, DataFlow::Node succ where diff --git a/csharp/ql/test/library-tests/csharp7/TaintReaches.ql b/csharp/ql/test/library-tests/csharp7/TaintReaches.ql index ff8664cae3a..77846ff6ab4 100644 --- a/csharp/ql/test/library-tests/csharp7/TaintReaches.ql +++ b/csharp/ql/test/library-tests/csharp7/TaintReaches.ql @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.TaintTracking from StringLiteral l, DataFlow::Node n where TaintTracking::localTaintStep+(DataFlow::exprNode(l), n) diff --git a/csharp/ql/test/library-tests/csharp9/global/GlobalStmt.cs b/csharp/ql/test/library-tests/csharp9-standalone/GlobalStmt.cs similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/GlobalStmt.cs rename to csharp/ql/test/library-tests/csharp9-standalone/GlobalStmt.cs diff --git a/csharp/ql/test/library-tests/csharp9/global/globalStmt.expected b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/globalStmt.expected rename to csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected diff --git a/csharp/ql/test/library-tests/csharp9/global/globalStmt.ql b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.ql similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/globalStmt.ql rename to csharp/ql/test/library-tests/csharp9-standalone/globalStmt.ql diff --git a/csharp/ql/test/library-tests/csharp9/global/options b/csharp/ql/test/library-tests/csharp9-standalone/options similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/options rename to csharp/ql/test/library-tests/csharp9-standalone/options diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql index ae3ba6178f0..6d89c413730 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql @@ -17,7 +17,7 @@ class Conf extends DataFlow::Configuration { ) } - override int fieldFlowBranchLimit() { result = 10 } + override int fieldFlowBranchLimit() { result = 100 } } from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf diff --git a/csharp/ql/test/library-tests/dataflow/content/ContentFlow.cs b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.cs new file mode 100644 index 00000000000..e3db962193f --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.cs @@ -0,0 +1,51 @@ +using System; + +public class ContentFlow +{ + public class A + { + public A FieldA; + public B FieldB; + } + public class B + { + public A FieldA; + public B FieldB; + } + + public void M(A a, B b) + { + var a1 = new A(); + Sink(Through(a1.FieldA.FieldB)); + + a.FieldA.FieldB = new B(); + Sink(Through(a)); + + var a2 = new A(); + b.FieldB.FieldA = a2.FieldB.FieldA; + Sink(Through(b)); + + Sink(Through(Out())); + + In(new A().FieldA.FieldB); + } + + public static void Sink(T t) { } + + public T Through(T t) + { + Sink(t); + return t; + } + + public void In(T t) + { + Sink(t); + } + + public B Out() + { + var a = new A(); + return a.FieldA.FieldB; + } +} diff --git a/csharp/ql/test/library-tests/dataflow/content/ContentFlow.expected b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.expected new file mode 100644 index 00000000000..ce55c9da51f --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.expected @@ -0,0 +1,9 @@ +| ContentFlow.cs:18:18:18:24 | object creation of type A | field FieldB.field FieldA. | ContentFlow.cs:19:14:19:38 | call to method Through | | true | +| ContentFlow.cs:18:18:18:24 | object creation of type A | field FieldB.field FieldA. | ContentFlow.cs:37:14:37:14 | access to parameter t | | true | +| ContentFlow.cs:21:27:21:33 | object creation of type B | | ContentFlow.cs:22:14:22:23 | call to method Through | field FieldA.field FieldB. | true | +| ContentFlow.cs:21:27:21:33 | object creation of type B | | ContentFlow.cs:37:14:37:14 | access to parameter t | field FieldA.field FieldB. | true | +| ContentFlow.cs:24:18:24:24 | object creation of type A | field FieldA.field FieldB. | ContentFlow.cs:26:14:26:23 | call to method Through | field FieldB.field FieldA. | true | +| ContentFlow.cs:24:18:24:24 | object creation of type A | field FieldA.field FieldB. | ContentFlow.cs:37:14:37:14 | access to parameter t | field FieldB.field FieldA. | true | +| ContentFlow.cs:30:12:30:18 | object creation of type A | field FieldB.field FieldA. | ContentFlow.cs:43:14:43:14 | access to parameter t | | true | +| ContentFlow.cs:48:17:48:23 | object creation of type A | field FieldB.field FieldA. | ContentFlow.cs:28:14:28:27 | call to method Through | | true | +| ContentFlow.cs:48:17:48:23 | object creation of type A | field FieldB.field FieldA. | ContentFlow.cs:37:14:37:14 | access to parameter t | | true | diff --git a/csharp/ql/test/library-tests/dataflow/content/ContentFlow.ql b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.ql new file mode 100644 index 00000000000..07a510a62ce --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/content/ContentFlow.ql @@ -0,0 +1,23 @@ +import csharp +import semmle.code.csharp.dataflow.internal.ContentDataFlow + +class Conf extends ContentDataFlow::Configuration { + Conf() { this = "ContentFlowConf" } + + override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } + + override predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc | + mc.getTarget().hasUndecoratedName("Sink") and + mc.getAnArgument() = sink.asExpr() + ) + } + + override int accessPathLimit() { result = 2 } +} + +from + Conf conf, ContentDataFlow::Node source, ContentDataFlow::AccessPath sourceAp, + ContentDataFlow::Node sink, ContentDataFlow::AccessPath sinkAp, boolean preservesValue +where conf.hasFlow(source, sourceAp, sink, sinkAp, preservesValue) +select source, sourceAp, sink, sinkAp, preservesValue diff --git a/csharp/ql/test/library-tests/dataflow/delegates/DelegateFlow.expected b/csharp/ql/test/library-tests/dataflow/delegates/DelegateFlow.expected index f9fbbbab6be..723086b649f 100644 --- a/csharp/ql/test/library-tests/dataflow/delegates/DelegateFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/delegates/DelegateFlow.expected @@ -51,5 +51,5 @@ viableLambda | DelegateFlow.cs:125:9:125:25 | function pointer call | file://:0:0:0:0 | (none) | DelegateFlow.cs:7:17:7:18 | M2 | | DelegateFlow.cs:132:9:132:11 | delegate call | DelegateFlow.cs:135:25:135:40 | call to method M19 | DelegateFlow.cs:135:29:135:36 | (...) => ... | | DelegateFlow.cs:132:9:132:11 | delegate call | file://:0:0:0:0 | (none) | DelegateFlow.cs:131:17:131:24 | (...) => ... | -| file://:0:0:0:0 | [summary] call to valueFactory in Lazy | DelegateFlow.cs:105:9:105:24 | object creation of type Lazy | DelegateFlow.cs:104:23:104:30 | (...) => ... | -| file://:0:0:0:0 | [summary] call to valueFactory in Lazy | DelegateFlow.cs:107:9:107:24 | object creation of type Lazy | DelegateFlow.cs:106:13:106:20 | (...) => ... | +| file://:0:0:0:0 | [summary] call to parameter position 0 of Lazy in Lazy | DelegateFlow.cs:105:9:105:24 | object creation of type Lazy | DelegateFlow.cs:104:23:104:30 | (...) => ... | +| file://:0:0:0:0 | [summary] call to parameter position 0 of Lazy in Lazy | DelegateFlow.cs:107:9:107:24 | object creation of type Lazy | DelegateFlow.cs:106:13:106:20 | (...) => ... | diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.cs b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.cs index 92f1a042ce0..26b6936543f 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.cs +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.cs @@ -169,4 +169,39 @@ namespace My.Qltest set { throw null; } } } + + public class G + { + void M1() + { + var o = new object(); + Sink(GeneratedFlow(o)); + } + + void M2() + { + var o1 = new object(); + Sink(GeneratedFlowArgs(o1, null)); + + var o2 = new object(); + Sink(GeneratedFlowArgs(null, o2)); + } + + void M3() + { + var o1 = new object(); + Sink(MixedFlowArgs(o1, null)); + + var o2 = new object(); + Sink(MixedFlowArgs(null, o2)); + } + + object GeneratedFlow(object o) => throw null; + + object GeneratedFlowArgs(object o1, object o2) => throw null; + + object MixedFlowArgs(object o1, object o2) => throw null; + + static void Sink(object o) { } + } } \ No newline at end of file diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected index 82fa4fd190b..cf22a1ee1b1 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected @@ -56,6 +56,14 @@ edges | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f [field MyField] : Object | ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f [field MyField] : Object | | ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | +| ExternalFlow.cs:177:21:177:32 | object creation of type Object : Object | ExternalFlow.cs:178:32:178:32 | access to local variable o : Object | +| ExternalFlow.cs:178:32:178:32 | access to local variable o : Object | ExternalFlow.cs:178:18:178:33 | call to method GeneratedFlow | +| ExternalFlow.cs:183:22:183:33 | object creation of type Object : Object | ExternalFlow.cs:184:36:184:37 | access to local variable o1 : Object | +| ExternalFlow.cs:184:36:184:37 | access to local variable o1 : Object | ExternalFlow.cs:184:18:184:44 | call to method GeneratedFlowArgs | +| ExternalFlow.cs:186:22:186:33 | object creation of type Object : Object | ExternalFlow.cs:187:42:187:43 | access to local variable o2 : Object | +| ExternalFlow.cs:187:42:187:43 | access to local variable o2 : Object | ExternalFlow.cs:187:18:187:44 | call to method GeneratedFlowArgs | +| ExternalFlow.cs:195:22:195:33 | object creation of type Object : Object | ExternalFlow.cs:196:38:196:39 | access to local variable o2 : Object | +| ExternalFlow.cs:196:38:196:39 | access to local variable o2 : Object | ExternalFlow.cs:196:18:196:40 | call to method MixedFlowArgs | nodes | ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:10:18:10:33 | call to method StepArgRes | semmle.label | call to method StepArgRes | @@ -130,6 +138,18 @@ nodes | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:112:18:112:18 | access to local variable f [field MyField] : Object | semmle.label | access to local variable f [field MyField] : Object | | ExternalFlow.cs:112:18:112:25 | access to property MyProp | semmle.label | access to property MyProp | +| ExternalFlow.cs:177:21:177:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:178:18:178:33 | call to method GeneratedFlow | semmle.label | call to method GeneratedFlow | +| ExternalFlow.cs:178:32:178:32 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| ExternalFlow.cs:183:22:183:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:184:18:184:44 | call to method GeneratedFlowArgs | semmle.label | call to method GeneratedFlowArgs | +| ExternalFlow.cs:184:36:184:37 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| ExternalFlow.cs:186:22:186:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:187:18:187:44 | call to method GeneratedFlowArgs | semmle.label | call to method GeneratedFlowArgs | +| ExternalFlow.cs:187:42:187:43 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| ExternalFlow.cs:195:22:195:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:196:18:196:40 | call to method MixedFlowArgs | semmle.label | call to method MixedFlowArgs | +| ExternalFlow.cs:196:38:196:39 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | subpaths invalidModelRow #select @@ -152,3 +172,7 @@ invalidModelRow | ExternalFlow.cs:102:22:102:22 | access to parameter d | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:102:22:102:22 | access to parameter d | $@ | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | object creation of type Object : Object | | ExternalFlow.cs:104:18:104:25 | access to field Field | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:104:18:104:25 | access to field Field | $@ | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | object creation of type Object : Object | | ExternalFlow.cs:112:18:112:25 | access to property MyProp | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | $@ | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | object creation of type Object : Object | +| ExternalFlow.cs:178:18:178:33 | call to method GeneratedFlow | ExternalFlow.cs:177:21:177:32 | object creation of type Object : Object | ExternalFlow.cs:178:18:178:33 | call to method GeneratedFlow | $@ | ExternalFlow.cs:177:21:177:32 | object creation of type Object : Object | object creation of type Object : Object | +| ExternalFlow.cs:184:18:184:44 | call to method GeneratedFlowArgs | ExternalFlow.cs:183:22:183:33 | object creation of type Object : Object | ExternalFlow.cs:184:18:184:44 | call to method GeneratedFlowArgs | $@ | ExternalFlow.cs:183:22:183:33 | object creation of type Object : Object | object creation of type Object : Object | +| ExternalFlow.cs:187:18:187:44 | call to method GeneratedFlowArgs | ExternalFlow.cs:186:22:186:33 | object creation of type Object : Object | ExternalFlow.cs:187:18:187:44 | call to method GeneratedFlowArgs | $@ | ExternalFlow.cs:186:22:186:33 | object creation of type Object : Object | object creation of type Object : Object | +| ExternalFlow.cs:196:18:196:40 | call to method MixedFlowArgs | ExternalFlow.cs:195:22:195:33 | object creation of type Object : Object | ExternalFlow.cs:196:18:196:40 | call to method MixedFlowArgs | $@ | ExternalFlow.cs:195:22:195:33 | object creation of type Object : Object | object creation of type Object : Object | diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql index 56605f49d11..9c570d3534b 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql @@ -30,7 +30,12 @@ class SummaryModelTest extends SummaryModelCsv { "My.Qltest;D;false;Map<,>;(S[],System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", "My.Qltest;D;false;Parse;(System.String,System.Int32);;Argument[0];Argument[1];taint", "My.Qltest;E;true;get_MyProp;();;Argument[Qualifier].Field[My.Qltest.E.MyField];ReturnValue;value", - "My.Qltest;E;true;set_MyProp;(System.Object);;Argument[0];Argument[Qualifier].Field[My.Qltest.E.MyField];value" + "My.Qltest;E;true;set_MyProp;(System.Object);;Argument[0];Argument[Qualifier].Field[My.Qltest.E.MyField];value", + "My.Qltest;G;false;GeneratedFlow;(System.Object);;Argument[0];ReturnValue;generated:value", + "My.Qltest;G;false;GeneratedFlowArgs;(System.Object,System.Object);;Argument[0];ReturnValue;generated:value", + "My.Qltest;G;false;GeneratedFlowArgs;(System.Object,System.Object);;Argument[1];ReturnValue;generated:value", + "My.Qltest;G;false;MixedFlowArgs;(System.Object,System.Object);;Argument[0];ReturnValue;generated:value", + "My.Qltest;G;false;MixedFlowArgs;(System.Object,System.Object);;Argument[1];ReturnValue;value", ] } } @@ -48,6 +53,14 @@ class Conf extends TaintTracking::Configuration { } } +/** + * Simulate that methods with summaries are not included in the source code. + * This is relevant for dataflow analysis using summaries tagged as generated. + */ +private class MyMethod extends Method { + override predicate fromSource() { none() } +} + from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf where conf.hasFlowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/csharp/ql/test/library-tests/dataflow/external-models/steps.expected b/csharp/ql/test/library-tests/dataflow/external-models/steps.expected index 6d8ed631741..af0e9cdfe4b 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/csharp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -8,8 +8,6 @@ summaryThroughStep | Steps.cs:22:13:22:16 | this access | Steps.cs:22:13:22:30 | call to method StepQualRes | false | | Steps.cs:23:13:23:25 | this access | Steps.cs:23:13:23:25 | call to method StepQualRes | false | | Steps.cs:26:13:26:31 | this access | Steps.cs:26:25:26:30 | [post] access to local variable argOut | false | -| Steps.cs:30:13:30:16 | this access | Steps.cs:30:13:30:16 | [post] this access | true | -| Steps.cs:34:13:34:16 | this access | Steps.cs:34:13:34:16 | [post] this access | true | | Steps.cs:41:29:41:29 | 0 | Steps.cs:41:13:41:30 | call to method StepGeneric | true | | Steps.cs:42:30:42:34 | false | Steps.cs:42:13:42:35 | call to method StepGeneric2 | true | | Steps.cs:44:36:44:43 | "string" | Steps.cs:44:13:44:44 | call to method StepOverride | true | @@ -22,5 +20,5 @@ summarySetterStep | Steps.cs:34:37:34:37 | 0 | Steps.cs:34:13:34:16 | [post] this access | Steps.cs:63:13:63:20 | property Property | | Steps.cs:38:36:38:36 | 0 | Steps.cs:38:13:38:16 | [post] this access | file://:0:0:0:0 | element | clearsContent -| Steps.cs:61:14:61:28 | StepFieldSetter | Steps.cs:57:13:57:17 | field Field | this | -| Steps.cs:67:14:67:31 | StepPropertySetter | Steps.cs:63:13:63:20 | property Property | this | +| Steps.cs:61:14:61:28 | StepFieldSetter | file://:0:0:0:0 | element | this | +| Steps.cs:67:14:67:31 | StepPropertySetter | file://:0:0:0:0 | element | this | diff --git a/csharp/ql/test/library-tests/dataflow/external-models/steps.ql b/csharp/ql/test/library-tests/dataflow/external-models/steps.ql index ecd7ac5c6fd..a73c0c8c7c0 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/steps.ql +++ b/csharp/ql/test/library-tests/dataflow/external-models/steps.ql @@ -2,10 +2,11 @@ import csharp import DataFlow import semmle.code.csharp.dataflow.ExternalFlow import semmle.code.csharp.dataflow.FlowSummary +import semmle.code.csharp.dataflow.internal.DataFlowDispatch as DataFlowDispatch import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import CsvValidation -class SummaryModelTest extends SummaryModelCsv { +private class SummaryModelTest extends SummaryModelCsv { override predicate row(string row) { row = [ @@ -28,18 +29,38 @@ class SummaryModelTest extends SummaryModelCsv { } } +private class SummarizedCallableClear extends SummarizedCallable { + SummarizedCallableClear() { + this.getName() = ["StepPropertySetter", "StepFieldSetter"] and + this.getFile().getBaseName() = "Steps.cs" + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::ContentSet content) { + pos.isThisParameter() and + content instanceof DataFlow::ElementContent + } +} + query predicate summaryThroughStep( DataFlow::Node node1, DataFlow::Node node2, boolean preservesValue ) { - FlowSummaryImpl::Private::Steps::summaryThroughStep(node1, node2, preservesValue) + FlowSummaryImpl::Private::Steps::summaryThroughStepValue(node1, node2, + any(DataFlowDispatch::DataFlowSummarizedCallable sc)) and + preservesValue = true + or + FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(node1, node2, + any(DataFlowDispatch::DataFlowSummarizedCallable sc)) and + preservesValue = false } query predicate summaryGetterStep(DataFlow::Node arg, DataFlow::Node out, Content c) { - FlowSummaryImpl::Private::Steps::summaryGetterStep(arg, c, out) + FlowSummaryImpl::Private::Steps::summaryGetterStep(arg, c, out, + any(DataFlowDispatch::DataFlowSummarizedCallable sc)) } query predicate summarySetterStep(DataFlow::Node arg, DataFlow::Node out, Content c) { - FlowSummaryImpl::Private::Steps::summarySetterStep(arg, c, out) + FlowSummaryImpl::Private::Steps::summarySetterStep(arg, c, out, + any(DataFlowDispatch::DataFlowSummarizedCallable sc)) } query predicate clearsContent(SummarizedCallable c, DataFlow::Content k, ParameterPosition pos) { diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected index 670905624bf..b888f827633 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected @@ -1,5 +1,33 @@ +| Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Convert;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Type);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Collections.Generic.IEnumerable,System.Type,System.Collections.Generic.IEnumerable);;Argument[4].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;IsEvent;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;Extensions;false;Append;(System.Text.StringBuilder,Microsoft.Extensions.Primitives.StringSegment);;Argument[0];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer+Enumerator;false;Enumerator;(Microsoft.Extensions.Primitives.StringTokenizer);;Argument[0].Element;Argument[Qualifier];generated:taint | | Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(System.String,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringValues+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[Qualifier];ReturnValue;taint | @@ -69,6 +97,10 @@ | Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | Microsoft.VisualBasic;Collection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| Microsoft.Win32.SafeHandles;SafeFileHandle;false;SafeFileHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafePipeHandle;false;SafePipeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafeProcessHandle;false;SafeProcessHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafeWaitHandle;false;SafeWaitHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | | Newtonsoft.Json.Linq;JArray;false;Add;(Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element;value | | Newtonsoft.Json.Linq;JArray;false;CopyTo;(Newtonsoft.Json.Linq.JToken[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | Newtonsoft.Json.Linq;JArray;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | @@ -190,16 +222,103 @@ | Newtonsoft.Json;JsonSerializer;false;Serialize;(Newtonsoft.Json.JsonWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | +| System.Buffers;ArrayBufferWriter<>;false;GetMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ArrayBufferWriter<>;false;get_WrittenMemory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;BuffersExtensions;false;PositionOf<>;(System.Buffers.ReadOnlySequence,T);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;true;get_Memory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>+Enumerator;false;Enumerator;(System.Buffers.ReadOnlySequence<>);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[2];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64);;Argument[Qualifier];ReturnValue;generated:value | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;TryGet;(System.SequencePosition,System.ReadOnlyMemory,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;SequenceReader;(System.Buffers.ReadOnlySequence);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadToAny;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;get_UnreadSequence;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Tool;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;Write;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;get_InnerWriter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentBag<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -217,6 +336,8 @@ | System.Collections.Concurrent;ConcurrentDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetOrAdd;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | @@ -229,23 +350,51 @@ | System.Collections.Concurrent;ConcurrentQueue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentStack<>;false;ConcurrentStack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;OrderablePartitioner<>;false;GetDynamicPartitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable,System.Collections.Concurrent.EnumerablePartitionerOptions);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IList,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(TSource[],System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;Remove<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;Argument[2];generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[1];Argument[0].Element;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[2];Argument[0].Element;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Entry;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+KeyCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current];value | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+ValueCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current];value | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -263,22 +412,31 @@ | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Int32,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | | System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current];value | | System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;Dictionary<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;Dictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;Dictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;Dictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;HashSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;HashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;HashSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.HashSet<>+Enumerator.Current];value | | System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;HashSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;HashSet<>;false;HashSet;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;HashSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;HashSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -293,9 +451,39 @@ | System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair<,>;false;Deconstruct;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;KeyValuePair<,>;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair<,>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;LinkedList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;LinkedList<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;LinkedList<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;LinkedList<>;false;Find;(T);;Argument[Qualifier].Element;ReturnValue;value | @@ -303,11 +491,25 @@ | System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.LinkedList<>+Enumerator.Current];value | | System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;Remove;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_Last;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Generic;LinkedListNode<>;false;LinkedListNode;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Next;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Previous;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;set_Value;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;List<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;List<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Generic;List<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;List<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Generic;List<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | @@ -322,29 +524,42 @@ | System.Collections.Generic;List<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;List;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Generic;List<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Generic;List<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;List<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;Queue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Queue<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Queue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;Enqueue;(T);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Queue<>+Enumerator.Current];value | | System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Generic;Queue<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Queue<>;false;Queue;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Queue<>;false;TryDequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current];value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current];value | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -364,6 +579,7 @@ | System.Collections.Generic;SortedDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;SortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -380,13 +596,17 @@ | System.Collections.Generic;SortedList<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;TryGetValue;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedList<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedList<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;SortedList<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Generic;SortedList<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;SortedList<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -398,7 +618,19 @@ | System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedSet<>+Enumerator.Current];value | | System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Generic;SortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Generic;Stack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Stack<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | @@ -406,10 +638,30 @@ | System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Generic;Stack<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;Stack<>;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Stack<>;false;Push;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;Stack<>;false;Stack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Stack<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(System.Collections.Immutable.ImmutableArray,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[3];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;Argument[Qualifier].Element;value | @@ -422,21 +674,72 @@ | System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;MoveToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;As<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AsMemory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;CastArray<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;CastUp<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;OfType<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;GetValueOrDefault<,>;(System.Collections.Immutable.IImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Immutable.ImmutableDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -450,14 +753,22 @@ | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -471,29 +782,79 @@ | System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableHashSet;false;Create<>;(System.Collections.Generic.IEqualityComparer,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Immutable.ImmutableHashSet+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;WithComparer;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableHashSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableInterlocked;false;GetOrAdd<,>;(System.Collections.Immutable.ImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Remove<>;(System.Collections.Immutable.IImmutableList,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;RemoveRange<>;(System.Collections.Immutable.IImmutableList,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];Argument[0].Element;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Immutable.ImmutableList+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | @@ -510,13 +871,21 @@ | System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint | | System.Collections.Immutable;ImmutableList<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | @@ -531,14 +900,64 @@ | System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableQueue;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;Dequeue<>;(System.Collections.Immutable.IImmutableQueue,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableQueue<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Immutable.ImmutableSortedDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -552,14 +971,24 @@ | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -573,49 +1002,136 @@ | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T[]);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateBuilder<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Immutable.ImmutableSortedSet+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | | System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;WithComparer;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableStack;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;Pop<>;(System.Collections.Immutable.IImmutableStack,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableStack<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Pop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;Collection<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;Collection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;Collection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.ObjectModel;Collection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;Collection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | | System.Collections.ObjectModel;Collection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;Collection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;Collection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;KeyedCollection;(System.Collections.Generic.IEqualityComparer,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;TryGetValue;(TKey,TItem);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -624,7 +1140,10 @@ | System.Collections.ObjectModel;ReadOnlyCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;ReadOnlyCollection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | @@ -632,11 +1151,13 @@ | System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -648,11 +1169,14 @@ | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -662,8 +1186,10 @@ | System.Collections.Specialized;HybridDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Specialized;HybridDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;HybridDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Specialized;HybridDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;HybridDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;HybridDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -674,25 +1200,71 @@ | System.Collections.Specialized;ListDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Specialized;ListDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;ListDictionary;false;ListDictionary;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Specialized;ListDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Specialized;ListDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;ListDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;ListDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | | System.Collections.Specialized;NameObjectCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;NameObjectCollectionBase;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;NameObjectCollectionBase;true;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;NameValueCollection;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;NameValueCollection;false;Get;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Int32,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;Set;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;set_Item;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_NewItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_OldItems;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Specialized;OrderedDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Specialized;OrderedDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;OrderedDictionary;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Int32,System.Collections.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Specialized;OrderedDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;OrderedDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;OrderedDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -708,12 +1280,20 @@ | System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Specialized;StringCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Specialized;StringDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;StringDictionary;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;StringDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;StringEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;ArrayList;false;Adapter;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;ArrayList;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;ArrayList;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections;ArrayList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;CopyTo;(System.Array);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections;ArrayList;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Argument[0].Element;ReturnValue.Element;value | @@ -722,34 +1302,67 @@ | System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;ReadOnly;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;ArrayList;false;ReadOnly;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];ReturnValue.Element;value | | System.Collections;ArrayList;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;SetRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections;ArrayList;false;Synchronized;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;ArrayList;false;Synchronized;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;ArrayList;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;ArrayList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;ArrayList;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;BitArray;false;And;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;BitArray;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;BitArray;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;BitArray;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;BitArray;false;LeftShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Not;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Or;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;RightShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Xor;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;CollectionBase;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Collections;CollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;CollectionBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections;CollectionBase;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections;CollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;CollectionBase;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;CollectionBase;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;CollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;CollectionBase;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;Comparer;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | | System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;DictionaryBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;DictionaryBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;DictionaryBase;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;false;get_InnerHashtable;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;DictionaryBase;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections;DictionaryBase;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;DictionaryBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;DictionaryBase;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;DictionaryBase;true;OnGet;(System.Object,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;Deconstruct;(System.Object,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;set_Key;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;Hashtable;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;Hashtable;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;Hashtable;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;Hashtable;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -762,11 +1375,21 @@ | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[3];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Synchronized;(System.Collections.Hashtable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Hashtable;false;get_EqualityComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;Hashtable;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections;Hashtable;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;Hashtable;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;Hashtable;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;Hashtable;false;get_comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;get_hcp;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;set_comparer;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;set_hcp;(System.Collections.IHashCodeProvider);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -782,9 +1405,16 @@ | System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections;Queue;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;Queue;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;Queue;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Queue;false;Enqueue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;Queue;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections;Queue;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Queue;false;Queue;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections;Queue;false;Synchronized;(System.Collections.Queue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Queue;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;ReadOnlyCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;ReadOnlyCollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;ReadOnlyCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;ReadOnlyCollectionBase;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -792,13 +1422,20 @@ | System.Collections;SortedList;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;SortedList;false;GetByIndex;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections;SortedList;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;SortedList;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;SortedList;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;SortedList;false;GetKeyList;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;SortedList;false;GetValueList;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;SortedList;false;SetByIndex;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections;SortedList;false;SortedList;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;Synchronized;(System.Collections.SortedList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;SortedList;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections;SortedList;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;SortedList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;SortedList;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -807,44 +1444,255 @@ | System.Collections;Stack;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections;Stack;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | | System.Collections;Stack;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Stack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;Stack;false;Stack;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections;Stack;false;Synchronized;(System.Collections.Stack);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Stack;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Stack;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;set_Schema;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;AssociatedMetadataTypeTypeDescriptionProvider;(System.Type,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;GetTypeDescriptor;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;GetTypeDescriptor;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;GetTypeDescriptor;(System.Type,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;CompareAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateField;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetOrder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_GroupName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Prompt;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ShortName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_GroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Prompt;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ShortName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayText;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayTextResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayTextResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;set_Extensions;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;FilterUIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;MaxLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;MetadataTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;get_MetadataClassType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;MinLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;RangeAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;RegularExpressionAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;StringLengthAttribute;false;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;UIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessage;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;true;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationException;false;ValidationException;(System.ComponentModel.DataAnnotations.ValidationResult,System.ComponentModel.DataAnnotations.ValidationAttribute,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationException;false;get_ValidationResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Append;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;DesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;RootDesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel.Design;DesignerCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerCollection;false;DesignerCollection;(System.Collections.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel.Design;DesignerCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;DesignerVerbCollection;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Remove;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;MenuCommand;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;ServiceContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;ServiceContainer;false;ServiceContainer;(System.IServiceProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ArrayConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;AsyncOperation;false;get_SynchronizationContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;AttributeCollection;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;AttributeCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | | System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;AttributeCollection;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System.ComponentModel;BindingList<>;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.ComponentModel;CategoryAttribute;false;CategoryAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;CategoryAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CharConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;CollectionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ComponentCollection;false;ComponentCollection;(System.ComponentModel.IComponent[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;ComponentCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ComponentCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String,System.Globalization.CultureInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Container;false;Add;(System.ComponentModel.IComponent,System.String);;Argument[1];Argument[0];generated:taint | +| System.ComponentModel;Container;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;Container;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Container;false;get_Components;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ContainerFilterService;true;FilterComponents;(System.ComponentModel.ComponentCollection);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;false;CustomTypeDescriptor;(System.ComponentModel.ICustomTypeDescriptor);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DecimalConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;DesignerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EditorAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EnumConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel;EventDescriptorCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel;EventDescriptorCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;EventDescriptorCollection;(System.ComponentModel.EventDescriptor[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Argument[Qualifier].Element;value | | System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;EventDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;AddHandlers;(System.ComponentModel.EventHandlerList);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;get_Item;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;GuidConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicFileLicenseProvider;false;GetKey;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;LicFileLicenseProvider;false;GetLicense;(System.ComponentModel.LicenseContext,System.Type,System.Object,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;LicenseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;get_LicenseProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;ListSortDescriptionCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel;ListSortDescriptionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.ComponentModel;ListSortDescriptionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.ComponentModel;ListSortDescriptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;ListSortDescriptionCollection;false;ListSortDescriptionCollection;(System.ComponentModel.ListSortDescription[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Argument[Qualifier].Element;value | | System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;MarshalByValueComponent;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToDisplayString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;GetInvokee;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;GetSite;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;true;CreateAttributeCollection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;FillAttributes;(System.Collections.IList);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.ComponentModel;MemberDescriptor;true;GetInvocationTarget;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_AttributeArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;set_AttributeArray;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MultilineStringConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NestedContainer;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;NestedContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel;NullableConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;ProgressChangedEventArgs;false;ProgressChangedEventArgs;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;ProgressChangedEventArgs;false;get_UserState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;false;FillAttributes;(System.Collections.IList);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.ComponentModel;PropertyDescriptor;false;GetInvocationTarget;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;false;GetValueChangedHandler;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;true;get_Converter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Argument[Qualifier].Element;value | @@ -862,6 +1710,12 @@ | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | @@ -876,51 +1730,249 @@ | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.String,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.Type,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyTabAttribute;false;get_TabClasses;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ReferenceConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;ReferenceConverter;false;ReferenceConverter;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;RunWorkerCompletedEventArgs;false;RunWorkerCompletedEventArgs;(System.Object,System.Exception,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;RunWorkerCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;StringConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TimeSpanConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemFilterAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;TypeConverter+StandardValuesCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.ComponentModel;TypeConverter+StandardValuesCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;StandardValuesCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertTo;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetProperties;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetStandardValues;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;SortProperties;(System.ComponentModel.PropertyDescriptorCollection,System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;TypeDescriptionProvider;(System.ComponentModel.TypeDescriptionProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetReflectionType;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetRuntimeType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Object,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Type,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetAssociation;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetProvider;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;TypeListConverter;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;VersionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;WarningException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Win32Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Win32Exception;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataAdapter;false;get_TableMappings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.String,System.String,System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;get_DataSetColumn;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;get_SourceColumn;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;set_DataSetColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;set_SourceColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data.Common;DataColumnMappingCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;GetByDataSetColumn;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetDataColumn;(System.Data.Common.DataColumnMappingCollection,System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[3];ReturnValue;generated:taint | | System.Data.Common;DataColumnMappingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataColumn;(System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_ColumnMappings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_DataSetTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_SourceTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;set_DataSetTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;set_SourceTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data.Common;DataTableMappingCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataTableMappingCollection;false;GetByDataSetTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DataTableMappingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[2];ReturnValue;generated:taint | | System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbCommand;false;ExecuteReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReader;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;set_Connection;(System.Data.Common.DbConnection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Connection;(System.Data.IDbConnection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Transaction;(System.Data.Common.DbTransaction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Transaction;(System.Data.IDbTransaction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;true;ExecuteDbDataReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;true;PrepareAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetInsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetInsertCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;RowUpdatingHandler;(System.Data.Common.RowUpdatingEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.Common;DbCommandBuilder;false;get_DataAdapter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;set_DataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;InitializeCommand;(System.Data.Common.DbCommand);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_CatalogSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_QuotePrefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_QuoteSuffix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_SchemaSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_CatalogSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_QuotePrefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_QuoteSuffix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_SchemaSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbConnection;false;CreateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnection;true;ChangeDatabaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbConnection;true;OpenAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[1];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[2];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[1];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[2];Argument[0];generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data.Common;DbConnectionStringBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;get_ConnectionString;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Data.Common;DbConnectionStringBuilder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbDataAdapter;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;DbDataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;get_DeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_InsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_SelectCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_UpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;false;GetFieldValueAsync<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbDataReader;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DbDataReader;true;GetFieldValue<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetFieldValueAsync<>;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetProviderSpecificValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetProviderSpecificValues;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;DbDataReader;true;GetSchemaTableAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetTextReader;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataRecord;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbParameterCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Data.Common;DbParameterCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | @@ -934,16 +1986,205 @@ | System.Data.Common;DbParameterCollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data.Common;DbParameterCollection;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbTransaction;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;CommitAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;ReleaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;RollbackAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;RollbackAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;SaveAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_BaseCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_Command;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;SqlBinary;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;ToSqlGuid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;Read;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[1].Element;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;Write;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;get_Stream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;set_Stream;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlChars;false;SqlChars;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlChars;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlChars;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Abs;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;AdjustScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Ceiling;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;ConvertToPrecScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Floor;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Round;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Truncate;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlGuid;false;SqlGuid;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlGuid;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlGuid;false;ToSqlBinary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;GetNonUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;GetUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;SqlString;(System.Int32,System.Data.SqlTypes.SqlCompareOptions,System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;SqlString;(System.String,System.Int32,System.Data.SqlTypes.SqlCompareOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlString;false;get_CompareInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlXml;false;SqlXml;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;Constraint;false;SetDataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;Constraint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;get_ConstraintName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;get__DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;set_ConstraintName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];ReturnValue;generated:taint | | System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;ConstraintCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data;DBConcurrencyException;false;DBConcurrencyException;(System.String,System.Exception,System.Data.DataRow[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data;DBConcurrencyException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DBConcurrencyException;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DBConcurrencyException;false;set_Row;(System.Data.DataRow);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Caption;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_ColumnName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;set_Caption;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_ColumnName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_DataType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_DefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Expression;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumnChangeEventArgs;false;DataColumnChangeEventArgs;(System.Data.DataRow,System.Data.DataColumn,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataColumnChangeEventArgs;false;get_Column;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;Add;(System.String,System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataColumnCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetDateTime;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetFieldValue<>;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetFieldValueAsync<>;(System.Data.Common.DbDataReader,System.String,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetGuid;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetProviderSpecificValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetString;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetTextReader;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[6].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ChildColumns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ChildKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ParentColumns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ParentKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_RelationName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;set_RelationName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;false;Remove;(System.Data.DataRelation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataRow;false;DataRow;(System.Data.DataRowBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;SetNull;(System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;SetParentRow;(System.Data.DataRow,System.Data.DataRelation);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;get_Item;(System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Data.DataColumn,System.Data.DataRowVersion);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Int32,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_ItemArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_RowError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;set_Item;(System.Data.DataColumn,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;set_RowError;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRowCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -951,30 +2192,166 @@ | System.Data;DataRowCollection;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataRowCollection;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataRowCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataRowCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowExtensions;false;SetField<>;(System.Data.DataRow,System.Data.DataColumn,T);;Argument[1];Argument[0];generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataRowView;false;get_DataView;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;CreateDataReader;(System.Data.DataTable[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataSet;false;DataSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;DataSet;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DataSet;false;get_DataSetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_DefaultViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Relations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Tables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;set_DataSetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;DataTable;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;DataTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;DataTable;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetErrors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Data.LoadOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRow;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRowArray;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRowFromBuilder;(System.Data.DataRowBuilder);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataTable;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ChildRelations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DefaultView;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DisplayExpression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ParentRelations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Rows;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_TableName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_PrimaryKey;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_TableName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTableCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataTableCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableExtensions;false;AsEnumerable;(System.Data.DataTable);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTableReader;false;GetDateTime;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataTableReader;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataTableReader;false;GetGuid;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetProviderSpecificValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetProviderSpecificValues;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data;DataTableReader;false;GetSchemaTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataView;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataView;false;AddNew;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ApplySort;(System.ComponentModel.PropertyDescriptor,System.ComponentModel.ListSortDirection);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataView;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[2];Argument[Qualifier];generated:taint | | System.Data;DataView;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataView;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataView;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;FindRows;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;FindRows;(System.Object[]);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataView;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataView;false;GetItemProperties;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataView;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataView;false;ToTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.String,System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataView;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataView;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataView;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataView;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;set_Table;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataViewManager;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataViewManager;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataViewManager;false;CreateDataView;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataViewManager;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataViewManager;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataViewManager;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataViewManager;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataViewManager;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewManager;false;get_DataViewSettings;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataViewManager;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataViewManager;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataViewManager;false;set_DataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataViewManager;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataViewSetting;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataViewSetting;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataViewSettingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data;DataViewSettingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataViewSettingCollection;false;get_Item;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[0];Argument[1];generated:taint | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Int32,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint | | System.Data;EnumerableRowCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | @@ -999,6 +2376,25 @@ | System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | | System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;FillErrorEventArgs;false;get_DataTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ForeignKeyConstraint;false;get_RelatedColumns;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data;IDataParameterCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | @@ -1007,7 +2403,9 @@ | System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data;InternalDataCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data;InternalDataCollectionBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;InternalDataCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data;PropertyCollection;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBase<>;false;Cast<>;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;TypedTableBase<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Data;TypedTableBase<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Argument[0].Element;ReturnValue.Element;value | @@ -1024,6 +2422,87 @@ | System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | | System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractClassAttribute;false;ContractClassAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractClassAttribute;false;get_TypeContainingContracts;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractClassForAttribute;false;ContractClassForAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractClassForAttribute;false;get_TypeContractsAreFor;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[3];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Condition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_OriginalException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Setting;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;ContractPublicPropertyNameAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayUnits;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayUnits;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;DisableEvents;(System.Diagnostics.Tracing.EventSource);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords,System.Collections.Generic.IDictionary);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventSource;false;EventSource;(System.Diagnostics.Tracing.EventSourceSettings,System.String[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String,System.Diagnostics.Tracing.EventManifestOptions);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GetName;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GetTrait;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_ConstructionException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_ActivityId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_EventName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_PayloadNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_RelatedActivityId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;AddBaggage;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddEvent;(System.Diagnostics.ActivityEvent);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddTag;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;SetEndTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetIdFormat;(System.Diagnostics.ActivityIdFormat);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetStartTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;Start;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Links;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_ParentId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_ParentSpanId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_RootId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_SpanId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TagObjects;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TraceId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TraceStateString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;set_TraceStateString;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ActivityCreationOptions<>;false;get_SamplingTags;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySource;false;StartActivity;(System.String,System.Diagnostics.ActivityKind,System.String,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable,System.DateTimeOffset);;Argument[2];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySpanId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySpanId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivityTagsCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -1035,14 +2514,134 @@ | System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current];value | +| System.Diagnostics;ActivityTagsCollection;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ActivityTagsCollection;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Diagnostics;ActivityTagsCollection;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | | System.Diagnostics;ActivityTagsCollection;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTraceId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivityTraceId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;CorrelationManager;false;get_LogicalOperationStack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DataReceivedEventArgs;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerDisplayAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerDisplayAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DebuggerTypeProxyAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerTypeProxyAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DebuggerVisualizerAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerVisualizerAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DefaultTraceListener;false;get_LogFileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DefaultTraceListener;false;set_LogFileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DelimitedListTraceListener;false;get_Delimiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DelimitedListTraceListener;false;set_Delimiter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DiagnosticSource;false;StartActivity;(System.Diagnostics.Activity,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;GetVersionInfo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_Comments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_CompanyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_InternalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_LegalCopyright;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_LegalTrademarks;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_OriginalFilename;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_PrivateBuild;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_ProductName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_ProductVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_SpecialBuild;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;GetProcessById;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;GetProcesses;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;Start;(System.Diagnostics.ProcessStartInfo);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_ExitTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MachineName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MainModule;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MaxWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MinWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Modules;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_ProcessorAffinity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardInput;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardOutput;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StartInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StartTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Threads;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;set_ProcessorAffinity;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Process;false;set_StartInfo;(System.Diagnostics.ProcessStartInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessModule;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessModule;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessModule;false;get_ModuleName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessModuleCollection;false;ProcessModuleCollection;(System.Diagnostics.ProcessModule[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessModuleCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Environment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_EnvironmentVariables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Verb;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_WorkingDirectory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_Arguments;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_FileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_Verb;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_WorkingDirectory;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThread;false;get_StartAddress;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Argument[Qualifier].Element;value | | System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;Insert;(System.Int32,System.Diagnostics.ProcessThread);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThreadCollection;false;ProcessThreadCollection;(System.Diagnostics.ProcessThread[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThreadCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SourceFilter;false;SourceFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SourceFilter;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SourceFilter;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;GetFileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackFrame;false;GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackTrace;false;GetFrame;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackTrace;false;StackTrace;(System.Diagnostics.StackFrame);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackTrace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;get_SwitchName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchAttribute;false;get_SwitchType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchAttribute;false;set_SwitchName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;set_SwitchType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;SwitchLevelAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;get_SwitchLevelType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;set_SwitchLevelType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;set_Writer;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceEventCache;false;get_Callstack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceEventCache;false;get_DateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;TraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceListener;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;set_Filter;(System.Diagnostics.TraceFilter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceListener;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;true;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Argument[0].Element;Argument[Qualifier].Element;value | @@ -1054,8 +2653,43 @@ | System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceSource;false;TraceSource;(System.String,System.Diagnostics.SourceLevels);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceSource;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Listeners;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Switch;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;set_Switch;(System.Diagnostics.SourceSwitch);;Argument[0];Argument[Qualifier];generated:taint | +| System.Drawing;Color;false;FromName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;Color;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Drawing;Color;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;ColorTranslator;false;FromHtml;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;ColorTranslator;false;ToHtml;(System.Drawing.Color);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;Rectangle;false;Inflate;(System.Drawing.Rectangle,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;RectangleF;false;Inflate;(System.Drawing.RectangleF,System.Single,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetExpressionRestriction;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;Merge;(System.Dynamic.BindingRestrictions);;Argument[Qualifier];ReturnValue;generated:value | +| System.Dynamic;BindingRestrictions;false;ToExpression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Dynamic;DynamicMetaObject;false;Create;(System.Object,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;DynamicMetaObject;false;DynamicMetaObject;(System.Linq.Expressions.Expression,System.Dynamic.BindingRestrictions,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Dynamic;DynamicMetaObject;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -1064,17 +2698,183 @@ | System.Dynamic;ExpandoObject;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Dynamic;ExpandoObject;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Dynamic;ExpandoObject;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Dynamic;ExpandoObject;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | | System.Dynamic;ExpandoObject;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Dynamic;ExpandoObject;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | | System.Dynamic;ExpandoObject;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[2];Argument[Qualifier];generated:taint | +| System.Formats.Asn1;AsnReader;false;PeekContentBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;PeekEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadEnumeratedBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadIntegerBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Boolean,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveBitString;(System.Int32,System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveCharacterStringBytes;(System.Formats.Asn1.Asn1Tag,System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveOctetString;(System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushOctetString;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;Calendar;false;ReadOnly;(System.Globalization.Calendar);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;CultureInfo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureInfo;false;GetConsoleFallbackUICulture;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfoByIetfLanguageTag;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;ReadOnly;(System.Globalization.CultureInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_EnglishName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_NativeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_NumberFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_TextInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;set_DateTimeFormat;(System.Globalization.DateTimeFormatInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureInfo;false;set_NumberFormat;(System.Globalization.NumberFormatInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Globalization;CultureNotFoundException;false;get_InvalidCultureId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureNotFoundException;false;get_InvalidCultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAllDateTimePatterns;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetShortestDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;ReadOnly;(System.Globalization.DateTimeFormatInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;SetAllDateTimePatterns;(System.String[],System.Char);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_AMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_DateSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_MonthDayPattern;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_PMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_TimeSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_Calendar;(System.Globalization.Calendar);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_DateSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_DayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_FullDateTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_LongDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_LongTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthDayPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_PMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortestDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_TimeSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_YearMonthPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DaylightTime;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DaylightTime;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;GlobalizationExtensions;false;GetStringComparer;(System.Globalization.CompareInfo,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;ReadOnly;(System.Globalization.NumberFormatInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencyDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencyGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NaNSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NegativeInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NegativeSign;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NumberDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NumberGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PerMilleSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PositiveInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PositiveSign;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencyDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencyGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NaNSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NativeDigits;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NegativeInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NegativeSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NumberDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NumberGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PerMilleSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PositiveInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PositiveSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;RegionInfo;false;RegionInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;RegionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;RegionInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;RegionInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortKey;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortKey;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortVersion;false;SortVersion;(System.Int32,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;SortVersion;false;get_SortId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetNextTextElement;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetNextTextElement;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;StringInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;get_String;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;set_String;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;TextElementEnumerator;false;GetTextElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ReadOnly;(System.Globalization.TextInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToLower;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToTitleCase;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToUpper;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;set_ListSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.IO.Compression;BrotliStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;BrotliStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;BrotliStream;false;BrotliStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;BrotliStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;BrotliStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;BrotliStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;BrotliStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;BrotliStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;BrotliStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;BrotliStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;BrotliStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;BrotliStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;DeflateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;DeflateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;DeflateStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | @@ -1083,51 +2883,216 @@ | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];ReturnValue;taint | +| System.IO.Compression;DeflateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;DeflateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;DeflateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;DeflateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;DeflateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;DeflateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;DeflateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;DeflateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;DeflateStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;GZipStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;GZipStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;GZipStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO.Compression;GZipStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO.Compression;GZipStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;GZipStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | | System.IO.Compression;GZipStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Compression;GZipStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;GZipStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;GZipStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;GZipStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;GZipStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;GZipStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipArchive;false;get_Entries;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;Open;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_Archive;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_LastWriteTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;set_LastWriteTime;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipFile;false;Open;(System.String,System.IO.Compression.ZipArchiveMode,System.Text.Encoding);;Argument[2];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[2];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;ToFileSystemInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;ToSpecifiedFullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.IO.Enumeration;FileSystemEnumerator<>;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemName;false;TranslateWin32Expression;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_ApplicationIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_AssemblyIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_DomainIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedFile;false;CreateFromFile;(System.IO.FileStream,System.String,System.Int64,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IO.HandleInheritability,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedFile;false;get_SafeMemoryMappedFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedViewAccessor;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedViewStream;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;AnonymousPipeClientStream;false;AnonymousPipeClientStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;get_ClientSafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.String,System.String,System.IO.Pipes.PipeDirection,System.IO.Pipes.PipeOptions,System.Security.Principal.TokenImpersonationLevel,System.IO.HandleInheritability);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeServerStream;false;NamedPipeServerStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeServerStream;false;WaitForConnectionAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | | System.IO.Pipes;PipeStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Pipes;PipeStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Pipes;PipeStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;PipeStream;false;InitializeHandle;(Microsoft.Win32.SafeHandles.SafePipeHandle,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | | System.IO.Pipes;PipeStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO.Pipes;PipeStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Pipes;PipeStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Pipes;PipeStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Pipes;PipeStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Pipes;PipeStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;PipeStream;false;get_SafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;BinaryReader;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.IO;BinaryReader;false;ReadBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryWriter;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;BufferedStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;BufferedStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;BufferedStream;false;BufferedStream;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | | System.IO;BufferedStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;BufferedStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;BufferedStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;BufferedStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;BufferedStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;BufferedStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;BufferedStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;BufferedStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;BufferedStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BufferedStream;false;get_UnderlyingStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;Directory;false;CreateDirectory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;Directory;false;GetParent;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;DirectoryInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DirectoryInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;DriveInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DriveInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_RootDirectory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_VolumeLabel;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;ErrorEventArgs;false;ErrorEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;ErrorEventArgs;false;GetException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllBytesAsync;(System.String,System.Byte[],System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;FileInfo;false;CopyTo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileInfo;false;CopyTo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileInfo;false;MoveTo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileInfo;false;get_Directory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileInfo;false;get_DirectoryName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;FileLoadException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;FileNotFoundException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;FileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;FileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;FileStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;FileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;FileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;FileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;FileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;FileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;FileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;FileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileStream;false;get_SafeFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;FileSystemEventArgs;false;get_FullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;false;get_Extension;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;true;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Filters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | | System.IO;MemoryStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;MemoryStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;MemoryStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;MemoryStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;MemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;MemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;MemoryStream;false;GetBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[]);;Argument[0];ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | @@ -1135,9 +3100,14 @@ | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;MemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;MemoryStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;MemoryStream;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | +| System.IO;MemoryStream;false;TryGetBuffer;(System.ArraySegment);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;MemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;MemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;MemoryStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;MemoryStream;false;WriteTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;Path;false;ChangeExtension;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint | @@ -1161,20 +3131,40 @@ | System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetPathRoot;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetRelativePath;(System.String,System.String);;Argument[1];ReturnValue;taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3];ReturnValue;generated:taint | +| System.IO;Path;false;TrimEndingDirectorySeparator;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;TrimEndingDirectorySeparator;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;RenamedEventArgs;false;get_OldFullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;RenamedEventArgs;false;get_OldName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;false;CopyTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;Stream;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;false;Synchronized;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | | System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;true;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;Stream;true;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;StreamReader;false;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;Read;(System.Span);;Argument[Qualifier];ReturnValue;taint | @@ -1188,6 +3178,56 @@ | System.IO;StreamReader;false;ReadLineAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | +| System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamReader;false;get_CurrentEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;Write;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;StringReader;false;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StringReader;false;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System.IO;StringReader;false;Read;(System.Span);;Argument[Qualifier];ReturnValue;taint | @@ -1201,6 +3241,40 @@ | System.IO;StringReader;false;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StringReader;false;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StringReader;false;StringReader;(System.String);;Argument[0];ReturnValue;taint | +| System.IO;StringWriter;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;GetStringBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;StringWriter;(System.Text.StringBuilder,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;Write;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;Write;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;Write;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLine;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextReader;false;Synchronized;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | | System.IO;TextReader;true;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;Read;(System.Span);;Argument[Qualifier];ReturnValue;taint | @@ -1214,10 +3288,593 @@ | System.IO;TextReader;true;ReadLineAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | +| System.IO;TextWriter;false;Synchronized;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;false;TextWriter;(System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;Write;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;UnmanagedMemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;UnmanagedMemoryStream;false;Initialize;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | | System.IO;UnmanagedMemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;UnmanagedMemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;UnmanagedMemoryStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | | System.IO;UnmanagedMemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;UnmanagedMemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;UnmanagedMemoryStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;UnmanagedMemoryStream;false;get_PositionPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;BinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BinaryExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;BinaryExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;BinaryExpression;false;get_Conversion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BinaryExpression;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;BlockExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;Update;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;BlockExpression;false;get_Expressions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;get_Variables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;CatchBlock;false;Update;(System.Linq.Expressions.ParameterExpression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;ConditionalExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;ConditionalExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ConditionalExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;ConditionalExpression;false;get_IfFalse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ConstantExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;ConstantExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DebugInfoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;DebugInfoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DefaultExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;DefaultExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Rewrite;(System.Linq.Expressions.Expression[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;DynamicExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpressionVisitor;false;VisitDynamic;(System.Linq.Expressions.DynamicExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ElementInit;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ArrayAccess;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ArrayIndex;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MemberInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Coalesce;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GetActionType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GetFuncType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;IfThenElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Invoke;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeIndex;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeMemberAccess;(System.Linq.Expressions.Expression,System.Reflection.MemberInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Reflection.MemberInfo[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ReduceAndCheck;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ReduceExtensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;TryGetActionType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;TryGetFuncType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;true;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression<>;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;Expression<>;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression<>;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitCatchBlock;(System.Linq.Expressions.CatchBlock);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConstant;(System.Linq.Expressions.ConstantExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDebugInfo;(System.Linq.Expressions.DebugInfoExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDefault;(System.Linq.Expressions.DefaultExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDynamic;(System.Linq.Expressions.DynamicExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitElementInit;(System.Linq.Expressions.ElementInit);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitGoto;(System.Linq.Expressions.GotoExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitIndex;(System.Linq.Expressions.IndexExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitInvocation;(System.Linq.Expressions.InvocationExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLabel;(System.Linq.Expressions.LabelExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLabelTarget;(System.Linq.Expressions.LabelTarget);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitListInit;(System.Linq.Expressions.ListInitExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLoop;(System.Linq.Expressions.LoopExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMember;(System.Linq.Expressions.MemberExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberInit;(System.Linq.Expressions.MemberInitExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberListBinding;(System.Linq.Expressions.MemberListBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberMemberBinding;(System.Linq.Expressions.MemberMemberBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitNew;(System.Linq.Expressions.NewExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitNewArray;(System.Linq.Expressions.NewArrayExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitParameter;(System.Linq.Expressions.ParameterExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitRuntimeVariables;(System.Linq.Expressions.RuntimeVariablesExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitSwitch;(System.Linq.Expressions.SwitchExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitSwitchCase;(System.Linq.Expressions.SwitchCase);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitTry;(System.Linq.Expressions.TryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitTypeBinary;(System.Linq.Expressions.TypeBinaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitUnary;(System.Linq.Expressions.UnaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;GotoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;GotoExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;GotoExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;IndexExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;IndexExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;IndexExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;IndexExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;IndexExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;InvocationExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;InvocationExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;InvocationExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LabelExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;LabelExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;LabelExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LambdaExpression;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;LambdaExpression;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ListInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;ListInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ListInitExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;ListInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LoopExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;LoopExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;LoopExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberAssignment;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberAssignment;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;MemberExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberExpression;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;MemberInitExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberInitExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberListBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberMemberBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MethodCallExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;MethodCallExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MethodCallExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MethodCallExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MethodCallExpression;false;get_Object;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewArrayExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;NewArrayExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewArrayExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;NewExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;NewExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;NewExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ParameterExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;ParameterExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;RuntimeVariablesExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;RuntimeVariablesExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;RuntimeVariablesExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;SwitchCase;false;Update;(System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;SwitchExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;SwitchExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;SwitchExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;TryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;TryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;TryExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;TypeBinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;TypeBinaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;TypeBinaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;UnaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;UnaryExpression;false;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;UnaryExpression;false;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;UnaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | @@ -1229,6 +3886,7 @@ | System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue;value | | System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Append<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint | | System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -1346,6 +4004,8 @@ | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Prepend<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint | +| System.Linq;Enumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint | | System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | @@ -1370,6 +4030,7 @@ | System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | | System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -1385,6 +4046,7 @@ | System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -1430,14 +4092,28 @@ | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;EnumerableExecutor<>;false;EnumerableExecutor;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq;EnumerableQuery<>;false;CreateQuery<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | | System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Linq;EnumerableQuery<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;get_Provider;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq;ImmutableArrayExtensions;false;ElementAt<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ImmutableArrayExtensions;false;ElementAtOrDefault<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | | System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Single<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Linq;Lookup<,>;false;get_Item;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | | System.Linq;OrderedParallelQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | | System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | @@ -1451,6 +4127,13 @@ | System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;AsOrdered;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsOrdered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Concurrent.Partitioner);;Argument[0];ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsSequential<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsUnordered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -1595,6 +4278,7 @@ | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | @@ -1680,6 +4364,10 @@ | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;WithCancellation<>;(System.Linq.ParallelQuery,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithDegreeOfParallelism<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithExecutionMode<>;(System.Linq.ParallelQuery,System.Linq.ParallelExecutionMode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithMergeOptions<>;(System.Linq.ParallelQuery,System.Linq.ParallelMergeOptions);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | @@ -1856,12 +4544,218 @@ | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan,System.DateTime);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_CacheSyncDate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MaxStale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Parameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxStaleLimit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_SharedMaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxStaleLimit;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MinFresh;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_SharedMaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.Net.Http.Headers.ContentDispositionHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileNameStar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Length;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;EntityTagHeaderValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Http.Headers;HttpHeaderValueCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Net.Http.Headers;HttpHeaderValueCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_AcceptRanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_ProxyAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_Vary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_WwwAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.Net.Http.Headers.NameValueHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueWithParametersHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.Net.Http.Headers.ProductHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.ProductInfoHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Product;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.Net.Http.Headers.EntityTagHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;get_EntityTag;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Quality;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ReceivedBy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Agent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;Create;(System.Object,System.Type,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[3];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;Create<>;(T,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http.Json;JsonContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Http;ByteArrayContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;DelegatingHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;DelegatingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;get_InnerHandler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;set_InnerHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;get_DefaultRequestVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;set_BaseAddress;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClient;false;set_DefaultRequestVersion;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClient;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClientHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;CopyTo;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;CreateContentReadStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpMessageInvoker;false;HttpMessageInvoker;(System.Net.Http.HttpMessageHandler,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpMessageInvoker;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;HttpMethod;false;HttpMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpMethod;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpMethod;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Method;(System.Net.Http.HttpMethod);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_RequestUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | @@ -1875,15 +4769,212 @@ | System.Net.Http;HttpRequestOptions;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;HttpResponseMessage;false;EnsureSuccessStatusCode;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net.Http;HttpResponseMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_ReasonPhrase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_RequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_ReasonPhrase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_RequestMessage;(System.Net.Http.HttpRequestMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;MessageProcessingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | | System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;MultipartContent;false;CreateContentReadStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Http;MultipartContent;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.Http;MultipartContent;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http;MultipartContent;false;MultipartContent;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;MultipartFormDataContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;MultipartFormDataContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;MultipartFormDataContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;ReadOnlyMemoryContent;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpConnectionContext;false;get_DnsEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpConnectionContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ConnectCallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ConnectTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_DefaultProxyCredentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Expect100ContinueTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingDelay;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PlaintextStreamFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionIdleTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionLifetime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_RequestHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ResponseDrainTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ResponseHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_SslOptions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_ConnectTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_DefaultProxyCredentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Expect100ContinueTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingDelay;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionIdleTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionLifetime;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_ResponseDrainTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_SslOptions;(System.Net.Security.SslClientAuthenticationOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_NegotiatedHttpVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_PlaintextStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AlternateViewCollection;false;InsertItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AlternateViewCollection;false;SetItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_ContentDisposition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_NameEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;set_NameEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;get_ContentId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AttachmentBase;false;get_ContentStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AttachmentBase;false;set_ContentType;(System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentCollection;false;InsertItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentCollection;false;SetItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;get_ContentLink;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResourceCollection;false;InsertItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;LinkedResourceCollection;false;SetItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[2];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Mail;MailAddressCollection;false;InsertItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddressCollection;false;SetItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddressCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.Net.Mail.MailAddress,System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_BodyEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_HeadersEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_ReplyTo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Sender;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_SubjectEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;set_Body;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_BodyEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_From;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_HeadersEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_ReplyTo;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_Sender;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_Subject;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_SubjectEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;Send;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;Send;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendAsync;(System.Net.Mail.MailMessage,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendAsync;(System.String,System.String,System.String,System.String,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[4];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;SmtpClient;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SmtpClient;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_PickupDirectoryLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_TargetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;set_Credentials;(System.Net.ICredentialsByHost);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_PickupDirectoryLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_TargetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;get_FailedRecipient;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Net.Mail.SmtpFailedRecipientException[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;get_InnerExceptions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;ContentDisposition;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentDisposition;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentType;false;ContentType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentType;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Boundary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.GatewayIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | | System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.GatewayIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.NetworkInformation;IPAddressCollection;false;Add;(System.Net.IPAddress);;Argument[0];Argument[Qualifier].Element;value | | System.Net.NetworkInformation;IPAddressCollection;false;CopyTo;(System.Net.IPAddress[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.NetworkInformation;IPAddressCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | @@ -1892,114 +4983,1405 @@ | System.Net.NetworkInformation;IPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.IPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.MulticastIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | | System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.MulticastIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.NetworkInformation;PhysicalAddress;false;PhysicalAddress;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.UnicastIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | | System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.UnicastIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;AuthenticatedStream;false;AuthenticatedStream;(System.IO.Stream,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Security;AuthenticatedStream;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;AuthenticatedStream;false;get_InnerStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.Security;NegotiateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Security;NegotiateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;NegotiateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Security;NegotiateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Security;NegotiateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Security;NegotiateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.Net.Security;NegotiateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;get_RemoteIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslApplicationProtocol;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslApplicationProtocol;false;get_Protocol;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Security;SslStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Security;SslStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;SslStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Security;SslStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Security;SslStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;SslStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Net.Security;SslStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.Net.Security;SslStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;SslStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_LocalCertificate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_NegotiatedApplicationProtocol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_RemoteCertificate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_TransportContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStreamCertificateContext;false;Create;(System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;IPPacketInformation;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;MulticastOption;false;get_LocalAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;set_LocalAddress;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.Sockets;NetworkStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Sockets;NetworkStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Sockets;NetworkStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;NetworkStream;(System.Net.Sockets.Socket,System.IO.FileAccess,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.Sockets;NetworkStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Sockets;NetworkStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.Net.Sockets;NetworkStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Sockets;NetworkStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;get_Socket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SafeSocketHandle;false;SafeSocketHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Accept;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;Bind;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress[],System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;DisconnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;EndAccept;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendPacketsAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_LocalEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Memory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_BufferList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectByNameError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_MemoryBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ReceiveMessageFromPacketInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_SendPacketsElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_UserToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_AcceptSocket;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_BufferList;(System.Collections.Generic.IList>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_RemoteEndPoint;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_SendPacketsElements;(System.Net.Sockets.SendPacketsElement[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_UserToken;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;AcceptAsync;(System.Net.Sockets.Socket,System.Net.Sockets.Socket);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.String,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveMessageFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendToAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[0];generated:taint | +| System.Net.Sockets;TcpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpClient;false;GetStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpClient;false;TcpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;AcceptTcpClient;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;EndAcceptSocket;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;EndAcceptTcpClient;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;get_LocalEndpoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;EndReceive;(System.IAsyncResult,System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Receive;(System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Send;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;SendAsync;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;UdpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;SetBuffer;(System.Int32,System.Int32,System.ArraySegment);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_KeepAliveInterval;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_RemoteCertificateValidationCallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Cookies;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_KeepAliveInterval;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_CookieCollection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Origin;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketProtocols;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_WebSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[0];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[1];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[2];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocketException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;Authorization;false;get_ProtectionRealm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Authorization;false;set_ProtectionRealm;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_CommentUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Expires;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Port;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_TimeStamp;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;Cookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Net;Cookie;false;set_Comment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_CommentUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Expires;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Port;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Net;CookieCollection;false;Add;(System.Net.Cookie);;Argument[0];Argument[Qualifier].Element;value | | System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Argument[Qualifier].Element;value | | System.Net;CookieCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net;CookieCollection;false;CopyTo;(System.Net.Cookie[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net;CookieCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net;CookieCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;CookieCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;CookieCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;CookieCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;CookieException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;CredentialCache;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;CredentialCache;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;Dns;false;EndGetHostAddresses;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndGetHostByName;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndGetHostEntry;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndResolve;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;DnsEndPoint;false;DnsEndPoint;(System.String,System.Int32,System.Net.Sockets.AddressFamily);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;DnsEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DnsEndPoint;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DownloadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DownloadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FileWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_ClientCertificates;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_ConnectionGroupName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_RenameTo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_ConnectionGroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_RenameTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_BannerMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_ExitMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_LastModified;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_WelcomeMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_AuthenticationSchemeSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_DefaultServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_ExtendedProtectionPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_ExtendedProtectionSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_Prefixes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_Realm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_TimeoutManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;set_ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListener;false;set_Realm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerContext;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;HttpListenerPrefixCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;HttpListenerRequest;false;EndGetClientCertificate;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_HttpMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_InputStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_RawUrl;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Url;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UrlReferrer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UserHostName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;AppendCookie;(System.Net.Cookie);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;Close;(System.Byte[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;CopyFrom;(System.Net.HttpListenerResponse);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_OutputStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_RedirectLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;set_StatusDescription;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerTimeoutManager;false;get_DrainEntityBody;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerTimeoutManager;false;get_IdleConnection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerTimeoutManager;false;set_DrainEntityBody;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerTimeoutManager;false;set_IdleConnection;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetRequestStream;(System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Accept;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_ContinueDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Expect;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Referer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_TransferEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebResponse;false;GetResponseHeader;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_CharacterSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;IPAddress;false;MapToIPv4;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;IPAddress;false;MapToIPv6;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;IPAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;IPEndPoint;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;IPEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;set_Address;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | | System.Net;IPHostEntry;false;get_Aliases;();;Argument[Qualifier];ReturnValue;taint | | System.Net;IPHostEntry;false;get_HostName;();;Argument[Qualifier];ReturnValue;taint | +| System.Net;NetworkCredential;false;GetCredential;(System.String,System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;NetworkCredential;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;OpenReadCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;OpenWriteCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;ProtocolViolationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;UploadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadFileCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadValuesCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;DownloadData;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadData;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadString;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadString;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenReadAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_ResponseHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;set_BaseAddress;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_QueryString;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;WebException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;WebException;false;WebException;(System.String,System.Exception,System.Net.WebExceptionStatus,System.Net.WebResponse);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net;WebException;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Net;WebHeaderCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;WebHeaderCollection;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpRequestHeader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpResponseHeader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebProxy;false;GetProxy;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebProxy;false;get_BypassArrayList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebProxy;false;get_BypassList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebRequest;false;Create;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;Create;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateDefault;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateHttp;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateHttp;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint | | System.Net;WebUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | +| System.Net;WebUtility;false;UrlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | | System.Net;WebUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | +| System.Numerics;BigInteger;false;Abs;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;DivRem;(System.Numerics.BigInteger,System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Negate;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Pow;(System.Numerics.BigInteger,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Remainder;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Complex;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Complex;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Add;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Lerp;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Negate;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Subtract;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Transpose;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Plane;false;Normalize;(System.Numerics.Plane);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Plane;false;Plane;(System.Numerics.Vector3,System.Single);;Argument[0];Argument[Qualifier];generated:taint | +| System.Numerics;Plane;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Numerics;Vector2;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector3;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector4;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector;false;Abs<>;(System.Numerics.Vector);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;GetDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;GetModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;get_ManifestModule;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;DynamicILInfo;false;get_DynamicMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;CreateDelegate;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;DynamicMethod;false;GetDynamicILInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_MethodHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEnumUnderlyingType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_UnderlyingField;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EventBuilder;false;AddOtherMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetAddOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetRaiseMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetRemoveOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_FieldType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetBaseTypeConstraint;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetInterfaceConstraints;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;LocalBuilder;false;get_LocalType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;MethodBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetGenericMethodDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;MethodBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetReturnType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetType;(System.String,System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_FullyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_ScopeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;GetGetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;GetSetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetGetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetSetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_PropertyType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetFieldSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetLocalVarSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.CallingConventions,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;AddInterfaceImplementation;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;CreateType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineDefaultConstructor;(System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[6].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineTypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetGenericTypeDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;TypeBuilder;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;SetParent;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;CustomModifiersEncoder;false;AddModifier;(System.Reflection.Metadata.EntityHandle,System.Boolean);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;Add;(System.Reflection.Metadata.ExceptionRegionKind,System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddCatch;(System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFault;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFilter;(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFinally;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[3];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[4];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;MetadataRootBuilder;(System.Reflection.Metadata.Ecma335.MetadataBuilder,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;get_Sizes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Collections.Immutable.ImmutableArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;PortablePdbBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Array;(System.Reflection.Metadata.Ecma335.SignatureTypeEncoder,System.Reflection.Metadata.Ecma335.ArrayShapeEncoder);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Pointer;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;SZArray;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata;AssemblyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyFile;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;AssemblyReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;Blob;false;GetBytes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata;BlobBuilder;false;GetBlobs;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;ReserveBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;TryWriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadConstant;(System.Reflection.Metadata.ConstantTypeCode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadSerializedString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadUTF8;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadUTF16;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;get_CurrentPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;get_StartPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobWriter;false;BlobWriter;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobWriter;false;WriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobWriter;false;get_Blob;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;EventAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;EventDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ExportedType;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;FieldDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;GenericParameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;GenericParameterConstraint;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ImportDefinitionCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;InterfaceImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetChildren;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetLocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetLocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ManifestResource;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MemberReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyDefinition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyFile;(System.Reflection.Metadata.AssemblyFileHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyReference;(System.Reflection.Metadata.AssemblyReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetConstant;(System.Reflection.Metadata.ConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomAttribute;(System.Reflection.Metadata.CustomAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomAttributes;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.CustomDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetDeclarativeSecurityAttribute;(System.Reflection.Metadata.DeclarativeSecurityAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetDocument;(System.Reflection.Metadata.DocumentHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetEventDefinition;(System.Reflection.Metadata.EventDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetExportedType;(System.Reflection.Metadata.ExportedTypeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetFieldDefinition;(System.Reflection.Metadata.FieldDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetGenericParameter;(System.Reflection.Metadata.GenericParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetGenericParameterConstraint;(System.Reflection.Metadata.GenericParameterConstraintHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetImportScope;(System.Reflection.Metadata.ImportScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetInterfaceImplementation;(System.Reflection.Metadata.InterfaceImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalConstant;(System.Reflection.Metadata.LocalConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScope;(System.Reflection.Metadata.LocalScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalVariable;(System.Reflection.Metadata.LocalVariableHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetManifestResource;(System.Reflection.Metadata.ManifestResourceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMemberReference;(System.Reflection.Metadata.MemberReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDefinition;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodImplementation;(System.Reflection.Metadata.MethodImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodSpecification;(System.Reflection.Metadata.MethodSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetModuleDefinition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetModuleReference;(System.Reflection.Metadata.ModuleReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetNamespaceDefinitionRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetParameter;(System.Reflection.Metadata.ParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetPropertyDefinition;(System.Reflection.Metadata.PropertyDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetStandaloneSignature;(System.Reflection.Metadata.StandaloneSignatureHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeDefinition;(System.Reflection.Metadata.TypeDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeReference;(System.Reflection.Metadata.TypeReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeSpecification;(System.Reflection.Metadata.TypeSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_AssemblyReferences;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_CustomDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_DebugMetadataHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_DeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_Documents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_EventDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_FieldDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_ImportScopes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalScopes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MetadataPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MetadataVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MethodDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MethodDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_PropertyDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_StringComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;GetMetadataReader;(System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataStringDecoder;false;GetString;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;Create;(System.Reflection.Metadata.BlobReader);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;GetILReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;get_ExceptionRegions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;get_LocalSignature;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodImport;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodImport;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ModuleDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ModuleReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_ExportedTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_NamespaceDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_TypeDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;Parameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PropertyAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PropertyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;SequencePointCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;StandaloneSignature;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetInterfaceImplementations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;TypeSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;ManagedPEBuilder;false;GetDirectories;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;ManagedPEBuilder;false;SerializeSection;(System.String,System.Reflection.PortableExecutable.SectionLocation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEBuilder+Section;false;Section;(System.String,System.Reflection.PortableExecutable.SectionCharacteristics);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEBuilder;false;GetSections;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_CoffHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_CorHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_PEHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_SectionHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEMemoryBlock;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetEntireImage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetMetadata;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Byte*,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.IO.Stream,System.Reflection.PortableExecutable.PEStreamOptions,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;get_PEHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;GetAssembly;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;GetPublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;SetPublicKey;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;SetPublicKeyToken;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_CultureInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_EscapedCodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_CultureInfo;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeData;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_MemberInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;get_ArgumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetAddMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetRaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetRemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_AddMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_RaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_RemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;ExceptionHandlingClause;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;IntrospectionExtensions;false;GetTypeInfo;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;LocalVariableInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;MethodInfo;false;CreateDelegate<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;MethodInfoExtensions;false;GetBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;GetRealObject;(System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_ParameterType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Pointer;false;Box;(System.Void*,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Pointer;false;Unbox;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetAccessors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetGetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetSetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;true;get_GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;true;get_SetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;ReflectionTypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection;ReflectionTypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetMethodInfo;(System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvents;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeFields;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethods;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperties;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetElementType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetNestedTypes;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetPropertyImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;TypeDelegator;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;TypeDelegator;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_AssemblyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructor;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructors;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructors;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetDefaultMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvents;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvents;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetFields;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetFields;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetGenericArguments;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetInterfaces;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMembers;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethods;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethods;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetNestedType;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetNestedTypes;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperties;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperties;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;false;GetTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection;TypeInfo;true;AsType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection;TypeInfo;true;GetDeclaredEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredConstructors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredMembers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_GenericTypeParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_ImplementedInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;MissingSatelliteAssemblyException;false;MissingSatelliteAssemblyException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;MissingSatelliteAssemblyException;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;GetResourceFileName;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;get_BaseName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;get_ResourceSetType;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Resources;ResourceReader;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Resources;ResourceReader;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceReader;false;GetResourceData;(System.String,System.String,System.Byte[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceReader;false;ResourceReader;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | | System.Resources;ResourceSet;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Resources;ResourceSet;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceSet;false;ResourceSet;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceSet;false;ResourceSet;(System.Resources.IResourceReader);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Resources;ResourceWriter;false;ResourceWriter;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;CallSite;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetOrCreateValue;(TKey);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;GetAsyncEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_configured_task_awaitable].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | | System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier].SyntheticField[m_configuredTaskAwaiter];ReturnValue;value | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>+ConfiguredValueTaskAwaiter;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;DateTimeConstantAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;DynamicAttribute;false;DynamicAttribute;(System.Boolean[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;DynamicAttribute;false;get_TransformFlags;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;generated:taint | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -2008,59 +6390,574 @@ | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;ReadOnlyCollectionBuilder;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;RuntimeWrappedException;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;get_WrappedException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;StrongBox;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;SwitchExpressionException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.CompilerServices;SwitchExpressionException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_task_awaiter].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Runtime.CompilerServices;TupleElementNamesAttribute;false;TupleElementNamesAttribute;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;TupleElementNamesAttribute;false;get_TransformNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ValueTaskAwaiter<>;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;Capture;(System.Exception);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetCurrentStackTrace;(System.Exception);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;get_SourceException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ArrayWithOffset;false;ArrayWithOffset;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;ArrayWithOffset;false;GetArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;COMException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetAddMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetRaiseMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetRemoveMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;CriticalHandle;false;CriticalHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;CriticalHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;ExternalException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;GCHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;GCHandle;false;ToIntPtr;(System.Runtime.InteropServices.GCHandle);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;HandleRef;false;ToIntPtr;(System.Runtime.InteropServices.HandleRef);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;get_Wrapper;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;Marshal;false;GenerateProgIdForType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;CreateFromPinnedArray<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetString;(System.ReadOnlyMemory,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;DangerousGetHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;SafeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetArray<>;(System.Buffers.ReadOnlySequence,System.ArraySegment);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlyMemory<>;(System.Buffers.ReadOnlySequence,System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlySequenceSegment<>;(System.Buffers.ReadOnlySequence,System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector64;false;WithElement<>;(System.Runtime.Intrinsics.Vector64,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithElement<>;(System.Runtime.Intrinsics.Vector128,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithLower<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithUpper<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithElement<>;(System.Runtime.Intrinsics.Vector256,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithLower<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithUpper<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;EnterContextualReflection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Remoting;ObjectHandle;false;ObjectHandle;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Remoting;ObjectHandle;false;Unwrap;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_SurrogateSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Binder;(System.Runtime.Serialization.SerializationBinder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Context;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_SurrogateSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;DataContractJsonSerializer;(System.Type,System.Runtime.Serialization.Json.DataContractJsonSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ItemName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_KeyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ValueName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ItemName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_KeyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ValueName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Runtime.Serialization.DataContractSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean,System.Runtime.Serialization.DataContractResolver);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;get_DataContractResolver;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializerExtensions;false;GetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializerExtensions;false;SetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer,System.Runtime.Serialization.ISerializationSurrogateProvider);;Argument[1];Argument[0];generated:taint | +| System.Runtime.Serialization;DataMemberAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataMemberAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;get_FormatString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;EnumMemberAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;EnumMemberAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ExportOptions;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.TypeCode);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;ToDateTime;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;ToString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type,System.Runtime.Serialization.StreamingContext);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSurrogateForCyclicalReference;(System.Runtime.Serialization.ISerializationSurrogate);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetTypeFromAssembly;(System.Reflection.Assembly,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;PopulateObjectMembers;(System.Object,System.Reflection.MemberInfo[],System.Object[]);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;ObjectIDGenerator;false;GetId;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ObjectManager;false;GetObject;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Byte);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Char);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Decimal);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.SByte);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Single);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetDateTime;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetValue;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SetType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_FullTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;set_FullTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationObjectManager;false;SerializationObjectManager;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;StreamingContext;false;StreamingContext;(System.Runtime.Serialization.StreamingContextStates,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;StreamingContext;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;GetNextSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;GetSurrogate;(System.Type,System.Runtime.Serialization.StreamingContext,System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;XPathQueryGenerator;false;CreateFromDataContractSerializer;(System.Type,System.Reflection.MemberInfo[],System.Text.StringBuilder,System.Xml.XmlNamespaceManager);;Argument[2];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlDictionaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlSerializableServices;false;WriteNodes;(System.Xml.XmlWriter,System.Xml.XmlNode[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;XsdDataContractExporter;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;set_Options;(System.Runtime.Serialization.ExportOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Identifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Profile;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;TargetFrameworkAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkDisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;set_FrameworkDisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[3];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ChannelBinding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ProtectionScenario,System.Security.Authentication.ExtendedProtection.ServiceNameCollection);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomChannelBinding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicyTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;ServiceNameCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;Claim;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_OriginalIssuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_ValueType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;AddClaim;(System.Security.Claims.Claim);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;AddClaims;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Actor;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_BootstrapContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Label;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_NameClaimType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_RoleClaimType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_Actor;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_BootstrapContext;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_Label;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;AddIdentities;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;AddIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IPrincipal);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;CreateClaimsIdentity;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Identities;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;PublicKey;(System.Security.Cryptography.Oid,System.Security.Cryptography.AsnEncodedData,System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.Security.Cryptography.X509Certificates.X500DistinguishedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.String,System.Security.Cryptography.X509Certificates.X500DistinguishedNameFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509BasicConstraintsExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_IssuerName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotAfter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotBefore;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PrivateKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SerialNumber;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SignatureAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SubjectName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Thumbprint;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetCertHashString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetKeyAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetSerialNumberString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;X509CertificateEnumerator;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainStatus;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;set_ChainPolicy;(System.Security.Cryptography.X509Certificates.X509ChainPolicy);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography.X509Certificates;X509ChainElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainStatus;false;get_StatusInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainStatus;false;set_StatusInformation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;get_EnhancedKeyUsages;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Extension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography.X509Certificates;X509ExtensionEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509KeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForECDsa;(System.Security.Cryptography.ECDsa);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[1];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;get_SubjectKeyIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;Format;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;get_RawData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;set_Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;AsnEncodedDataCollection;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current];value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedDataCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography;AsnEncodedDataEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography;CryptoStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.Security.Cryptography;CryptoStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;CryptoStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;CryptoStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography;CryptoStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.Security.Cryptography;CryptoStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | | System.Security.Cryptography;CryptoStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.Security.Cryptography;CryptoStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Security.Cryptography;CspParameters;false;get_ParentWindowHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;CspParameters;false;set_ParentWindowHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureDeformatter;false;DSASignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureFormatter;false;DSASignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;ECCurve;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HMAC;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HMAC;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;HashAlgorithmName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.Byte[]);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHash;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;get_AlgorithmName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;FromFriendlyName;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;FromOidValue;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;get_FriendlyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;set_FriendlyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography;OidCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.OidEnumerator.Current];value | +| System.Security.Cryptography;OidCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;OidCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;OidCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography;OidEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PKCS1MaskGenerationMethod;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PKCS1MaskGenerationMethod;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[2];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[4];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;CreateOaep;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;get_OaepHashAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;RSAOAEPKeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;RSAOAEPKeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;RSAPKCS1KeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;get_RNG;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;set_RNG;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;RSAPKCS1KeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;RSAPKCS1SignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;RSAPKCS1SignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.Security.Principal.GenericIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericPrincipal;false;GenericPrincipal;(System.Security.Principal.IIdentity,System.String[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security;PermissionSet;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security;PermissionSet;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Security;PermissionSet;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;AddChild;(System.Security.SecurityElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;Attribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SearchForChildByTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SearchForTextOfTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Children;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;set_Children;(System.Collections.ArrayList);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;set_Tag;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;set_Text;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;false;Encode;(System.IO.TextWriter,System.String);;Argument[1];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.Char[],System.Int32,System.Int32);;Argument[1].Element;Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.String,System.Int32,System.Int32);;Argument[1];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json.Serialization;JsonStringEnumConverter;false;JsonStringEnumConverter;(System.Text.Json.JsonNamingPolicy,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.Buffers.ReadOnlySequence,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.IO.Stream,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.ReadOnlyMemory,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;ParseValue;(System.Text.Json.Utf8JsonReader);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;TryParseValue;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonDocument);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;get_RootElement;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement+ArrayEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text.Json;JsonElement;false;EnumerateArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;EnumerateObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.String,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonEncodedText;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonReaderState;false;JsonReaderState;(System.Text.Json.JsonReaderOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonReaderState;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializer;false;Deserialize;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializer;false;Deserialize<>;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;JsonSerializerOptions;(System.Text.Json.JsonSerializerOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_DictionaryKeyPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_Encoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_PropertyNamingPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_ReferenceHandler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_DictionaryKeyPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_Encoder;(System.Text.Encodings.Web.JavaScriptEncoder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_PropertyNamingPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_ReferenceHandler;(System.Text.Json.Serialization.ReferenceHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;get_CurrentState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;Utf8JsonReader;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Reset;(System.Buffers.IBufferWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Reset;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Text.RegularExpressions.Capture);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;CaptureCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -2070,8 +6967,10 @@ | System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;CaptureCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;Group;false;Synchronized;(System.Text.RegularExpressions.Group);;Argument[0];ReturnValue;generated:taint | | System.Text.RegularExpressions;GroupCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;GroupCollection;false;Add;(System.Text.RegularExpressions.Group);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;GroupCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -2080,10 +6979,15 @@ | System.Text.RegularExpressions;GroupCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;TryGetValue;(System.String,System.Text.RegularExpressions.Group);;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;GroupCollection;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;Match;false;NextMatch;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Match;false;Synchronized;(System.Text.RegularExpressions.Match);;Argument[0];ReturnValue;generated:taint | | System.Text.RegularExpressions;MatchCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;MatchCollection;false;Add;(System.Text.RegularExpressions.Match);;Argument[0];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;MatchCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | @@ -2093,8 +6997,72 @@ | System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;MatchCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;Regex;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;GroupNameFromNumber;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;IsMatch;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;IsMatch;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[3];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Unescape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_CapNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_Caps;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;set_CapNames;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;set_Caps;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[3];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[5];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Pattern;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_MatchTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Pattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexMatchTimeoutException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.RegularExpressions;RegexParseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;ASCIIEncoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint | @@ -2102,10 +7070,43 @@ | System.Text;ASCIIEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;ASCIIEncoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;ASCIIEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Decoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Decoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Decoder;false;set_Fallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;DecoderFallbackException;false;DecoderFallbackException;(System.String,System.Byte[],System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Text;DecoderFallbackException;false;get_BytesUnknown;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallback;false;DecoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;DecoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallbackBuffer;false;DecoderReplacementFallbackBuffer;(System.Text.DecoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoder;false;set_Fallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;EncoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;EncoderReplacementFallback;false;EncoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;EncoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;EncoderReplacementFallbackBuffer;false;EncoderReplacementFallbackBuffer;(System.Text.EncoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[],System.Int32,System.Int32);;Argument[2].Element;ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];Argument[Qualifier];generated:taint | | System.Text;Encoding;false;GetBytes;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;taint | +| System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint | | System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;false;get_DecoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;false;get_EncoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;false;set_DecoderFallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;set_EncoderFallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint | | System.Text;Encoding;true;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char[]);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | @@ -2118,8 +7119,16 @@ | System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;true;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;Encoding;true;GetString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;EncodingProvider;true;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;EncodingProvider;true;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;SpanRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;SpanRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder+ChunkEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder+ChunkEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;StringBuilder;false;Append;(System.Boolean);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Byte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char);;Argument[Qualifier];ReturnValue;value | @@ -2197,6 +7206,32 @@ | System.Text;StringBuilder;false;AppendLine;();;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[Qualifier];ReturnValue;value | +| System.Text;StringBuilder;false;GetChunks;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Byte);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[]);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Decimal);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Double);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.SByte);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Single);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Remove;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Replace;(System.Char,System.Char,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | | System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];ReturnValue.Element;value | | System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];ReturnValue.Element;value | | System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];ReturnValue.Element;value | @@ -2204,11 +7239,15 @@ | System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue;taint | | System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;UTF7Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UTF7Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF7Encoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UTF7Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF7Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF7Encoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;UTF7Encoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;UTF7Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF8Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UTF8Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | @@ -2217,19 +7256,115 @@ | System.Text;UTF8Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF8Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF8Encoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;UTF8Encoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;UTF8Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF32Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UTF32Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF32Encoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UTF32Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF32Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF32Encoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;UTF32Encoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;UTF32Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UnicodeEncoding;false;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;UnicodeEncoding;false;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;UnicodeEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;BatchBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;BufferBlock;(System.Threading.Tasks.Dataflow.DataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObservable<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObserver<>;(System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];Argument[1];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Post<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput);;Argument[1];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;SendAsync<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;TryReceive<>;(System.Threading.Tasks.Dataflow.IReceivableSourceBlock,TOutput);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_NameFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_NameFormat;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;OfferMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,T,System.Threading.Tasks.Dataflow.ISourceBlock,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ReleaseReservation;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[Qualifier];Argument[1];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;get_Completion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;GetResult;(System.Int16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetException;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;ConcurrentExclusiveSchedulerPair;(System.Threading.Tasks.TaskScheduler,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ConcurrentScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ExclusiveScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelLoopResult;false;get_LowestBreakIteration;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ParallelOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;Task;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | @@ -2250,7 +7385,11 @@ | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Delay;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;Delay;(System.TimeSpan,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;FromCanceled;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;Run<>;(System.Func>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;Run<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | @@ -2259,12 +7398,19 @@ | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;WhenAll;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAll;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue.SyntheticField[m_configuredTaskAwaiter].SyntheticField[m_task_configured_task_awaitable];value | | System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | @@ -2320,6 +7466,19 @@ | System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;get_Result;();;Argument[Qualifier];ReturnValue;taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait;(System.IAsyncDisposable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait<>;(System.Collections.Generic.IAsyncEnumerable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCanceledException;false;TaskCanceledException;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCanceledException;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCompletionSource;false;TaskCompletionSource;(System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;TrySetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskExtensions;false;Unwrap;(System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskExtensions;false;Unwrap<>;(System.Threading.Tasks.Task>);;Argument[0];ReturnValue;generated:taint | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | @@ -2368,6 +7527,12 @@ | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskFactory;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | @@ -2404,6 +7569,86 @@ | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;UnobservedTaskExceptionEventArgs;(System.AggregateException);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;FromResult<>;(TResult);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.Int32,System.Threading.WaitHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Exception,System.Int32,System.Threading.WaitHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Int32,System.Threading.WaitHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;get_Mutex;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CancellationToken;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CancellationTokenSource;false;get_Token;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CompressedStack;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Threading;CountdownEvent;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;ExecutionContext;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Threading;HostExecutionContextManager;false;SetHostExecutionContext;(System.Threading.HostExecutionContext);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.Threading;ManualResetEventSlim;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;get_AvailableWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;Thread;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;Thread;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;ThreadExceptionEventArgs;false;ThreadExceptionEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;ThreadExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;WaitHandle;false;set_SafeWaitHandle;(Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;WaitHandle;true;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;WaitHandle;true;set_Handle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;WaitHandleExtensions;false;SetSafeWaitHandle;(System.Threading.WaitHandle,Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[1];Argument[0];generated:taint | +| System.Timers;Timer;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Timers;Timer;false;get_SynchronizingObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Timers;Timer;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Timers;Timer;false;set_SynchronizingObject;(System.ComponentModel.ISynchronizeInvoke);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;CommittableTransaction;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;CommittableTransaction;false;get_AsyncWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistDurable;(System.Guid,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;PromoteAndEnlistDurable;(System.Guid,System.Transactions.IPromotableSinglePhaseNotification,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;Rollback;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;SetDistributedTransactionIdentifier;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;get_PromoterType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;get_TransactionInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionEventArgs;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionInformation;false;get_DistributedIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionOptions;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionOptions;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.EnterpriseServicesInteropOption);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint | | System.Web.UI.WebControls;TextBox;false;get_Text;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Values;();;Argument[Qualifier];ReturnValue;taint | @@ -2411,6 +7656,8 @@ | System.Web;HttpServerUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlAttributeEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlAttributeEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | +| System.Web;HttpUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint | | System.Web;HttpUtility;false;HtmlEncode;(System.Object);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | @@ -2420,93 +7667,1326 @@ | System.Web;HttpUtility;false;UrlEncode;(System.Byte[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlPathEncode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantNodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantNodesAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;InDocumentOrder<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Nodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_NextAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_PreviousAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XCData;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XCData;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;XComment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XComment;false;XComment;(System.Xml.Linq.XComment);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XComment;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;AddFirst;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;AddFirst;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;CreateWriter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;DescendantNodes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Descendants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Descendants;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Element;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Elements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Elements;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Nodes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;get_FirstNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;get_LastNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XDocument;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XDocument;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDeclaration,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;get_Declaration;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;get_Root;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;set_Declaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.Xml.Linq.XDocumentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;AncestorsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;AncestorsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attribute;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attributes;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantNodesAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XElement;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetElementValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;get_FirstAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_LastAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XName;false;Get;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;Get;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;Ancestors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;Ancestors;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;CreateReader;(System.Xml.Linq.ReaderOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ElementsAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ElementsAfterSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;NodesAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ReadFrom;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ReplaceWith;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;ReplaceWith;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;get_NextNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;AddAnnotation;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XObject;false;Annotation;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotation<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotations;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotations<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.Xml.Linq.XProcessingInstruction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;set_Target;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XStreamingElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XText;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XText;false;XText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;XText;(System.Xml.Linq.XText);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XElement);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;ValidationEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;ValidationEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlAtomicValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlAtomicValue;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Elements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Includes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_TargetNamespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_TargetNamespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAll;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAny;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAny;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnyAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnyAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_RedefinedAttributeGroup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaChoice;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint | | System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaCollection;false;XmlSchemaCollection;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlSchemaComplexContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeUses;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeWildcard;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_ContentModel;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_ContentTypeParticle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_ContentModel;(System.Xml.Schema.XmlSchemaContentModel);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Language;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_ElementSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_ElementType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SubstitutionGroup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SubstitutionGroup;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;XmlSchemaException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_SourceSchemaObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_SchemaLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_Schema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_SchemaLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaFacet;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaFacet;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;set_Particle;(System.Xml.Schema.XmlSchemaGroupBase);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Fields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Selector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Selector;(System.Xml.Schema.XmlSchemaXPath);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInclude;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInclude;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInferenceException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_MemberType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaAttribute;(System.Xml.Schema.XmlSchemaAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaElement;(System.Xml.Schema.XmlSchemaElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaKeyref;false;get_Refer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaKeyref;false;set_Refer;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_Public;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_System;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_Public;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_System;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_Namespaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_Namespaces;(System.Xml.Serialization.XmlSerializerNamespaces);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_Parent;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_SourceUri;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current];value | | System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Remove;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObjectCollection;false;XmlSchemaObjectCollection;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObjectTable;false;get_Names;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObjectTable;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSequence;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;XmlSchemaSet;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_CompilationSettings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;set_CompilationSettings;(System.Xml.Schema.XmlSchemaCompilationSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleType;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleType;false;set_Content;(System.Xml.Schema.XmlSchemaSimpleTypeContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_BaseItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_BaseItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseMemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_MemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;set_MemberTypes;(System.Xml.XmlQualifiedName[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_BaseSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_BaseXmlSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_Datatype;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;SetSourceObject;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;get_SourceObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;AddSchema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;GetExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;GetExpectedParticles;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;Initialize;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;SkipToEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[3];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateWhitespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_LineInfoProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_ValidationEventSender;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_LineInfoProvider;(System.Xml.IXmlLineInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_SourceUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_ValidationEventSender;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaXPath;false;get_XPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaXPath;false;set_XPath;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;MakeUnique;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;ToArray;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;ImportContext;false;ImportContext;(System.Xml.Serialization.CodeIdentifiers,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;ImportContext;false;get_TypeIdentifiers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;ImportContext;false;get_Warnings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;SoapAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapEnum;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapAttribute;(System.Xml.Serialization.SoapAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapElement;(System.Xml.Serialization.SoapElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapEnum;(System.Xml.Serialization.SoapEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapType;(System.Xml.Serialization.SoapTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;SoapElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;SoapEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;SoapIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;set_MemberType;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Remove;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayAttribute;false;XmlArrayAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Remove;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_Attr;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_ExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAnyElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlArrayItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlChoiceIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlEnum;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlText;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlAnyAttribute;(System.Xml.Serialization.XmlAnyAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlArray;(System.Xml.Serialization.XmlArrayAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlAttribute;(System.Xml.Serialization.XmlAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlEnum;(System.Xml.Serialization.XmlEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlRoot;(System.Xml.Serialization.XmlRootAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlText;(System.Xml.Serialization.XmlTextAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlType;(System.Xml.Serialization.XmlTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;XmlChoiceIdentifierAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Remove;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementEventArgs;false;get_Element;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementEventArgs;false;get_ExpectedElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;XmlEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;XmlIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlMapping;false;SetKey;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_XsdElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMemberMapping;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMembersMapping;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_SoapAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_XmlAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_MemberType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_SoapAttributes;(System.Xml.Serialization.SoapAttributes);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_XmlAttributes;(System.Xml.Serialization.XmlAttributes);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;XmlRootAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaEnumerator;false;XmlSchemaEnumerator;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;XmlSchemaExporter;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaProviderAttribute;false;XmlSchemaProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaProviderAttribute;false;get_MethodName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;OnInsert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;OnSet;(System.Int32,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Collection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_CollectionItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Ids;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;set_Source;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+CollectionFixup);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+Fixup);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddTarget;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;CollapseWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;EnsureArrayIndex;(System.Array,System.Int32,System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;GetTarget;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadNullableString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReference;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.Boolean,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadTypedPrimitive;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ShrinkArray;(System.Array,System.Int32,System.Type,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToByteArrayBase64;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayBase64;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayHex;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[],System.String);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementEncoded;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementLiteral;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteId;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncoded;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteral;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteTypedPrimitive;(System.String,System.String,System.Object,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode,System.Object);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;set_Writer;(System.Xml.XmlWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;XmlSerializerVersionAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_ParentAssemblyId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_ParentAssemblyId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;XmlTextAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;XmlTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XDocumentExtensions;false;ToXPathNavigable;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathDocument;false;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathDocument;false;XPathDocument;(System.Xml.XmlReader,System.Xml.XmlSpace);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;XPathException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.XPath;XPathException;false;XPathException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;XPathException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XPathItem;true;ValueAs;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Compile;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;GetNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Select;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;SelectSingleNode;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;WriteSubtree;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_InnerXml;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_OuterXml;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNodeIterator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNodeIterator;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml.XPath;XPathNodeIterator;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Xml.Xsl;XslCompiledTransform;false;Load;(System.Reflection.MethodInfo,System.Byte[],System.Type[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;GetExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;GetParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;RemoveExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;RemoveParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltCompileException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Xsl;XsltException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Xsl;XsltException;false;XsltException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XsltException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Get;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;UniqueId;false;UniqueId;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;UniqueId;false;UniqueId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[1].Element;generated:taint | +| System.Xml;XmlAttribute;false;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttribute;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlAttribute;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlAttribute;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_OwnerDocument;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlAttribute;false;get_OwnerElement;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlAttribute;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_Prefix;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlAttribute;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlAttributeCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Remove;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.String,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlCDataSection;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCDataSection;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlCDataSection;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlCharacterData;false;XmlCharacterData;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlCharacterData;false;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCharacterData;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlCharacterData;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;true;AppendData;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;true;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCharacterData;true;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCharacterData;true;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlComment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlComment;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlComment;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlComment;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlConvert;false;DecodeName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeLocalName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyNMTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyPublicId;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyXmlChars;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetElementFromRow;(System.Data.DataRow);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetRowFromElement;(System.Xml.XmlElement);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;XmlDataDocument;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDeclaration;false;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDeclaration;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDeclaration;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDeclaration;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDeclaration;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionary;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[5];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateDictionaryReader;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadContentAsString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadElementContentAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadElementContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;GetAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;GetNonAtomizedNames;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadArray;(System.String,System.String,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsQualifiedName;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadElementContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryString;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateDictionaryWriter;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteBase64Async;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteNode;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteStartAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteQualifiedName;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteStartAttribute;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteString;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteTextNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteValue;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentFragment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateEntityReference;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];taint | +| System.Xml;XmlDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;XmlDocument;(System.Xml.XmlImplementation);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlDocument;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDocument;false;get_DocumentElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_Implementation;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDocument;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDocument;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDocument;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_OwnerDocument;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocument;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDocument;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocument;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentFragment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentFragment;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocumentFragment;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocumentFragment;false;XmlDocumentFragment;(System.Xml.XmlDocument);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Xml;XmlDocumentFragment;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentFragment;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentFragment;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentFragment;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentFragment;false;get_OwnerDocument;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentFragment;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDocumentType;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;get_Entities;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDocumentType;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentType;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentType;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlDocumentType;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlDocumentType;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttributeNode;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlElement;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlElement;false;get_Attributes;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlElement;false;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlElement;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | @@ -2519,6 +8999,7 @@ | System.Xml;XmlElement;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlElement;false;get_Prefix;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlElement;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlElement;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlEntity;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntity;false;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntity;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | @@ -2526,24 +9007,82 @@ | System.Xml;XmlEntity;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntity;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntity;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlEntity;false;get_NotationName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlEntity;false;get_OuterXml;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlEntity;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntity;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntityReference;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntityReference;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlEntityReference;false;XmlEntityReference;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlEntityReference;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntityReference;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntityReference;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntityReference;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntityReference;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlEntityReference;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlException;false;XmlException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlImplementation;false;CreateDocument;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlImplementation;false;XmlImplementation;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlLinkedNode;false;get_NextSibling;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlLinkedNode;false;get_PreviousSibling;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNamedNodeMap;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String);;Argument[Qualifier];ReturnValue;value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;value | +| System.Xml;XmlNamedNodeMap;false;Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNamespaceManager;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Xml;XmlNamespaceManager;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;XmlNamespaceManager;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlNamespaceManager;false;get_DefaultNamespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNode;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNode;false;SelectNodes;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectNodes;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;GetNamespaceOfPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;GetPrefixOfNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Xml;XmlNode;true;get_Attributes;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_ChildNodes;();;Argument[Qualifier];ReturnValue;taint | @@ -2552,6 +9091,8 @@ | System.Xml;XmlNode;true;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNode;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNode;true;get_LastChild;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_Name;();;Argument[Qualifier];ReturnValue;taint | @@ -2566,18 +9107,84 @@ | System.Xml;XmlNode;true;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_NewParent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_NewValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_Node;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_OldParent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_OldValue;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNodeList;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Xml;XmlNodeList;true;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;XmlNodeReader;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNotation;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_OuterXml;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNotation;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNotation;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[5];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[6];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[7];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[9];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_DocTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_NamespaceManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;set_BaseURI;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_DocTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_NamespaceManager;(System.Xml.XmlNamespaceManager);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_XmlLang;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlProcessingInstruction;false;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlProcessingInstruction;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlProcessingInstruction;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlProcessingInstruction;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlProcessingInstruction;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream,System.Xml.XmlReaderSettings,System.String);;Argument[0];ReturnValue;taint | @@ -2590,29 +9197,168 @@ | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.Xml.XmlReader,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | +| System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsDateTime;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsObject;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReaderSettings;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReaderSettings;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlReaderSettings;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlReaderSettings;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlSecureResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlSecureResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlSecureResolver;false;XmlSecureResolver;(System.Xml.XmlResolver,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlSecureResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlSignificantWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlSignificantWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlSignificantWhitespace;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlSignificantWhitespace;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlSignificantWhitespace;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlSignificantWhitespace;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlSignificantWhitespace;false;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlSignificantWhitespace;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlSignificantWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlText;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlText;false;SplitText;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlText;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlText;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlText;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlText;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlText;false;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlText;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;GetRemainder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.IO.TextReader,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextWriter;false;WriteName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;WriteNmToken;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;WriteQualifiedName;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;WriteStartAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextWriter;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlUrlResolver;false;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlUrlResolver;false;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlUrlResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlUrlResolver;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | | System.Xml;XmlWhitespace;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.String,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Text.StringBuilder,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeStringAsync;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteStartAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteStartAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteAttributes;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteAttributesAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNmToken;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNode;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNode;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteQualifiedName;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;get_IndentChars;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;get_NewLineChars;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;set_IndentChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;set_NewLineChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;AggregateException;false;AggregateException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;AggregateException;false;AggregateException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;AggregateException;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AggregateException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;AggregateException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AggregateException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AppDomain;false;ApplyPolicy;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;ArgumentException;false;ArgumentException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;ArgumentException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;ArgumentException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ArgumentException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentException;false;get_ParamName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.String,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentOutOfRangeException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ArgumentOutOfRangeException;false;get_ActualValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentOutOfRangeException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Array;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System;Array;false;AsReadOnly<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System;Array;false;CopyTo;(System.Array,System.Int64);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;Array;false;Fill<>;(T[],T);;Argument[1];Argument[0].Element;generated:taint | +| System;Array;false;Fill<>;(T[],T,System.Int32,System.Int32);;Argument[1];Argument[0].Element;generated:taint | | System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | | System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | | System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -2626,14 +9372,31 @@ | System;Array;false;Reverse<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System;Array;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System;Array;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System;ArraySegment<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ArraySegment<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System;ArraySegment<>;false;ArraySegment;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ArraySegment<>;false;ArraySegment;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | | System;ArraySegment<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ArraySegment<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System;ArraySegment<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;get_Array;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ArraySegment<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System;ArraySegment<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System;ArraySegment<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System;BadImageFormatException;false;BadImageFormatException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;BadImageFormatException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_FusionLog;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Boolean;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;Argument[1];taint | | System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;ReturnValue;taint | @@ -2966,6 +9729,61 @@ | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[1].Element;taint | | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[2];taint | | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;DBNull;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTime;false;GetDateTimeFormats;(System.Char,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value | +| System;DateTime;false;ToLocalTime;();;Argument[Qualifier];ReturnValue;generated:value | +| System;DateTime;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;DateTime;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTime;false;ToUniversalTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTimeOffset;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;DateTimeOffset;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;DateTimeOffset;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Decimal;false;ToDecimal;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value | +| System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[1];ReturnValue;generated:taint | +| System;Delegate;false;Combine;(System.Delegate[]);;Argument[0].Element;ReturnValue;generated:taint | +| System;Delegate;false;CreateDelegate;(System.Type,System.Reflection.MethodInfo,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System;Delegate;false;Delegate;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Delegate;false;DynamicInvoke;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System;Delegate;false;Remove;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;RemoveAll;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;DynamicInvokeImpl;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System;Delegate;true;GetInvocationList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;GetMethodImpl;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Double;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Double;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Double;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Enum;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System;Enum;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Environment;false;ExpandEnvironmentVariables;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Exception;false;Exception;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;Exception;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Exception;false;get_HelpLink;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_InnerException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_StackTrace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_TargetSite;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;set_HelpLink;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;FormattableString;false;CurrentCulture;(System.FormattableString);;Argument[0];ReturnValue;generated:taint | +| System;FormattableString;false;Invariant;(System.FormattableString);;Argument[0];ReturnValue;generated:taint | +| System;FormattableString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;FormattableString;false;ToString;(System.String,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Half;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Half;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | | System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles);;Argument[0];ReturnValue;taint | @@ -2979,16 +9797,115 @@ | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];Argument[1];taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];ReturnValue;taint | +| System;IntPtr;false;IntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint | +| System;IntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata,System.Threading.LazyThreadSafetyMode);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Lazy<>;false;Lazy;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Lazy<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System;Memory<>;false;Memory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;Memory<>;false;Memory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;Memory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Memory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Memory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Index);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Range);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Index);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Range);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingFieldException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MissingMemberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingMethodException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MulticastDelegate;false;CombineImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value | +| System;MulticastDelegate;false;GetInvocationList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MulticastDelegate;false;GetMethodImpl;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MulticastDelegate;false;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:taint | +| System;MulticastDelegate;false;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value | +| System;NotFiniteNumberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Nullable;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint | | System;Nullable<>;false;GetValueOrDefault;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[0];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;Nullable;(T);;Argument[0];ReturnValue.Property[System.Nullable<>.Value];value | +| System;Nullable<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Nullable<>;false;get_HasValue;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;taint | | System;Nullable<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System;ObjectDisposedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ObjectDisposedException;false;ObjectDisposedException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ObjectDisposedException;false;ObjectDisposedException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;ObjectDisposedException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ObjectDisposedException;false;get_ObjectName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_ServicePack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_VersionString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Exception,System.Threading.CancellationToken);;Argument[2];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Threading.CancellationToken);;Argument[1];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ReadOnlyMemory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlySpan<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeFieldHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeMethodHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeTypeHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;SequencePosition;false;GetObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;SequencePosition;false;SequencePosition;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Span<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Clone;();;Argument[Qualifier];ReturnValue;value | | System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint | @@ -3019,6 +9936,7 @@ | System;String;false;Concat;(System.String[]);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Copy;(System.String);;Argument[0];ReturnValue;value | +| System;String;false;EnumerateRunes;();;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[2];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];ReturnValue;taint | @@ -3076,6 +9994,9 @@ | System;String;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;taint | +| System;String;false;Replace;(System.String,System.String,System.Boolean,System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[1];ReturnValue;generated:taint | +| System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | | System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | | System;String;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue.Element;taint | @@ -3090,11 +10011,13 @@ | System;String;false;String;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;String;false;Substring;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | +| System;String;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;ToLower;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLower;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLowerInvariant;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToString;();;Argument[Qualifier];ReturnValue;value | | System;String;false;ToString;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;value | +| System;String;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;ToUpper;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToUpper;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToUpperInvariant;();;Argument[Qualifier];ReturnValue;taint | @@ -3107,6 +10030,58 @@ | System;String;false;TrimStart;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char[]);;Argument[Qualifier];ReturnValue;taint | +| System;StringNormalizationExtensions;false;Normalize;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;StringNormalizationExtensions;false;Normalize;(System.String,System.Text.NormalizationForm);;Argument[0];ReturnValue;generated:taint | +| System;TimeZone;true;ToLocalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZone;true;ToUniversalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DateEnd;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DateStart;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightDelta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionEnd;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionStart;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;CreateFixedDateRule;(System.DateTime,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;CreateFloatingDateRule;(System.DateTime,System.Int32,System.Int32,System.DayOfWeek);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo+TransitionTime;false;get_TimeOfDay;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeFromUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[5].Element;ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[5].Element;ReturnValue;generated:taint | +| System;TimeZoneInfo;false;FindSystemTimeZoneById;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo;false;GetUtcOffset;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;GetUtcOffset;(System.DateTimeOffset);;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_BaseUtcOffset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_DaylightName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_StandardName;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | @@ -3142,6 +10117,7 @@ | System;Tuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | | System;Tuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | | System;Tuple;false;Create<>;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | @@ -3149,6 +10125,13 @@ | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple<,,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item3];ReturnValue;value | @@ -3156,6 +10139,8 @@ | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item6];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Rest;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | @@ -3163,6 +10148,13 @@ | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple<,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item3];ReturnValue;value | @@ -3170,47 +10162,74 @@ | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item6];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple<,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item3];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item4];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple<,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item3];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item4];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple<,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item1];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item2];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item3];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item4];ReturnValue;value | +| System;Tuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple<,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item1];ReturnValue;value | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item2];ReturnValue;value | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item3];ReturnValue;value | +| System;Tuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | | System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple<,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item1];ReturnValue;value | | System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item2];ReturnValue;value | +| System;Tuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<>;false;Tuple;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<>.Item1];ReturnValue;value | | System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | | System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | @@ -3338,13 +10357,159 @@ | System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item1];Argument[1];value | | System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item2];Argument[2];value | | System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Argument[0].Property[System.Tuple<>.Item1];Argument[1];value | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetInterface;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMember;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMembers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetNestedTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;MakeGenericSignatureType;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System;Type;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;get_TypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;GetMember;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;get_GenericTypeArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeInitializationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TypeInitializationException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TypeLoadException;false;TypeLoadException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;TypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeLoadException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UIntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UIntPtr;false;UIntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint | +| System;UnhandledExceptionEventArgs;false;UnhandledExceptionEventArgs;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;UnhandledExceptionEventArgs;false;get_ExceptionObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;EscapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;EscapeString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;EscapeUriString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;GetComponents;(System.UriComponents,System.UriFormat);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;GetLeftPart;(System.UriPartial);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Uri;false;MakeRelative;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;MakeRelativeUri;(System.Uri);;Argument[0];ReturnValue;generated:taint | | System;Uri;false;ToString;();;Argument[Qualifier];ReturnValue;taint | +| System;Uri;false;TryCreate;(System.String,System.UriKind,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[1];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[1];ReturnValue;generated:taint | +| System;Uri;false;UnescapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;Uri;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | | System;Uri;false;Uri;(System.String);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.UriKind);;Argument[0];ReturnValue;taint | +| System;Uri;false;Uri;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;get_Authority;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_DnsSafeHost;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_IdnHost;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_LocalPath;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Uri;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_PathAndQuery;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_Query;();;Argument[Qualifier];ReturnValue;taint | +| System;Uri;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_UserInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;get_Fragment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Query;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;set_Fragment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Query;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Scheme;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;UriParser;false;Register;(System.UriParser,System.String,System.Int32);;Argument[1];Argument[0];generated:taint | +| System;UriParser;true;GetComponents;(System.Uri,System.UriComponents,System.UriFormat);;Argument[0];ReturnValue;generated:taint | +| System;UriParser;true;OnNewUri;();;Argument[Qualifier];ReturnValue;generated:value | +| System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[0];ReturnValue;generated:taint | +| System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[1];ReturnValue;generated:taint | +| System;UriTypeConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System;UriTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | @@ -3380,6 +10545,7 @@ | System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | | System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | | System;ValueTuple;false;Create<>;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | @@ -3394,6 +10560,7 @@ | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item6];ReturnValue;value | | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | @@ -3408,6 +10575,7 @@ | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item6];ReturnValue;value | | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | @@ -3420,6 +10588,7 @@ | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item4];ReturnValue;value | | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | @@ -3430,6 +10599,7 @@ | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item3];ReturnValue;value | | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item4];ReturnValue;value | | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | @@ -3438,15 +10608,18 @@ | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item2];ReturnValue;value | | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item3];ReturnValue;value | | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item1];ReturnValue;value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item2];ReturnValue;value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item3];ReturnValue;value | +| System;ValueTuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | | System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | | System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item1];ReturnValue;value | | System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item2];ReturnValue;value | +| System;ValueTuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | | System;ValueTuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<>.Item1];ReturnValue;value | diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.ql b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.ql index ab446617404..811a81a934c 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.ql +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.ql @@ -1,5 +1,5 @@ import shared.FlowSummaries private class IncludeAllSummarizedCallable extends IncludeSummarizedCallable { - IncludeAllSummarizedCallable() { this instanceof SummarizedCallable } + IncludeAllSummarizedCallable() { exists(this) } } diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected index d08b311114e..68fda845a4a 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected @@ -1,3 +1,31 @@ +| Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;BinaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Convert;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Type);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;GetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;Invoke;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeConstructor;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;InvokeMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Collections.Generic.IEnumerable,System.Type,System.Collections.Generic.IEnumerable);;Argument[4].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;IsEvent;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[1];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetIndex;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[2];ReturnValue;generated:taint | +| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;Extensions;false;Append;(System.Text.StringBuilder,Microsoft.Extensions.Primitives.StringSegment);;Argument[0];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringSegment;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer+Enumerator;false;Enumerator;(Microsoft.Extensions.Primitives.StringTokenizer);;Argument[0].Element;Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(Microsoft.Extensions.Primitives.StringSegment,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringTokenizer;false;StringTokenizer;(System.String,System.Char[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| Microsoft.Extensions.Primitives;StringValues+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Concat;(Microsoft.Extensions.Primitives.StringValues,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | @@ -56,6 +84,10 @@ | Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.Win32.SafeHandles;SafeFileHandle;false;SafeFileHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafePipeHandle;false;SafePipeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafeProcessHandle;false;SafeProcessHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| Microsoft.Win32.SafeHandles;SafeWaitHandle;false;SafeWaitHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | | Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | | Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | @@ -147,9 +179,74 @@ | Newtonsoft.Json;JsonSerializer;false;Serialize;(Newtonsoft.Json.JsonWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | +| System.Buffers;ArrayBufferWriter<>;false;GetMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ArrayBufferWriter<>;false;get_WrittenMemory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;BuffersExtensions;false;PositionOf<>;(System.Buffers.ReadOnlySequence,T);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;MemoryHandle;(System.Void*,System.Runtime.InteropServices.GCHandle,System.Buffers.IPinnable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Buffers;MemoryHandle;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;false;CreateMemory;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;MemoryManager<>;true;get_Memory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>+Enumerator;false;Enumerator;(System.Buffers.ReadOnlySequence<>);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;GetPosition;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[2];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;ReadOnlySequence;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int32,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64);;Argument[Qualifier];ReturnValue;generated:value | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.Int64,System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;Slice;(System.SequencePosition,System.SequencePosition);;Argument[1];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;TryGet;(System.SequencePosition,System.ReadOnlyMemory,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;ReadOnlySequence<>;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;SequenceReader;(System.Buffers.ReadOnlySequence);;Argument[0];Argument[Qualifier];generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadTo;(System.Buffers.ReadOnlySequence,T,T,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;TryReadToAny;(System.Buffers.ReadOnlySequence,System.ReadOnlySpan,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Buffers;SequenceReader<>;false;get_UnreadSequence;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;GeneratedCodeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Tool;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;GeneratedCodeAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;IndentedTextWriter;(System.IO.TextWriter,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.CodeDom.Compiler;IndentedTextWriter;false;get_InnerWriter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;BlockingCollection;(System.Collections.Concurrent.IProducerConsumerCollection,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.Int32,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;BlockingCollection<>;false;TryAdd;(T,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;ConcurrentBag<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryAdd;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentBag<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -158,11 +255,41 @@ | System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetOrAdd;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | | System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Concurrent;ConcurrentStack<>;false;ConcurrentStack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryPopRange;(T[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Collections.Concurrent;ConcurrentStack<>;false;TryTake;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;OrderablePartitioner<>;false;GetDynamicPartitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IEnumerable,System.Collections.Concurrent.EnumerablePartitionerOptions);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(System.Collections.Generic.IList,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Concurrent;Partitioner;false;Create<>;(TSource[],System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;GetValueOrDefault<,>;(System.Collections.Generic.IReadOnlyDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;Remove<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[0].Element;Argument[2];generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[1];Argument[0].Element;generated:taint | +| System.Collections.Generic;CollectionExtensions;false;TryAdd<,>;(System.Collections.Generic.IDictionary,TKey,TValue);;Argument[2];Argument[0].Element;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Entry;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+Enumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+KeyCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Dictionary<,>+ValueCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.Dictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -173,10 +300,19 @@ | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Int32,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | | System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;Dictionary<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;Dictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;Dictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;HashSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.HashSet<>+Enumerator.Current];value | +| System.Collections.Generic;HashSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;HashSet<>;false;HashSet;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;HashSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;HashSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -191,13 +327,57 @@ | System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair;false;Create<,>;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair<,>;false;Deconstruct;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;KeyValuePair<,>;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;KeyValuePair<,>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddAfter;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddBefore;(System.Collections.Generic.LinkedListNode,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddFirst;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(System.Collections.Generic.LinkedListNode);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;AddLast;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;LinkedList<>;false;Find;(T);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.LinkedList<>+Enumerator.Current];value | +| System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;LinkedList;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;Remove;(System.Collections.Generic.LinkedListNode);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_First;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_Last;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Generic;LinkedListNode<>;false;LinkedListNode;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Next;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Previous;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;LinkedListNode<>;false;set_Value;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;List<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Generic;List<>;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | @@ -207,13 +387,26 @@ | System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.List<>+Enumerator.Current];value | | System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;List;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Generic;List<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Generic;Queue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Queue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;Enqueue;(T);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Queue<>+Enumerator.Current];value | | System.Collections.Generic;Queue<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Queue<>;false;Queue;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Queue<>;false;TryDequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Queue<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;KeyCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;ValueCollection;(System.Collections.Generic.SortedDictionary<,>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current];value | @@ -222,26 +415,63 @@ | System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;TryGetValue;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedList<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;SortedList<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Generic;SortedList<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | | System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedSet<>+Enumerator.Current];value | +| System.Collections.Generic;SortedSet<>;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;GetViewBetween;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Generic;SortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;SortedSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;SortedSet<>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;SortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Generic;Stack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Stack<>+Enumerator.Current];value | | System.Collections.Generic;Stack<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Generic;Stack<>;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Stack<>;false;Push;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Generic;Stack<>;false;Stack;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Generic;Stack<>;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;TryPeek;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;TryPop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Generic;Stack<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(System.Collections.Immutable.ImmutableArray,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T,T,T,T);;Argument[3];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;Create<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | @@ -250,26 +480,135 @@ | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;MoveToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableArray<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;As<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;AsMemory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;CastArray<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;CastUp<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;InsertRange;(System.Int32,System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;OfType<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Collections.Immutable.ImmutableArray<>,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;Create<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;CreateRange<,>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;GetValueOrDefault<,>;(System.Collections.Immutable.IImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary;false;ToImmutableDictionary<,>;(System.Collections.Immutable.ImmutableDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableDictionary<,>;false;WithComparers;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableHashSet;false;Create<>;(System.Collections.Generic.IEqualityComparer,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;CreateRange<>;(System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet;false;ToImmutableHashSet<>;(System.Collections.Immutable.ImmutableHashSet+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;WithComparer;(System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableHashSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableHashSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableInterlocked;false;GetOrAdd<,>;(System.Collections.Immutable.ImmutableDictionary,TKey,TValue);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Remove<>;(System.Collections.Immutable.IImmutableList,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;RemoveRange<>;(System.Collections.Immutable.IImmutableList,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];Argument[0].Element;generated:taint | +| System.Collections.Immutable;ImmutableList;false;Replace<>;(System.Collections.Immutable.IImmutableList,T,T);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList;false;ToImmutableList<>;(System.Collections.Immutable.ImmutableList+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | @@ -281,8 +620,16 @@ | System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[2];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(System.Int32,System.Int32,T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[3];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[0];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;BinarySearch;(T,System.Collections.Generic.IComparer);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[]);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | | System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | @@ -293,66 +640,310 @@ | System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Remove;(T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableList<>;false;RemoveRange;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Replace;(T,T,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;Sort;(System.Int32,System.Int32,System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableList<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableQueue;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue;false;Dequeue<>;(System.Collections.Immutable.IImmutableQueue,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Dequeue;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableQueue<>;false;Enqueue;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableQueue<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;Create<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateBuilder<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable>);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer,System.Collections.Generic.IEnumerable>);;Argument[2].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;CreateRange<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[2];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary;false;ToImmutableSortedDictionary<,>;(System.Collections.Immutable.ImmutableSortedDictionary+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetValueOrDefault;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_ValueComparer;(System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Remove;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;RemoveRange;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItem;(TKey,TValue);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;SetItems;(System.Collections.Generic.IEnumerable>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;TryGetKey;(TKey,TKey);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;WithComparers;(System.Collections.Generic.IComparer,System.Collections.Generic.IEqualityComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_ValueComparer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(System.Collections.Generic.IComparer,T[]);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateBuilder<>;(System.Collections.Generic.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IComparer,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet;false;ToImmutableSortedSet<>;(System.Collections.Immutable.ImmutableSortedSet+Builder);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;IntersectWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;SymmetricExceptWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;ToImmutable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;UnionWith;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;set_KeyComparer;(System.Collections.Generic.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Except;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Intersect;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Remove;(T);;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;SymmetricExcept;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;ToBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;TryGetValue;(T,T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Union;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;WithComparer;(System.Collections.Generic.IComparer);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_KeyComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Max;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Min;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Immutable;ImmutableStack;false;Create<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;Create<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;CreateRange<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack;false;Pop<>;(System.Collections.Immutable.IImmutableStack,T);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableStack<>;false;Peek;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Pop;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[0];ReturnValue;generated:taint | +| System.Collections.Immutable;ImmutableStack<>;false;Push;(T);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;Collection<>;false;Collection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;Collection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;Collection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;InsertItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;KeyedCollection;(System.Collections.Generic.IEqualityComparer,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;SetItem;(System.Int32,TItem);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;TryGetValue;(TKey,TItem);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.ObjectModel;ObservableCollection<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;ReadOnlyCollection;(System.Collections.Generic.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;HybridDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;ListDictionary;false;ListDictionary;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;ListDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseAdd;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGet;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetAllValues;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseGetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;BaseSet;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;NameObjectCollectionBase;(System.Int32,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameObjectCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections.Specialized;NameObjectCollectionBase;true;get_Keys;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;NameValueCollection;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;NameValueCollection;false;Get;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;NameValueCollection;(System.Int32,System.Collections.Specialized.NameValueCollection);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;Set;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NameValueCollection;false;set_Item;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Collections.IList,System.Int32);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Collections.IList,System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Int32,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;NotifyCollectionChangedEventArgs;(System.Collections.Specialized.NotifyCollectionChangedAction,System.Object,System.Object,System.Int32);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_NewItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;NotifyCollectionChangedEventArgs;false;get_OldItems;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Specialized;OrderedDictionary;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Int32,System.Collections.IEqualityComparer);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;OrderedDictionary;false;OrderedDictionary;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections.Specialized;OrderedDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Specialized.StringEnumerator.Current];value | | System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | | System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Specialized;StringCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Collections.Specialized;StringDictionary;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;StringDictionary;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections.Specialized;StringEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;ArrayList;false;Adapter;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;ArrayList;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Collections;ArrayList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;CopyTo;(System.Array);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;ReadOnly;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;ArrayList;false;ReadOnly;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | | System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];ReturnValue.Element;value | | System.Collections;ArrayList;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;SetRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Collections;ArrayList;false;Synchronized;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;ArrayList;false;Synchronized;(System.Collections.IList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;ArrayList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;And;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;BitArray;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;BitArray;false;LeftShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Not;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Or;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;RightShift;(System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;Xor;(System.Collections.BitArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;BitArray;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;CollectionBase;false;Remove;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections;CollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;CollectionBase;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;CollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Comparer;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Collections;DictionaryBase;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;false;get_InnerHashtable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryBase;true;OnGet;(System.Object,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;Deconstruct;(System.Object,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;DictionaryEntry;(System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;DictionaryEntry;false;set_Key;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;DictionaryEntry;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;Hashtable;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Hashtable;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | @@ -365,6 +956,16 @@ | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Hashtable;(System.Int32,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[3];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;Synchronized;(System.Collections.Hashtable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Hashtable;false;get_EqualityComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;Hashtable;false;get_comparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;get_hcp;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Hashtable;false;set_comparer;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;Hashtable;false;set_hcp;(System.Collections.IHashCodeProvider);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | @@ -379,38 +980,250 @@ | System.Collections;IList;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Collections;Queue;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Queue;false;Dequeue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Queue;false;Enqueue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;Queue;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Queue;false;Queue;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections;Queue;false;Synchronized;(System.Collections.Queue);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Queue;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Collections;ReadOnlyCollectionBase;false;get_InnerList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;ReadOnlyCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;SortedList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;SortedList;false;GetByIndex;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;SortedList;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;SortedList;false;GetKey;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;SortedList;false;GetKeyList;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Collections;SortedList;false;GetValueList;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;SortedList;false;SetByIndex;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Collections;SortedList;false;SortedList;(System.Collections.IComparer);;Argument[0];Argument[Qualifier];generated:taint | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;Synchronized;(System.Collections.SortedList);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;SortedList;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Collections;Stack;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System.Collections;Stack;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | | System.Collections;Stack;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Stack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Collections;Stack;false;Stack;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Collections;Stack;false;Synchronized;(System.Collections.Stack);;Argument[0].Element;ReturnValue;generated:taint | +| System.Collections;Stack;false;ToArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Collections;Stack;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations.Schema;ColumnAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations.Schema;TableAttribute;false;set_Schema;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;AssociatedMetadataTypeTypeDescriptionProvider;false;AssociatedMetadataTypeTypeDescriptionProvider;(System.Type,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;CustomValidationAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateField;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetAutoGenerateFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;GetOrder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_GroupName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_Prompt;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;get_ShortName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_GroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_Prompt;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayAttribute;false;set_ShortName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayText;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;get_NullDisplayTextResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;DisplayFormatAttribute;false;set_NullDisplayTextResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;FormatErrorMessage;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;FileExtensionsAttribute;false;set_Extensions;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;FilterUIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;MetadataTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;MetadataTypeAttribute;false;get_MetadataClassType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;UIHintAttribute;false;get_ControlParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;get_ErrorMessageResourceType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessage;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;false;set_ErrorMessageResourceType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationAttribute;true;FormatErrorMessage;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.DataAnnotations;ValidationContext;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationException;false;ValidationException;(System.ComponentModel.DataAnnotations.ValidationResult,System.ComponentModel.DataAnnotations.ValidationAttribute,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.DataAnnotations;ValidationException;false;get_ValidationResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Append;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Pop;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;Push;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;ContextStack;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;DesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design.Serialization;RootDesignerSerializerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerCollection;false;DesignerCollection;(System.Collections.IList);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel.Design;DesignerCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService;false;CreateOptionCollection;(System.ComponentModel.Design.DesignerOptionService+DesignerOptionCollection,System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerOptionService;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;DesignerVerb;false;set_Description;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;DesignerVerbCollection;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Remove;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier];generated:taint | | System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;MenuCommand;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;ServiceContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel.Design;ServiceContainer;false;ServiceContainer;(System.IServiceProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ArrayConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;AsyncOperation;false;get_SynchronizationContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;AttributeCollection;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;FromExisting;(System.ComponentModel.AttributeCollection,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | | System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;AttributeCollection;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;AttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;BaseNumberConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;BindingList<>;false;InsertItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;BindingList<>;false;SetItem;(System.Int32,T);;Argument[Qualifier];Argument[1];generated:taint | +| System.ComponentModel;CategoryAttribute;false;CategoryAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;CategoryAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CharConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;CollectionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Component;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ComponentCollection;false;ComponentCollection;(System.ComponentModel.IComponent[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;ComponentCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ComponentCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;ComponentResourceManager;false;ApplyResources;(System.Object,System.String,System.Globalization.CultureInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Container;false;Add;(System.ComponentModel.IComponent,System.String);;Argument[1];Argument[0];generated:taint | +| System.ComponentModel;Container;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;Container;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;Container;false;get_Components;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ContainerFilterService;true;FilterComponents;(System.ComponentModel.ComponentCollection);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;CultureInfoConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;false;CustomTypeDescriptor;(System.ComponentModel.ICustomTypeDescriptor);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;CustomTypeDescriptor;true;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;DateTimeOffsetConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DecimalConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;DefaultValueAttribute;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;DefaultValueAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;DesignerAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EditorAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EnumConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;EventDescriptorCollection;(System.ComponentModel.EventDescriptor[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;EventDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;AddHandler;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;AddHandlers;(System.ComponentModel.EventHandlerList);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;get_Item;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;EventHandlerList;false;set_Item;(System.Object,System.Delegate);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;GuidConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;InstallerTypeAttribute;false;InstallerTypeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicFileLicenseProvider;false;GetKey;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;LicFileLicenseProvider;false;GetLicense;(System.ComponentModel.LicenseContext,System.Type,System.Object,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;LicenseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseException;false;LicenseException;(System.Type,System.Object,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;LicenseProviderAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;get_LicenseProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;LicenseProviderAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ListSortDescriptionCollection;false;ListSortDescriptionCollection;(System.ComponentModel.ListSortDescription[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;MarshalByValueComponent;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MarshalByValueComponent;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToDisplayString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Boolean,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MaskedTextProvider;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;FindMethod;(System.Type,System.String,System.Type[],System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;GetInvokee;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;GetSite;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.ComponentModel.MemberDescriptor,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;false;MemberDescriptor;(System.String,System.Attribute[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MemberDescriptor;true;CreateAttributeCollection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;FillAttributes;(System.Collections.IList);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.ComponentModel;MemberDescriptor;true;GetInvocationTarget;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_AttributeArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;MemberDescriptor;true;set_AttributeArray;(System.Attribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;MultilineStringConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NestedContainer;false;CreateSite;(System.ComponentModel.IComponent,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;NestedContainer;false;GetService;(System.Type);;Argument[Qualifier];ReturnValue;generated:value | +| System.ComponentModel;NullableConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;NullableConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;ProgressChangedEventArgs;false;ProgressChangedEventArgs;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.ComponentModel;ProgressChangedEventArgs;false;get_UserState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;false;GetValueChangedHandler;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyDescriptor;true;GetEditor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptor;true;get_Converter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Argument[Qualifier].Element;value | @@ -423,6 +1236,12 @@ | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;PropertyDescriptorCollection;false;Sort;(System.String[],System.Collections.IComparer);;Argument[Qualifier];ReturnValue;generated:taint | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | @@ -431,27 +1250,225 @@ | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.String,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyTabAttribute;false;PropertyTabAttribute;(System.Type,System.ComponentModel.PropertyTabScope);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;PropertyTabAttribute;false;get_TabClasses;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ReferenceConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;ReferenceConverter;false;ReferenceConverter;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;RunWorkerCompletedEventArgs;false;RunWorkerCompletedEventArgs;(System.Object,System.Exception,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;RunWorkerCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;StringConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TimeSpanConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;ToolboxItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemAttribute;false;get_ToolboxItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;ToolboxItemFilterAttribute;false;get_TypeId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;StandardValuesCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFrom;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromInvariantString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.ComponentModel.ITypeDescriptorContext,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertFromString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertTo;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToInvariantString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;ConvertToString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetProperties;(System.ComponentModel.ITypeDescriptorContext,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetProperties;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;GetStandardValues;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeConverter;false;SortProperties;(System.ComponentModel.PropertyDescriptorCollection,System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;GetTypeDescriptor;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;false;TypeDescriptionProvider;(System.ComponentModel.TypeDescriptionProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetExtendedTypeDescriptor;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetReflectionType;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetRuntimeType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptionProvider;true;GetTypeDescriptor;(System.Type,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Object,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;AddAttributes;(System.Type,System.Attribute[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.ComponentModel.EventDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateEvent;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.ComponentModel.PropertyDescriptor,System.Attribute[]);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;CreateProperty;(System.Type,System.String,System.Type,System.Attribute[]);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetAssociation;(System.Type,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetFullComponentName;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetProvider;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeDescriptor;false;GetReflectionType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;GetStandardValues;(System.ComponentModel.ITypeDescriptorContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.ComponentModel;TypeListConverter;false;TypeListConverter;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.ComponentModel;VersionConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.ComponentModel;WarningException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Win32Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.ComponentModel;Win32Exception;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataAdapter;false;get_TableMappings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;DataColumnMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;GetDataColumnBySchemaAction;(System.String,System.String,System.Data.DataTable,System.Type,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;get_DataSetColumn;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;get_SourceColumn;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMapping;false;set_DataSetColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMapping;false;set_SourceColumn;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;GetByDataSetColumn;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetColumnMappingBySchemaAction;(System.Data.Common.DataColumnMappingCollection,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataColumnMappingCollection;false;GetDataColumn;(System.Data.Common.DataColumnMappingCollection,System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[3];ReturnValue;generated:taint | | System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMapping;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;DataTableMapping;(System.String,System.String,System.Data.Common.DataColumnMapping[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetColumnMappingBySchemaAction;(System.String,System.Data.MissingMappingAction);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataColumn;(System.String,System.Type,System.Data.DataTable,System.Data.MissingMappingAction,System.Data.MissingSchemaAction);;Argument[2];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;GetDataTableBySchemaAction;(System.Data.DataSet,System.Data.MissingSchemaAction);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_ColumnMappings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_DataSetTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;get_SourceTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMapping;false;set_DataSetTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMapping;false;set_SourceTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataTableMappingCollection;false;GetByDataSetTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DataTableMappingCollection;false;GetTableMappingBySchemaAction;(System.Data.Common.DataTableMappingCollection,System.String,System.String,System.Data.MissingMappingAction);;Argument[2];ReturnValue;generated:taint | | System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | | System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbCommand;false;ExecuteReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReader;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;ExecuteReaderAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;false;set_Connection;(System.Data.Common.DbConnection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Connection;(System.Data.IDbConnection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Transaction;(System.Data.Common.DbTransaction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;false;set_Transaction;(System.Data.IDbTransaction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommand;true;ExecuteDbDataReaderAsync;(System.Data.CommandBehavior,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommand;true;PrepareAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetDeleteCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetInsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetInsertCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;GetUpdateCommand;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;RowUpdatingHandler;(System.Data.Common.RowUpdatingEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.Common;DbCommandBuilder;false;get_DataAdapter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;false;set_DataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;InitializeCommand;(System.Data.Common.DbCommand);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_CatalogSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_QuotePrefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_QuoteSuffix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;get_SchemaSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_CatalogSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_QuotePrefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_QuoteSuffix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbCommandBuilder;true;set_SchemaSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbConnection;false;CreateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnection;true;ChangeDatabaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbConnection;true;OpenAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[1];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String);;Argument[2];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[1];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;AppendKeyValuePair;(System.Text.StringBuilder,System.String,System.String,System.Boolean);;Argument[2];Argument[0];generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetProperties;(System.Attribute[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data.Common;DbConnectionStringBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbConnectionStringBuilder;false;get_ConnectionString;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Data.Common;DbConnectionStringBuilder;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbDataAdapter;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;DbDataAdapter;(System.Data.Common.DbDataAdapter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;get_DeleteCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_InsertCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_SelectCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;get_UpdateCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_DeleteCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_InsertCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_SelectCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.Common.DbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;false;set_UpdateCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatedEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbDataAdapter;true;CreateRowUpdatingEvent;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;false;GetFieldValueAsync<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetFieldValue<>;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetFieldValueAsync<>;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetProviderSpecificValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetProviderSpecificValues;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;DbDataReader;true;GetSchemaTableAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataReader;true;GetTextReader;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbDataRecord;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbEnumerator;false;DbEnumerator;(System.Data.IDataReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;DbEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value | @@ -459,29 +1476,352 @@ | System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbTransaction;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;CommitAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;ReleaseAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;RollbackAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;RollbackAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Data.Common;DbTransaction;true;SaveAsync;(System.String,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;RowUpdatedEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatedEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;RowUpdatingEventArgs;(System.Data.DataRow,System.Data.IDbCommand,System.Data.StatementType,System.Data.Common.DataTableMapping);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_BaseCommand;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Command;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;get_TableMapping;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_Command;(System.Data.IDbCommand);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.Common;RowUpdatingEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;SqlBinary;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;ToSqlGuid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBinary;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlBinary;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;Read;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[1].Element;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;SqlBytes;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;Write;(System.Int64,System.Byte[],System.Int32,System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlBytes;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;get_Stream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlBytes;false;set_Stream;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlChars;false;SqlChars;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlChars;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlChars;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Abs;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;AdjustScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Ceiling;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;ConvertToPrecScale;(System.Data.SqlTypes.SqlDecimal,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Floor;(System.Data.SqlTypes.SqlDecimal);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Round;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlDecimal;false;Truncate;(System.Data.SqlTypes.SqlDecimal,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlGuid;false;SqlGuid;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlGuid;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlGuid;false;ToSqlBinary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Add;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[0];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;Concat;(System.Data.SqlTypes.SqlString,System.Data.SqlTypes.SqlString);;Argument[1];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;GetNonUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;GetUnicodeBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;SqlString;(System.Int32,System.Data.SqlTypes.SqlCompareOptions,System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;SqlString;(System.String,System.Int32,System.Data.SqlTypes.SqlCompareOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data.SqlTypes;SqlString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;WriteXml;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data.SqlTypes;SqlString;false;get_CompareInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data.SqlTypes;SqlXml;false;SqlXml;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;Constraint;false;SetDataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;Constraint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;get_ConstraintName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;get__DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;Constraint;true;set_ConstraintName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ConstraintCollection;false;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];ReturnValue;generated:taint | | System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;ConstraintCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ConstraintCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data;DBConcurrencyException;false;CopyToRows;(System.Data.DataRow[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Data;DBConcurrencyException;false;DBConcurrencyException;(System.String,System.Exception,System.Data.DataRow[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data;DBConcurrencyException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DBConcurrencyException;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DBConcurrencyException;false;set_Row;(System.Data.DataRow);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;DataColumn;(System.String,System.Type,System.String,System.Data.MappingType);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Caption;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_ColumnName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumn;false;set_Caption;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_ColumnName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_DataType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_DefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Expression;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumn;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataColumnChangeEventArgs;false;DataColumnChangeEventArgs;(System.Data.DataRow,System.Data.DataColumn,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataColumnChangeEventArgs;false;get_Column;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;Add;(System.String,System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataColumnCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataColumnCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetDateTime;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetFieldValue<>;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetFieldValueAsync<>;(System.Data.Common.DbDataReader,System.String,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetGuid;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetProviderSpecificValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetString;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetTextReader;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataReaderExtensions;false;GetValue;(System.Data.Common.DbDataReader,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[6].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;DataRelation;(System.String,System.String,System.String,System.String[],System.String[],System.Boolean);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Data;DataRelation;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ChildColumns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ChildKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ParentColumns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_ParentKeyConstraint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;get_RelationName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelation;false;set_RelationName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;false;Remove;(System.Data.DataRelation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn,System.Data.DataColumn,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRelationCollection;true;Add;(System.String,System.Data.DataColumn[],System.Data.DataColumn[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataRow;false;DataRow;(System.Data.DataRowBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetChildRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.Data.DataRelation,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;GetParentRows;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;SetNull;(System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;SetParentRow;(System.Data.DataRow,System.Data.DataRelation);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;get_Item;(System.Data.DataColumn);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Data.DataColumn,System.Data.DataRowVersion);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.Int32,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Item;(System.String,System.Data.DataRowVersion);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_ItemArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_RowError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRow;false;set_Item;(System.Data.DataColumn,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataRow;false;set_RowError;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Data;DataRowCollection;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataRowCollection;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataRowCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowExtensions;false;SetField<>;(System.Data.DataRow,System.Data.DataColumn,T);;Argument[1];Argument[0];generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.Data.DataRelation,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;CreateChildView;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;GetPropertyOwner;(System.ComponentModel.PropertyDescriptor);;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataRowView;false;get_DataView;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataRowView;false;get_Row;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;CreateDataReader;(System.Data.DataTable[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Data;DataSet;false;DataSet;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;DataSet;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DataSet;false;get_DataSetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_DefaultViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Relations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;get_Tables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataSet;false;set_DataSetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataSet;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;CreateDataReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;DataTable;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;DataTable;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;DataTable;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;GetChanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetChanges;(System.Data.DataRowState);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetErrors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;LoadDataRow;(System.Object[],System.Data.LoadOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRow;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRowArray;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;NewRowFromBuilder;(System.Data.DataRowBuilder);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataTable;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ChildRelations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DefaultView;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_DisplayExpression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ExtendedProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Locale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_ParentRelations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Rows;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;get_TableName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTable;false;set_Locale;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_PrimaryKey;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTable;false;set_TableName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTableCollection;false;Add;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Argument[Qualifier].Element;value | | System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataTableCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableCollection;false;get_List;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableExtensions;false;AsEnumerable;(System.Data.DataTable);;Argument[0];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataTableReader;false;DataTableReader;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Data;DataTableReader;false;GetDateTime;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetGuid;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetSchemaTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;GetValue;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataTableReader;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;AddNew;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ApplySort;(System.ComponentModel.PropertyDescriptor,System.ComponentModel.ListSortDirection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;DataView;(System.Data.DataTable,System.String,System.String,System.Data.DataViewRowState);;Argument[2];Argument[Qualifier];generated:taint | | System.Data;DataView;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;DataView;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;FindRows;(System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;FindRows;(System.Object[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;GetItemProperties;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;ToTable;(System.String,System.Boolean,System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;DataView;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataView;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataView;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataView;false;set_Table;(System.Data.DataTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataViewManager;false;CreateDataView;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewManager;false;GetListName;(System.ComponentModel.PropertyDescriptor[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewManager;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewManager;false;get_DataViewSettings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewManager;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataViewManager;false;set_DataSet;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataViewSetting;false;get_DataViewManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_RowFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_Sort;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;get_Table;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSetting;false;set_RowFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;DataViewSetting;false;set_Sort;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataViewSettingCollection;false;get_Item;(System.Data.DataTable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;DataViewSettingCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[0];Argument[1];generated:taint | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Data.DataTable,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint | +| System.Data;DataViewSettingCollection;false;set_Item;(System.Int32,System.Data.DataViewSetting);;Argument[Qualifier];Argument[1];generated:taint | | System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Argument[0].Element;ReturnValue.Element;value | | System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | @@ -503,13 +1843,34 @@ | System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | | System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;FillErrorEventArgs;false;FillErrorEventArgs;(System.Data.DataTable,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;FillErrorEventArgs;false;get_DataTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;get_Errors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;FillErrorEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.Data.DataColumn[],System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[1];Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;ForeignKeyConstraint;(System.String,System.String,System.String[],System.String[],System.Data.AcceptRejectRule,System.Data.Rule,System.Data.Rule);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Data;ForeignKeyConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Data;ForeignKeyConstraint;false;get_RelatedColumns;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data;IDataParameterCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Data;ITableMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;InternalDataCollectionBase;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Data;PropertyCollection;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBase<>;false;Cast<>;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Argument[0].Element;ReturnValue.Element;value | | System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Argument[0].Element;ReturnValue;value | | System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -524,14 +1885,215 @@ | System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | | System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.Data.DataColumn[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;UniqueConstraint;(System.String,System.String[],System.Boolean);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Data;UniqueConstraint;false;get_Columns;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractClassAttribute;false;ContractClassAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractClassAttribute;false;get_TypeContainingContracts;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractClassForAttribute;false;ContractClassForAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractClassForAttribute;false;get_TypeContractsAreFor;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;ContractFailedEventArgs;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[3];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Condition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractFailedEventArgs;false;get_OriginalException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;ContractOptionAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Category;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Setting;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractOptionAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;ContractPublicPropertyNameAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Contracts;ContractPublicPropertyNameAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;get_DisplayUnits;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;DiagnosticCounter;false;set_DisplayUnits;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;DisableEvents;(System.Diagnostics.Tracing.EventSource);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventListener;false;EnableEvents;(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords,System.Collections.Generic.IDictionary);;Argument[Qualifier];Argument[0];generated:taint | +| System.Diagnostics.Tracing;EventSource;false;EventSource;(System.Diagnostics.Tracing.EventSourceSettings,System.String[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GenerateManifest;(System.Type,System.String,System.Diagnostics.Tracing.EventManifestOptions);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GetName;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;GetTrait;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_ConstructionException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_Guid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_ActivityId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_EventName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_PayloadNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics.Tracing;EventWrittenEventArgs;false;get_RelatedActivityId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;AddBaggage;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddEvent;(System.Diagnostics.ActivityEvent);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;AddTag;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;SetEndTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetIdFormat;(System.Diagnostics.ActivityIdFormat);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.Diagnostics.ActivityTraceId,System.Diagnostics.ActivitySpanId,System.Diagnostics.ActivityTraceFlags);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;SetParentId;(System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetStartTime;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;SetTag;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;Start;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Diagnostics;Activity;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Events;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_Links;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_ParentId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_ParentSpanId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_RootId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_SpanId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TagObjects;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TraceId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;get_TraceStateString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Activity;false;set_DisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Activity;false;set_TraceStateString;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ActivityCreationOptions<>;false;get_SamplingTags;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySource;false;StartActivity;(System.String,System.Diagnostics.ActivityKind,System.String,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEnumerable,System.DateTimeOffset);;Argument[2];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySpanId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivitySpanId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivityTagsCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current];value | +| System.Diagnostics;ActivityTagsCollection;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivityTraceId;false;ToHexString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ActivityTraceId;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;CorrelationManager;false;get_LogicalOperationStack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DataReceivedEventArgs;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerDisplayAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerDisplayAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DebuggerTypeProxyAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerTypeProxyAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DebuggerVisualizerAttribute;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DebuggerVisualizerAttribute;false;set_Target;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DefaultTraceListener;false;get_LogFileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DefaultTraceListener;false;set_LogFileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DelimitedListTraceListener;false;get_Delimiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DelimitedListTraceListener;false;set_Delimiter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;DiagnosticListener;false;Subscribe;(System.IObserver>);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;DiagnosticSource;false;StartActivity;(System.Diagnostics.Activity,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;GetVersionInfo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_Comments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_CompanyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_FileVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_InternalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_LegalCopyright;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_LegalTrademarks;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_OriginalFilename;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_PrivateBuild;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_ProductName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_ProductVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;FileVersionInfo;false;get_SpecialBuild;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;GetProcessById;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;GetProcesses;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;Start;(System.Diagnostics.ProcessStartInfo);;Argument[0];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_ExitTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MachineName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MainModule;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MaxWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_MinWorkingSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Modules;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_ProcessorAffinity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardInput;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StandardOutput;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StartInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_StartTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;get_Threads;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Process;false;set_ProcessorAffinity;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Process;false;set_StartInfo;(System.Diagnostics.ProcessStartInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessModule;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessModule;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessModule;false;get_ModuleName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessModuleCollection;false;ProcessModuleCollection;(System.Diagnostics.ProcessModule[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessModuleCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;ProcessStartInfo;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Environment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_EnvironmentVariables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_Verb;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;get_WorkingDirectory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_Arguments;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_FileName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_Verb;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessStartInfo;false;set_WorkingDirectory;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThread;false;get_StartAddress;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Argument[Qualifier].Element;value | | System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;Insert;(System.Int32,System.Diagnostics.ProcessThread);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThreadCollection;false;ProcessThreadCollection;(System.Diagnostics.ProcessThread[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Diagnostics;ProcessThreadCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SourceFilter;false;SourceFilter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SourceFilter;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SourceFilter;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;GetFileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackFrame;false;GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;StackFrame;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackFrame;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackTrace;false;GetFrame;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;StackTrace;false;StackTrace;(System.Diagnostics.StackFrame);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;StackTrace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;Switch;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Diagnostics;Switch;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_Description;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;Switch;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;SwitchAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;get_SwitchName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchAttribute;false;get_SwitchType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchAttribute;false;set_SwitchName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchAttribute;false;set_SwitchType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;SwitchLevelAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;get_SwitchLevelType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;SwitchLevelAttribute;false;set_SwitchLevelType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.IO.TextWriter,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;TextWriterTraceListener;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TextWriterTraceListener;false;set_Writer;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceEventCache;false;get_Callstack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceEventCache;false;get_DateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;TraceListener;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceListener;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;false;set_Filter;(System.Diagnostics.TraceFilter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceListener;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceListener;true;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Argument[0].Element;Argument[Qualifier].Element;value | @@ -539,19 +2101,364 @@ | System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | | System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | | System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceSource;false;TraceSource;(System.String,System.Diagnostics.SourceLevels);;Argument[0];Argument[Qualifier];generated:taint | +| System.Diagnostics;TraceSource;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Listeners;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;get_Switch;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Diagnostics;TraceSource;false;set_Switch;(System.Diagnostics.SourceSwitch);;Argument[0];Argument[Qualifier];generated:taint | +| System.Drawing;Color;false;FromName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;Color;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Drawing;Color;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;ColorConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;ColorTranslator;false;FromHtml;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;ColorTranslator;false;ToHtml;(System.Drawing.Color);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;PointConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;Rectangle;false;Inflate;(System.Drawing.Rectangle,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;RectangleConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;RectangleF;false;Inflate;(System.Drawing.RectangleF,System.Single,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;SizeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Drawing;SizeFConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetExpressionRestriction;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetInstanceRestriction;(System.Linq.Expressions.Expression,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;GetTypeRestriction;(System.Linq.Expressions.Expression,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Dynamic;BindingRestrictions;false;Merge;(System.Dynamic.BindingRestrictions);;Argument[Qualifier];ReturnValue;generated:value | +| System.Dynamic;BindingRestrictions;false;ToExpression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Dynamic;DynamicMetaObject;false;Create;(System.Object,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Dynamic;DynamicMetaObject;false;DynamicMetaObject;(System.Linq.Expressions.Expression,System.Dynamic.BindingRestrictions,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Dynamic;DynamicMetaObject;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Dynamic;ExpandoObject;false;TryGetValue;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Formats.Asn1;AsnReader;false;AsnReader;(System.ReadOnlyMemory,System.Formats.Asn1.AsnEncodingRules,System.Formats.Asn1.AsnReaderOptions);;Argument[2];Argument[Qualifier];generated:taint | +| System.Formats.Asn1;AsnReader;false;PeekContentBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;PeekEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadEncodedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadEnumeratedBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadIntegerBytes;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Boolean,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;ReadSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveBitString;(System.Int32,System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveCharacterStringBytes;(System.Formats.Asn1.Asn1Tag,System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnReader;false;TryReadPrimitiveOctetString;(System.ReadOnlyMemory,System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushOctetString;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushSequence;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Formats.Asn1;AsnWriter;false;PushSetOf;(System.Nullable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;Calendar;false;ReadOnly;(System.Globalization.Calendar);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;GetSortKey;(System.String,System.Globalization.CompareOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CompareInfo;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;CultureInfo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureInfo;false;GetConsoleFallbackUICulture;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfo;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetCultureInfoByIetfLanguageTag;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;ReadOnly;(System.Globalization.CultureInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_EnglishName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_NativeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_NumberFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;get_TextInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureInfo;false;set_DateTimeFormat;(System.Globalization.DateTimeFormatInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureInfo;false;set_NumberFormat;(System.Globalization.NumberFormatInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;CultureNotFoundException;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;CultureNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Globalization;CultureNotFoundException;false;get_InvalidCultureId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureNotFoundException;false;get_InvalidCultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;CultureNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAbbreviatedMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetAllDateTimePatterns;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetEraName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetMonthName;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;GetShortestDayName;(System.DayOfWeek);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;ReadOnly;(System.Globalization.DateTimeFormatInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;SetAllDateTimePatterns;(System.String[],System.Char);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_AMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_Calendar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_DateSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_MonthDayPattern;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_PMDesignator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;get_TimeSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_AbbreviatedMonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_Calendar;(System.Globalization.Calendar);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_DateSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_DayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_FullDateTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_LongDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_LongTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthDayPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthGenitiveNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_MonthNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_PMDesignator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortDatePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortTimePattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_ShortestDayNames;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_TimeSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DateTimeFormatInfo;false;set_YearMonthPattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;DaylightTime;(System.DateTime,System.DateTime,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Globalization;DaylightTime;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DaylightTime;false;get_End;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;DaylightTime;false;get_Start;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;GlobalizationExtensions;false;GetStringComparer;(System.Globalization.CompareInfo,System.Globalization.CompareOptions);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetAscii;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;IdnMapping;false;GetUnicode;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;GetFormat;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;GetInstance;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;ReadOnly;(System.Globalization.NumberFormatInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencyDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencyGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_CurrencySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NaNSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NegativeInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NegativeSign;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NumberDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_NumberGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PerMilleSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentDecimalSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentGroupSeparator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PercentSymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PositiveInfinitySymbol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;get_PositiveSign;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencyDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencyGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_CurrencySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NaNSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NativeDigits;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NegativeInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NegativeSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NumberDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_NumberGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PerMilleSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentDecimalSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentGroupSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PercentSymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PositiveInfinitySymbol;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;NumberFormatInfo;false;set_PositiveSign;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;RegionInfo;false;RegionInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;RegionInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;RegionInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;RegionInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortKey;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortKey;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;SortVersion;false;SortVersion;(System.Int32,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Globalization;SortVersion;false;get_SortId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetNextTextElement;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetNextTextElement;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;GetTextElementEnumerator;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;StringInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;SubstringByTextElements;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;get_String;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;StringInfo;false;set_String;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Globalization;TextElementEnumerator;false;GetTextElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ReadOnly;(System.Globalization.TextInfo);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToLower;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToTitleCase;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;ToUpper;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Globalization;TextInfo;false;set_ListSeparator;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;BrotliStream;false;BrotliStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;BrotliStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;BrotliStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];ReturnValue;taint | +| System.IO.Compression;DeflateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;DeflateStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;GZipStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;GZipStream;false;GZipStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;GZipStream;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;CreateEntry;(System.String,System.IO.Compression.CompressionLevel);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipArchive;false;ZipArchive;(System.IO.Stream,System.IO.Compression.ZipArchiveMode,System.Boolean,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipArchive;false;get_Entries;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;Open;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_Archive;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_LastWriteTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Compression;ZipArchiveEntry;false;set_LastWriteTime;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Compression;ZipFile;false;Open;(System.String,System.IO.Compression.ZipArchiveMode,System.Text.Encoding);;Argument[2];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;generated:taint | +| System.IO.Compression;ZipFileExtensions;false;CreateEntryFromFile;(System.IO.Compression.ZipArchive,System.String,System.String,System.IO.Compression.CompressionLevel);;Argument[2];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;ToFileSystemInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;ToSpecifiedFullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEntry;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemEnumerator<>;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Enumeration;FileSystemName;false;TranslateWin32Expression;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_ApplicationIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_AssemblyIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorage;false;get_DomainIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedFile;false;CreateFromFile;(System.IO.FileStream,System.String,System.Int64,System.IO.MemoryMappedFiles.MemoryMappedFileAccess,System.IO.HandleInheritability,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedFile;false;get_SafeMemoryMappedFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedViewAccessor;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.MemoryMappedFiles;MemoryMappedViewStream;false;get_SafeMemoryMappedViewHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;AnonymousPipeClientStream;false;AnonymousPipeClientStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;AnonymousPipeServerStream;(System.IO.Pipes.PipeDirection,Microsoft.Win32.SafeHandles.SafePipeHandle,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO.Pipes;AnonymousPipeServerStream;false;get_ClientSafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;ConnectAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeClientStream;false;NamedPipeClientStream;(System.String,System.String,System.IO.Pipes.PipeDirection,System.IO.Pipes.PipeOptions,System.Security.Principal.TokenImpersonationLevel,System.IO.HandleInheritability);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeServerStream;false;NamedPipeServerStream;(System.IO.Pipes.PipeDirection,System.Boolean,System.Boolean,Microsoft.Win32.SafeHandles.SafePipeHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO.Pipes;NamedPipeServerStream;false;WaitForConnectionAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO.Pipes;PipeStream;false;InitializeHandle;(Microsoft.Win32.SafeHandles.SafePipeHandle,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO.Pipes;PipeStream;false;get_SafePipeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;BinaryReader;false;BinaryReader;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;BinaryReader;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.IO;BinaryReader;false;ReadBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;BinaryWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BinaryWriter;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;BinaryWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;BufferedStream;false;BufferedStream;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;BufferedStream;false;get_UnderlyingStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;Directory;false;CreateDirectory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;Directory;false;GetParent;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;CreateSubdirectory;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;DirectoryInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateDirectories;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFileSystemInfos;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[1];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.EnumerationOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;EnumerateFiles;(System.String,System.IO.SearchOption);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DirectoryInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DirectoryInfo;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;DriveInfo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;DriveInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_RootDirectory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;DriveInfo;false;get_VolumeLabel;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;ErrorEventArgs;false;ErrorEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;ErrorEventArgs;false;GetException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;AppendAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.IO;File;false;ReadLines;(System.String,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllBytesAsync;(System.String,System.Byte[],System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllLinesAsync;(System.String,System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Text.Encoding,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.IO;File;false;WriteAllTextAsync;(System.String,System.String,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.IO;FileInfo;false;CopyTo;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileInfo;false;CopyTo;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileInfo;false;MoveTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileInfo;false;MoveTo;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileInfo;false;get_Directory;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileInfo;false;get_DirectoryName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;FileLoadException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileNotFoundException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;FileNotFoundException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileNotFoundException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;FileStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;FileStream;false;get_SafeFileHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;FileSystemEventArgs;false;FileSystemEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;FileSystemEventArgs;false;get_FullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;false;get_Extension;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;true;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemInfo;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;FileSystemWatcher;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;get_Filter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Filters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;FileSystemWatcher;false;set_Filter;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;FileSystemWatcher;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;MemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;MemoryStream;false;GetBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[]);;Argument[0];ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | +| System.IO;MemoryStream;false;TryGetBuffer;(System.ArraySegment);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;MemoryStream;false;WriteTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint | +| System.IO;Path;false;ChangeExtension;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint | @@ -575,21 +2482,62 @@ | System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetPathRoot;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetRelativePath;(System.String,System.String);;Argument[1];ReturnValue;taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2];ReturnValue;generated:taint | +| System.IO;Path;false;Join;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3];ReturnValue;generated:taint | +| System.IO;Path;false;TrimEndingDirectorySeparator;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.IO;Path;false;TrimEndingDirectorySeparator;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;RenamedEventArgs;false;RenamedEventArgs;(System.IO.WatcherChangeTypes,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;RenamedEventArgs;false;get_OldFullPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;RenamedEventArgs;false;get_OldName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;false;CopyTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;Stream;false;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;false;Synchronized;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | | System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;true;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | +| System.IO;Stream;true;FlushAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamReader;false;StreamReader;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamReader;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamReader;false;get_CurrentEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;StreamWriter;(System.IO.Stream,System.Text.Encoding,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;StreamWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StreamWriter;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | | System.IO;StringReader;false;StringReader;(System.String);;Argument[0];ReturnValue;taint | +| System.IO;StringWriter;false;GetStringBuilder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;StringWriter;(System.Text.StringBuilder,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;StringWriter;false;Write;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;Write;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;Write;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;StringWriter;false;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextReader;false;Synchronized;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | | System.IO;TextReader;true;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;Read;(System.Span);;Argument[Qualifier];ReturnValue;taint | @@ -603,6 +2551,531 @@ | System.IO;TextReader;true;ReadLineAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | +| System.IO;TextWriter;false;Synchronized;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;false;TextWriter;(System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;false;WriteLineAsync;(System.Char[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;FlushAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;Write;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;Write;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Char[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLine;(System.Text.StringBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.IO;TextWriter;true;WriteLineAsync;(System.Text.StringBuilder,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;get_NewLine;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.IO;TextWriter;true;set_NewLine;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryAccessor;false;UnmanagedMemoryAccessor;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.IO;UnmanagedMemoryStream;false;Initialize;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;Initialize;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Byte*,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;UnmanagedMemoryStream;(System.Runtime.InteropServices.SafeBuffer,System.Int64,System.Int64,System.IO.FileAccess);;Argument[0];Argument[Qualifier];generated:taint | +| System.IO;UnmanagedMemoryStream;false;get_PositionPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BinaryExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;BinaryExpression;false;get_Conversion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BinaryExpression;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;Update;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;BlockExpression;false;get_Expressions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;BlockExpression;false;get_Variables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;CatchBlock;false;Update;(System.Linq.Expressions.ParameterExpression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;ConditionalExpression;false;Update;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;ConditionalExpression;false;get_IfFalse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Rewrite;(System.Linq.Expressions.Expression[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;DynamicExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;DynamicExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ElementInit;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Add;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AddChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;And;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAlso;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;AndAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ArrayAccess;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ArrayIndex;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MemberInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Bind;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Block;(System.Type,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Call;(System.Reflection.MethodInfo,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Coalesce;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Condition;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Divide;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;DivideAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Dynamic;(System.Runtime.CompilerServices.CallSiteBinder,System.Type,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Equal;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOr;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ExclusiveOrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Field;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GetActionType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GetFuncType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;GreaterThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;IfThenElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Invoke;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Boolean,System.Collections.Generic.IEnumerable);;Argument[3].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Lambda<>;(System.Linq.Expressions.Expression,System.String,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LeftShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThan;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;LessThanOrEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeBinary;(System.Linq.Expressions.ExpressionType,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[4];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeDynamic;(System.Type,System.Runtime.CompilerServices.CallSiteBinder,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[5];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeIndex;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MakeMemberAccess;(System.Linq.Expressions.Expression,System.Reflection.MemberInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Modulo;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ModuloAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Multiply;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;MultiplyChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;New;(System.Reflection.ConstructorInfo,System.Collections.Generic.IEnumerable,System.Reflection.MemberInfo[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;NotEqual;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Boolean,System.Reflection.MethodInfo);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Or;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;OrElse;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Power;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;PowerAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Reflection.PropertyInfo,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Property;(System.Linq.Expressions.Expression,System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ReduceAndCheck;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ReduceExtensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShift;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;RightShiftAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;Subtract;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssign;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractAssignChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.LambdaExpression);;Argument[3];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;SubtractChecked;(System.Linq.Expressions.Expression,System.Linq.Expressions.Expression,System.Reflection.MethodInfo);;Argument[2];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;TryGetActionType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;false;TryGetFuncType;(System.Type[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;Expression;true;Accept;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression;true;Reduce;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];Argument[0];generated:taint | +| System.Linq.Expressions;Expression;true;VisitChildren;(System.Linq.Expressions.ExpressionVisitor);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;Expression<>;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;Visit;(System.Collections.ObjectModel.ReadOnlyCollection);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(System.Collections.ObjectModel.ReadOnlyCollection,System.String);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;false;VisitAndConvert<>;(T,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;Visit;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBinary;(System.Linq.Expressions.BinaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitBlock;(System.Linq.Expressions.BlockExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitCatchBlock;(System.Linq.Expressions.CatchBlock);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConditional;(System.Linq.Expressions.ConditionalExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitConstant;(System.Linq.Expressions.ConstantExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDebugInfo;(System.Linq.Expressions.DebugInfoExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDefault;(System.Linq.Expressions.DefaultExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitDynamic;(System.Linq.Expressions.DynamicExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitElementInit;(System.Linq.Expressions.ElementInit);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitExtension;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitGoto;(System.Linq.Expressions.GotoExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitIndex;(System.Linq.Expressions.IndexExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitInvocation;(System.Linq.Expressions.InvocationExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLabel;(System.Linq.Expressions.LabelExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLabelTarget;(System.Linq.Expressions.LabelTarget);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLambda<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitListInit;(System.Linq.Expressions.ListInitExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitLoop;(System.Linq.Expressions.LoopExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMember;(System.Linq.Expressions.MemberExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberAssignment;(System.Linq.Expressions.MemberAssignment);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberBinding;(System.Linq.Expressions.MemberBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberInit;(System.Linq.Expressions.MemberInitExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberListBinding;(System.Linq.Expressions.MemberListBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMemberMemberBinding;(System.Linq.Expressions.MemberMemberBinding);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitMethodCall;(System.Linq.Expressions.MethodCallExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitNew;(System.Linq.Expressions.NewExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitNewArray;(System.Linq.Expressions.NewArrayExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitParameter;(System.Linq.Expressions.ParameterExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitRuntimeVariables;(System.Linq.Expressions.RuntimeVariablesExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitSwitch;(System.Linq.Expressions.SwitchExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitSwitchCase;(System.Linq.Expressions.SwitchCase);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitTry;(System.Linq.Expressions.TryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitTypeBinary;(System.Linq.Expressions.TypeBinaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;ExpressionVisitor;true;VisitUnary;(System.Linq.Expressions.UnaryExpression);;Argument[0];ReturnValue;generated:taint | +| System.Linq.Expressions;GotoExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;IndexExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;IndexExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;IndexExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;InvocationExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LabelExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LambdaExpression;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;LambdaExpression;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;ListInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;LoopExpression;false;Update;(System.Linq.Expressions.LabelTarget,System.Linq.Expressions.LabelTarget,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberAssignment;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberAssignment;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberExpression;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MemberInitExpression;false;Update;(System.Linq.Expressions.NewExpression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberListBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MemberMemberBinding;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MethodCallExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;MethodCallExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;MethodCallExpression;false;get_Object;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewArrayExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;NewExpression;false;GetArgument;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;NewExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;NewExpression;false;get_Arguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq.Expressions;RuntimeVariablesExpression;false;Update;(System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;SwitchCase;false;Update;(System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;SwitchExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;TryExpression;false;Update;(System.Linq.Expressions.Expression,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression,System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;TypeBinaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq.Expressions;UnaryExpression;false;Update;(System.Linq.Expressions.Expression);;Argument[Qualifier];ReturnValue;generated:value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | | System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | @@ -614,6 +3087,7 @@ | System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue;value | | System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Append<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint | | System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -731,6 +3205,8 @@ | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Prepend<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;generated:taint | +| System.Linq;Enumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint | | System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | @@ -755,6 +3231,7 @@ | System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | | System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -770,6 +3247,7 @@ | System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeLast<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -815,12 +3293,26 @@ | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;EnumerableExecutor<>;false;EnumerableExecutor;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | +| System.Linq;EnumerableQuery<>;false;CreateQuery<>;(System.Linq.Expressions.Expression);;Argument[0];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Linq;EnumerableQuery<>;false;EnumerableQuery;(System.Linq.Expressions.Expression);;Argument[0];Argument[Qualifier];generated:taint | | System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;EnumerableQuery<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;get_Expression;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Linq;EnumerableQuery<>;false;get_Provider;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Linq;ImmutableArrayExtensions;false;ElementAt<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ImmutableArrayExtensions;false;ElementAtOrDefault<>;(System.Collections.Immutable.ImmutableArray,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | | System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Single<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;Lookup<,>;false;get_Item;(TKey);;Argument[Qualifier];ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | | System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | @@ -833,6 +3325,13 @@ | System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;AsOrdered;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsOrdered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Concurrent.Partitioner);;Argument[0];ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsParallel<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsSequential<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;AsUnordered<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -977,6 +3476,7 @@ | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | @@ -1062,6 +3562,10 @@ | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;WithCancellation<>;(System.Linq.ParallelQuery,System.Threading.CancellationToken);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithDegreeOfParallelism<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithExecutionMode<>;(System.Linq.ParallelQuery,System.Linq.ParallelExecutionMode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Linq;ParallelEnumerable;false;WithMergeOptions<>;(System.Linq.ParallelQuery,System.Linq.ParallelMergeOptions);;Argument[0].Element;ReturnValue;generated:taint | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | @@ -1236,59 +3740,2320 @@ | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[2].Parameter[1];value | | System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;HttpRequestCachePolicy;(System.Net.Cache.HttpCacheAgeControl,System.TimeSpan,System.TimeSpan,System.DateTime);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_CacheSyncDate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MaxStale;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Cache;HttpRequestCachePolicy;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;AuthenticationHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Parameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;AuthenticationHeaderValue;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MaxStaleLimit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_MinFresh;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;get_SharedMaxAge;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MaxStaleLimit;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_MinFresh;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;CacheControlHeaderValue;false;set_SharedMaxAge;(System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.Net.Http.Headers.ContentDispositionHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ContentDispositionHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_FileNameStar;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentDispositionHeaderValue;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Length;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ContentRangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;EntityTagHeaderValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;EntityTagHeaderValue;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_AcceptRanges;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_ProxyAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_Vary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;HttpResponseHeaders;false;get_WwwAuthenticate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;MediaTypeHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;MediaTypeHeaderValue;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;MediaTypeWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.MediaTypeWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.Net.Http.Headers.NameValueHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;NameValueHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;NameValueHeaderValue;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;NameValueWithParametersHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ProductHeaderValue;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductHeaderValue;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.Net.Http.Headers.ProductHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ProductInfoHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.ProductInfoHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ProductInfoHeaderValue;false;get_Product;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;RangeConditionHeaderValue;(System.Net.Http.Headers.EntityTagHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeConditionHeaderValue;false;get_EntityTag;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;get_Unit;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeHeaderValue;false;set_Unit;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;RangeItemHeaderValue;(System.Nullable,System.Nullable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RangeItemHeaderValue;false;get_To;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.DateTimeOffset);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;RetryConditionHeaderValue;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;RetryConditionHeaderValue;false;get_Delta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;StringWithQualityHeaderValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Quality;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;StringWithQualityHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TransferCodingHeaderValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingHeaderValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;TransferCodingWithQualityHeaderValue;false;TryParse;(System.String,System.Net.Http.Headers.TransferCodingWithQualityHeaderValue);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;ViaHeaderValue;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;ViaHeaderValue;false;get_ReceivedBy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;WarningHeaderValue;(System.Int32,System.String,System.String,System.DateTimeOffset);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Agent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Date;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Headers;WarningHeaderValue;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;Create;(System.Object,System.Type,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[3];ReturnValue;generated:taint | +| System.Net.Http.Json;JsonContent;false;Create<>;(T,System.Net.Http.Headers.MediaTypeHeaderValue,System.Text.Json.JsonSerializerOptions);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Http;ByteArrayContent;false;ByteArrayContent;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Http;ByteArrayContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ByteArrayContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;DelegatingHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;DelegatingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;get_InnerHandler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;DelegatingHandler;false;set_InnerHandler;(System.Net.Http.HttpMessageHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;FormUrlEncodedContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;Send;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;get_DefaultRequestVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpClient;false;set_BaseAddress;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClient;false;set_DefaultRequestVersion;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClient;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpClientHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;CopyTo;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;ReadAsStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;CreateContentReadStream;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;CreateContentReadStreamAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;HttpContent;true;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpMessageInvoker;false;HttpMessageInvoker;(System.Net.Http.HttpMessageHandler,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpMessageInvoker;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Http;HttpMethod;false;HttpMethod;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpMethod;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpMethod;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;HttpRequestMessage;(System.Net.Http.HttpMethod,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Method;(System.Net.Http.HttpMethod);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_RequestUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpRequestMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | | System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | | System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;HttpResponseMessage;false;EnsureSuccessStatusCode;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net.Http;HttpResponseMessage;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_ReasonPhrase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_RequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_Content;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_ReasonPhrase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_RequestMessage;(System.Net.Http.HttpRequestMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;HttpResponseMessage;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;MessageProcessingHandler;false;SendAsync;(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | | System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartContent;false;MultipartContent;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;MultipartContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | | System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;CreateContentReadStreamAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;ReadOnlyMemoryContent;false;ReadOnlyMemoryContent;(System.ReadOnlyMemory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpConnectionContext;false;get_DnsEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpConnectionContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ConnectCallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ConnectTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_DefaultProxyCredentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Expect100ContinueTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingDelay;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_KeepAlivePingTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PlaintextStreamFilter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionIdleTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_PooledConnectionLifetime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_RequestHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ResponseDrainTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_ResponseHeaderEncodingSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;get_SslOptions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_ConnectTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_DefaultProxyCredentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Expect100ContinueTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingDelay;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_KeepAlivePingTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionIdleTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_PooledConnectionLifetime;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_ResponseDrainTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpHandler;false;set_SslOptions;(System.Net.Security.SslClientAuthenticationOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_InitialRequestMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_NegotiatedHttpVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;SocketsHttpPlaintextStreamFilterContext;false;get_PlaintextStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStream;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;StreamContent;false;StreamContent;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Http;StringContent;false;SerializeToStreamAsync;(System.IO.Stream,System.Net.TransportContext,System.Threading.CancellationToken);;Argument[2];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;CreateAlternateViewFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;AlternateView;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AlternateViewCollection;false;InsertItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AlternateViewCollection;false;SetItem;(System.Int32,System.Net.Mail.AlternateView);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.IO.Stream,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;Attachment;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;CreateAttachmentFromString;(System.String,System.String,System.Text.Encoding,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_ContentDisposition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;get_NameEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;Attachment;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;Attachment;false;set_NameEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.IO.Stream,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;AttachmentBase;(System.String,System.Net.Mime.ContentType);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentBase;false;get_ContentId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AttachmentBase;false;get_ContentStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;AttachmentBase;false;set_ContentType;(System.Net.Mime.ContentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentCollection;false;InsertItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;AttachmentCollection;false;SetItem;(System.Int32,System.Net.Mail.Attachment);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Net.Mime.ContentType);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;CreateLinkedResourceFromString;(System.String,System.Text.Encoding,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResource;false;get_ContentLink;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;LinkedResourceCollection;false;InsertItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;LinkedResourceCollection;false;SetItem;(System.Int32,System.Net.Mail.LinkedResource);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;MailAddress;(System.String,System.String,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;TryCreate;(System.String,System.String,System.Text.Encoding,System.Net.Mail.MailAddress);;Argument[2];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailAddress;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Mail;MailAddressCollection;false;InsertItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddressCollection;false;SetItem;(System.Int32,System.Net.Mail.MailAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailAddressCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.Net.Mail.MailAddress,System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;MailMessage;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;get_Body;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_BodyEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_From;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_HeadersEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_ReplyTo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Sender;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;get_SubjectEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;MailMessage;false;set_Body;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_BodyEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_From;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_HeadersEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_ReplyTo;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_Sender;(System.Net.Mail.MailAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_Subject;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;MailMessage;false;set_SubjectEncoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;Send;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;Send;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendAsync;(System.Net.Mail.MailMessage,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendAsync;(System.String,System.String,System.String,System.String,System.Object);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.Net.Mail.MailMessage,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SendMailAsync;(System.String,System.String,System.String,System.String,System.Threading.CancellationToken);;Argument[4];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;SmtpClient;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;SmtpClient;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_PickupDirectoryLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;get_TargetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpClient;false;set_Credentials;(System.Net.ICredentialsByHost);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_PickupDirectoryLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpClient;false;set_TargetName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Net.Mail.SmtpStatusCode,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;SmtpFailedRecipientException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientException;false;get_FailedRecipient;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;SmtpFailedRecipientsException;(System.String,System.Net.Mail.SmtpFailedRecipientException[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Net.Mail;SmtpFailedRecipientsException;false;get_InnerExceptions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;ContentDisposition;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentDisposition;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;get_DispositionType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentDisposition;false;set_DispositionType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentType;false;ContentType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Mime;ContentType;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Boundary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_CharSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_MediaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;get_Parameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Mime;ContentType;false;set_MediaType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.NetworkInformation;PhysicalAddress;false;PhysicalAddress;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;AuthenticatedStream;false;AuthenticatedStream;(System.IO.Stream,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Security;AuthenticatedStream;false;DisposeAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;AuthenticatedStream;false;get_InnerStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClient;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ChannelBinding,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsClientAsync;(System.Net.NetworkCredential,System.String,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServer;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Net.NetworkCredential,System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy,System.Net.Security.ProtectionLevel,System.Security.Principal.TokenImpersonationLevel);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;AuthenticateAsServerAsync;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Security;NegotiateStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Security;NegotiateStream;false;get_RemoteIdentity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslApplicationProtocol;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslApplicationProtocol;false;get_Protocol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;Write;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Security;SslStream;false;get_LocalCertificate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_NegotiatedApplicationProtocol;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_RemoteCertificate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStream;false;get_TransportContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Security;SslStreamCertificateContext;false;Create;(System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Certificate2Collection,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;IPPacketInformation;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;IPv6MulticastOption;(System.Net.IPAddress,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;IPv6MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;MulticastOption;(System.Net.IPAddress,System.Net.IPAddress);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;get_Group;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;MulticastOption;false;get_LocalAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;MulticastOption;false;set_Group;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;MulticastOption;false;set_LocalAddress;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;NetworkStream;false;NetworkStream;(System.Net.Sockets.Socket,System.IO.FileAccess,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Memory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;WriteAsync;(System.ReadOnlyMemory,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;NetworkStream;false;get_Socket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SafeSocketHandle;false;SafeSocketHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Accept;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;AcceptAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;Bind;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;Connect;(System.Net.IPAddress[],System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ConnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;DisconnectAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;EndAccept;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.EndPoint);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFrom;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFrom;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint,System.Net.Sockets.IPPacketInformation);;Argument[4];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;ReceiveMessageFromAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendPacketsAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[4];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Int32,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.EndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendTo;(System.Byte[],System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;Socket;false;SendToAsync;(System.Net.Sockets.SocketAsyncEventArgs);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net.Sockets;Socket;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_LocalEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;Socket;false;get_SafeHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;SetBuffer;(System.Memory);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_BufferList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectByNameError;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ConnectSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_MemoryBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_ReceiveMessageFromPacketInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_SendPacketsElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;get_UserToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_AcceptSocket;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_BufferList;(System.Collections.Generic.IList>);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_RemoteEndPoint;(System.Net.EndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_SendPacketsElements;(System.Net.Sockets.SendPacketsElement[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketAsyncEventArgs;false;set_UserToken;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;SocketException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;AcceptAsync;(System.Net.Sockets.Socket,System.Net.Sockets.Socket);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.EndPoint,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.Net.IPAddress,System.Int32,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ConnectAsync;(System.Net.Sockets.Socket,System.String,System.Int32,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveAsync;(System.Net.Sockets.Socket,System.Memory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;ReceiveMessageFromAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendAsync;(System.Net.Sockets.Socket,System.ReadOnlyMemory,System.Net.Sockets.SocketFlags,System.Threading.CancellationToken);;Argument[3];ReturnValue;generated:taint | +| System.Net.Sockets;SocketTaskExtensions;false;SendToAsync;(System.Net.Sockets.Socket,System.ArraySegment,System.Net.Sockets.SocketFlags,System.Net.EndPoint);;Argument[3];Argument[0];generated:taint | +| System.Net.Sockets;TcpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpClient;false;GetStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpClient;false;TcpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;AcceptSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;AcceptTcpClient;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;EndAcceptSocket;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;EndAcceptTcpClient;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;TcpListener;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;TcpListener;false;get_LocalEndpoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;TcpListener;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Connect;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;EndReceive;(System.IAsyncResult,System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Receive;(System.Net.IPEndPoint);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;Send;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;SendAsync;(System.Byte[],System.Int32,System.Net.IPEndPoint);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;UdpClient;(System.Net.IPEndPoint);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpClient;false;get_Client;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpClient;false;set_Client;(System.Net.Sockets.Socket);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;UdpReceiveResult;(System.Byte[],System.Net.IPEndPoint);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;get_Buffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.Sockets;UdpReceiveResult;false;get_RemoteEndPoint;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;SetBuffer;(System.Int32,System.Int32,System.ArraySegment);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_KeepAliveInterval;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;get_RemoteCertificateValidationCallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Cookies;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_KeepAliveInterval;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;ClientWebSocketOptions;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_CookieCollection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_Origin;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketProtocols;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_SecWebSocketVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;HttpListenerWebSocketContext;false;get_WebSocket;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[0];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateClientWebSocket;(System.IO.Stream,System.String,System.Int32,System.Int32,System.TimeSpan,System.Boolean,System.ArraySegment);;Argument[1];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocket;false;CreateFromStream;(System.IO.Stream,System.Boolean,System.String,System.TimeSpan);;Argument[2];ReturnValue;generated:taint | +| System.Net.WebSockets;WebSocketException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;Authorization;false;get_ProtectionRealm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Authorization;false;set_ProtectionRealm;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;Cookie;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Comment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_CommentUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Expires;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_Port;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Cookie;false;get_TimeStamp;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;Cookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Net;Cookie;false;set_Comment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_CommentUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Expires;(System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Port;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;Cookie;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;CookieCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;CookieCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;CookieCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;CookieException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;CredentialCache;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;Dns;false;EndGetHostAddresses;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndGetHostByName;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndGetHostEntry;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;Dns;false;EndResolve;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;DnsEndPoint;false;DnsEndPoint;(System.String,System.Int32,System.Net.Sockets.AddressFamily);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;DnsEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DnsEndPoint;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DownloadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;DownloadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FileWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FileWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_ClientCertificates;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_ConnectionGroupName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_RenameTo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_ConnectionGroupName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;FtpWebRequest;false;set_RenameTo;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;FtpWebResponse;false;GetResponseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_BannerMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_ExitMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_LastModified;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_ResponseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;FtpWebResponse;false;get_WelcomeMessage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_AuthenticationSchemeSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_DefaultServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_ExtendedProtectionPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_ExtendedProtectionSelectorDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_Prefixes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_Realm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;get_TimeoutManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListener;false;set_ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.ExtendedProtectionPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListener;false;set_Realm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerContext;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerContext;false;get_User;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net;HttpListenerRequest;false;EndGetClientCertificate;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_HttpMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_InputStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_RawUrl;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_Url;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UrlReferrer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerRequest;false;get_UserHostName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;AppendCookie;(System.Net.Cookie);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;Close;(System.Byte[],System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;CopyFrom;(System.Net.HttpListenerResponse);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_OutputStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_ProtocolVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_RedirectLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpListenerResponse;false;set_StatusDescription;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerTimeoutManager;false;get_DrainEntityBody;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerTimeoutManager;false;get_IdleConnection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpListenerTimeoutManager;false;set_DrainEntityBody;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpListenerTimeoutManager;false;set_IdleConnection;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;EndGetRequestStream;(System.IAsyncResult,System.Net.TransportContext);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;EndGetResponse;(System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetRequestStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetRequestStream;(System.Net.TransportContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;GetResponse;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Accept;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Connection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_ContentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_ContinueDelegate;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_CookieContainer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Expect;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_Referer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_RequestUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_TransferEncoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;get_UserAgent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebRequest;false;set_ClientCertificates;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_CookieContainer;(System.Net.CookieContainer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Method;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebRequest;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;HttpWebResponse;false;GetResponseHeader;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_CharacterSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Cookies;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Headers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_Server;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;get_StatusDescription;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;HttpWebResponse;false;set_Cookies;(System.Net.CookieCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;IPAddress;false;MapToIPv4;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;IPAddress;false;MapToIPv6;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;IPAddress;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;IPEndPoint;(System.Net.IPAddress,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;IPEndPoint;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;get_Address;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;IPEndPoint;false;set_Address;(System.Net.IPAddress);;Argument[0];Argument[Qualifier];generated:taint | | System.Net;IPHostEntry;false;get_Aliases;();;Argument[Qualifier];ReturnValue;taint | | System.Net;IPHostEntry;false;get_HostName;();;Argument[Qualifier];ReturnValue;taint | +| System.Net;NetworkCredential;false;GetCredential;(System.String,System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;NetworkCredential;false;GetCredential;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.Security.SecureString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;NetworkCredential;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;get_Domain;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;NetworkCredential;false;set_Domain;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;NetworkCredential;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;OpenReadCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;OpenWriteCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;ProtocolViolationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;UploadDataCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadFileCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadStringCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;UploadValuesCompletedEventArgs;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;DownloadData;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadData;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadDataTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadString;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadString;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;DownloadStringTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebRequest;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;GetWebResponse;(System.Net.WebRequest,System.IAsyncResult);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenRead;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenReadAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadAsync;(System.Uri,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenReadTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWrite;(System.Uri,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteAsync;(System.Uri,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;OpenWriteTaskAsync;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadData;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataAsync;(System.Uri,System.String,System.Byte[],System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.String,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadDataTaskAsync;(System.Uri,System.String,System.Byte[]);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFile;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadFileTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadString;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringAsync;(System.Uri,System.String,System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadStringTaskAsync;(System.Uri,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValues;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.String,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;UploadValuesTaskAsync;(System.Uri,System.String,System.Collections.Specialized.NameValueCollection);;Argument[1];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;get_BaseAddress;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Credentials;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_Proxy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;get_ResponseHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebClient;false;set_BaseAddress;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Headers;(System.Net.WebHeaderCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Net;WebClient;false;set_QueryString;(System.Collections.Specialized.NameValueCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Net;WebException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Net;WebException;false;WebException;(System.String,System.Exception,System.Net.WebExceptionStatus,System.Net.WebResponse);;Argument[3];Argument[Qualifier];generated:taint | +| System.Net;WebException;false;get_Response;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;WebHeaderCollection;false;ToByteArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_AllKeys;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpRequestHeader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebHeaderCollection;false;get_Item;(System.Net.HttpResponseHeader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebProxy;false;GetProxy;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebProxy;false;get_BypassArrayList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebProxy;false;get_BypassList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Net;WebRequest;false;Create;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;Create;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateDefault;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateHttp;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebRequest;false;CreateHttp;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Net;WebUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint | | System.Net;WebUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | +| System.Net;WebUtility;false;UrlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | | System.Net;WebUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | +| System.Numerics;BigInteger;false;Abs;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;DivRem;(System.Numerics.BigInteger,System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Max;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Min;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Negate;(System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Pow;(System.Numerics.BigInteger,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;BigInteger;false;Remainder;(System.Numerics.BigInteger,System.Numerics.BigInteger);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Complex;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Complex;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Add;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Lerp;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Multiply;(System.Numerics.Matrix4x4,System.Single);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Negate;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Subtract;(System.Numerics.Matrix4x4,System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Matrix4x4;false;Transpose;(System.Numerics.Matrix4x4);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Plane;false;Normalize;(System.Numerics.Plane);;Argument[0];ReturnValue;generated:taint | +| System.Numerics;Plane;false;Plane;(System.Numerics.Vector3,System.Single);;Argument[0];Argument[Qualifier];generated:taint | +| System.Numerics;Plane;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Numerics;Vector2;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector3;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector4;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System.Numerics;Vector;false;Abs<>;(System.Numerics.Vector);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicAssembly;(System.Reflection.AssemblyName,System.Reflection.Emit.AssemblyBuilderAccess,System.Collections.Generic.IEnumerable);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;DefineDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;GetDynamicModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;GetModule;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;AssemblyBuilder;false;get_ManifestModule;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ConstructorBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;CustomAttributeBuilder;false;CustomAttributeBuilder;(System.Reflection.ConstructorInfo,System.Object[],System.Reflection.PropertyInfo[],System.Object[],System.Reflection.FieldInfo[],System.Object[]);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;DynamicILInfo;false;get_DynamicMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;CreateDelegate;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;DynamicMethod;false;GetDynamicILInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_MethodHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;DynamicMethod;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;DefineLiteral;(System.String,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEnumUnderlyingType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_UnderlyingField;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EnumBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;EventBuilder;false;AddOtherMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetAddOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetRaiseMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;EventBuilder;false;SetRemoveOnMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_FieldType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;FieldBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetBaseTypeConstraint;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;SetInterfaceConstraints;(System.Type[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;GenericTypeParameterBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ILGenerator;false;DeclareLocal;(System.Type,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;LocalBuilder;false;get_LocalType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;DefineParameter;(System.Int32,System.Reflection.ParameterAttributes,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetBaseDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;MethodBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetGenericMethodDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;MethodBuilder;false;GetILGenerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetILGenerator;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;MakeGenericMethod;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetReturnType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;SetSignature;(System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Emit;MethodBuilder;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReturnParameter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;MethodBuilder;false;get_ReturnType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineEnum;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineGlobalMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetArrayMethod;(System.Type,System.String,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;GetType;(System.String,System.Boolean,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_FullyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ModuleBuilder;false;get_ScopeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;ParameterBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;GetGetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;GetSetMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetConstant;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetGetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;SetSetMethod;(System.Reflection.Emit.MethodBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_PropertyType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;PropertyBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetFieldSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetLocalVarSigHelper;(System.Reflection.Module);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.CallingConventions,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Reflection.CallingConventions,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;SignatureHelper;false;GetMethodSigHelper;(System.Reflection.Module,System.Type,System.Type[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;AddInterfaceImplementation;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;CreateType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;CreateTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineConstructor;(System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineDefaultConstructor;(System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineEvent;(System.String,System.Reflection.EventAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[2].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineField;(System.String,System.Type,System.Type[],System.Type[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineGenericParameters;(System.String[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineInitializedData;(System.String,System.Byte[],System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineMethod;(System.String,System.Reflection.MethodAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Reflection.Emit.PackingSize,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineNestedType;(System.String,System.Reflection.TypeAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefinePInvokeMethod;(System.String,System.String,System.String,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][],System.Runtime.InteropServices.CallingConvention,System.Runtime.InteropServices.CharSet);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[5].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[8].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[2];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[3].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[4].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[6].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[7].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineProperty;(System.String,System.Reflection.PropertyAttributes,System.Type,System.Type[],System.Type[],System.Type[],System.Type[][],System.Type[][]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineTypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;DefineUninitializedData;(System.String,System.Int32,System.Reflection.FieldAttributes);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructor;(System.Type,System.Reflection.ConstructorInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetField;(System.Type,System.Reflection.FieldInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetGenericArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetGenericTypeDefinition;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Emit;TypeBuilder;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethod;(System.Type,System.Reflection.MethodInfo);;Argument[1];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;MakeGenericType;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;SetCustomAttribute;(System.Reflection.Emit.CustomAttributeBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;SetParent;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Emit;TypeBuilder;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;CustomModifiersEncoder;false;AddModifier;(System.Reflection.Metadata.EntityHandle,System.Boolean);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;Add;(System.Reflection.Metadata.ExceptionRegionKind,System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddCatch;(System.Int32,System.Int32,System.Int32,System.Int32,System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFault;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFilter;(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;ExceptionRegionEncoder;false;AddFinally;(System.Int32,System.Int32,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddAssembly;(System.Reflection.Metadata.StringHandle,System.Version,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.BlobHandle,System.Reflection.AssemblyFlags,System.Reflection.AssemblyHashAlgorithm);;Argument[3];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataBuilder;false;AddModule;(System.Int32,System.Reflection.Metadata.StringHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle,System.Reflection.Metadata.GuidHandle);;Argument[4];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;MetadataRootBuilder;(System.Reflection.Metadata.Ecma335.MetadataBuilder,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;MetadataRootBuilder;false;get_Sizes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Collections.Immutable.ImmutableArray);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;PermissionSetEncoder;false;AddPermission;(System.String,System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;PortablePdbBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureDecoder<,>;false;SignatureDecoder;(System.Reflection.Metadata.ISignatureTypeProvider,System.Reflection.Metadata.MetadataReader,TGenericContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Array;(System.Reflection.Metadata.Ecma335.SignatureTypeEncoder,System.Reflection.Metadata.Ecma335.ArrayShapeEncoder);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;Pointer;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata.Ecma335;SignatureTypeEncoder;false;SZArray;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata;AssemblyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyFile;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;Blob;false;GetBytes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection.Metadata;BlobBuilder;false;GetBlobs;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkPrefix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;LinkSuffix;(System.Reflection.Metadata.BlobBuilder);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;ReserveBytes;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobBuilder;false;TryWriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadConstant;(System.Reflection.Metadata.ConstantTypeCode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadSerializedString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadUTF8;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;ReadUTF16;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;get_CurrentPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobReader;false;get_StartPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;BlobWriter;false;BlobWriter;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobWriter;false;WriteBytes;(System.IO.Stream,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.Metadata;BlobWriter;false;get_Blob;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;EventAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;EventDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ExportedType;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;FieldDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;GenericParameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;GenericParameterConstraint;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ImportDefinitionCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;InterfaceImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetChildren;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetLocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScope;false;GetLocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ManifestResource;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MemberReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyDefinition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyFile;(System.Reflection.Metadata.AssemblyFileHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetAssemblyReference;(System.Reflection.Metadata.AssemblyReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetConstant;(System.Reflection.Metadata.ConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomAttribute;(System.Reflection.Metadata.CustomAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomAttributes;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.CustomDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetCustomDebugInformation;(System.Reflection.Metadata.EntityHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetDeclarativeSecurityAttribute;(System.Reflection.Metadata.DeclarativeSecurityAttributeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetDocument;(System.Reflection.Metadata.DocumentHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetEventDefinition;(System.Reflection.Metadata.EventDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetExportedType;(System.Reflection.Metadata.ExportedTypeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetFieldDefinition;(System.Reflection.Metadata.FieldDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetGenericParameter;(System.Reflection.Metadata.GenericParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetGenericParameterConstraint;(System.Reflection.Metadata.GenericParameterConstraintHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetImportScope;(System.Reflection.Metadata.ImportScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetInterfaceImplementation;(System.Reflection.Metadata.InterfaceImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalConstant;(System.Reflection.Metadata.LocalConstantHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScope;(System.Reflection.Metadata.LocalScopeHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalScopes;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetLocalVariable;(System.Reflection.Metadata.LocalVariableHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetManifestResource;(System.Reflection.Metadata.ManifestResourceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMemberReference;(System.Reflection.Metadata.MemberReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDebugInformationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDebugInformation;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodDefinition;(System.Reflection.Metadata.MethodDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodImplementation;(System.Reflection.Metadata.MethodImplementationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetMethodSpecification;(System.Reflection.Metadata.MethodSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetModuleDefinition;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetModuleReference;(System.Reflection.Metadata.ModuleReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetNamespaceDefinitionRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetParameter;(System.Reflection.Metadata.ParameterHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetPropertyDefinition;(System.Reflection.Metadata.PropertyDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetStandaloneSignature;(System.Reflection.Metadata.StandaloneSignatureHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeDefinition;(System.Reflection.Metadata.TypeDefinitionHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeReference;(System.Reflection.Metadata.TypeReferenceHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;GetTypeSpecification;(System.Reflection.Metadata.TypeSpecificationHandle);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_AssemblyReferences;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_CustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_CustomDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_DebugMetadataHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_DeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_Documents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_EventDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_FieldDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_ImportScopes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalConstants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalScopes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_LocalVariables;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MetadataPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MetadataVersion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MethodDebugInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_MethodDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_PropertyDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReader;false;get_StringComparer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromMetadataStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbImage;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;FromPortablePdbStream;(System.IO.Stream,System.Reflection.Metadata.MetadataStreamOptions,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataReaderProvider;false;GetMetadataReader;(System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MetadataStringDecoder;false;GetString;(System.Byte*,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;Create;(System.Reflection.Metadata.BlobReader);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;GetILReader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;get_ExceptionRegions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodBodyBlock;false;get_LocalSignature;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinition;false;GetParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodImplementation;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodImport;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodImport;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;MethodSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ModuleDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ModuleReference;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_ExportedTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_NamespaceDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;NamespaceDefinition;false;get_TypeDefinitions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;PEReaderExtensions;false;GetMetadataReader;(System.Reflection.PortableExecutable.PEReader,System.Reflection.Metadata.MetadataReaderOptions,System.Reflection.Metadata.MetadataStringDecoder);;Argument[0];ReturnValue;generated:taint | +| System.Reflection.Metadata;Parameter;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PropertyAccessors;false;get_Others;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PropertyDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;SequencePointCollection+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;StandaloneSignature;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetDeclarativeSecurityAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetInterfaceImplementations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeDefinition;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.Metadata;TypeSpecification;false;GetCustomAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;ManagedPEBuilder;false;GetDirectories;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;ManagedPEBuilder;false;SerializeSection;(System.String,System.Reflection.PortableExecutable.SectionLocation);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEBuilder+Section;false;Section;(System.String,System.Reflection.PortableExecutable.SectionCharacteristics);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEBuilder;false;GetSections;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEBuilder;false;Serialize;(System.Reflection.Metadata.BlobBuilder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_CoffHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_CorHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_PEHeader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEHeaders;false;get_SectionHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEMemoryBlock;false;get_Pointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetEntireImage;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetMetadata;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;GetSectionData;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Byte*,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;PEReader;(System.IO.Stream,System.Reflection.PortableExecutable.PEStreamOptions,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection.PortableExecutable;PEReader;false;get_PEHeaders;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;CreateQualifiedName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;GetAssembly;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Assembly;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Assembly;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;GetPublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;SetPublicKey;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;SetPublicKeyToken;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_CultureInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_EscapedCodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;AssemblyName;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_CultureInfo;(System.Globalization.CultureInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;AssemblyName;false;set_Version;(System.Version);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeData;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;CustomAttributeNamedArgument;(System.Reflection.MemberInfo,System.Reflection.CustomAttributeTypedArgument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_MemberInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeNamedArgument;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;CustomAttributeTypedArgument;(System.Type,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;get_ArgumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;CustomAttributeTypedArgument;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetAddMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetRaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;false;GetRemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_AddMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_RaiseMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfo;true;get_RemoveMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetAddMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRaiseMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;EventInfoExtensions;false;GetRemoveMethod;(System.Reflection.EventInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;ExceptionHandlingClause;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;IntrospectionExtensions;false;GetTypeInfo;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;LocalVariableInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;MethodInfo;false;CreateDelegate<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;MethodInfoExtensions;false;GetBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Module;true;GetType;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;GetRealObject;(System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_Member;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;ParameterInfo;false;get_ParameterType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;Pointer;false;Box;(System.Void*,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;Pointer;false;Unbox;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetAccessors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetGetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;false;GetSetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;true;get_GetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfo;true;get_SetMethod;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetAccessors;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetGetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;PropertyInfoExtensions;false;GetSetMethod;(System.Reflection.PropertyInfo,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;ReflectionTypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Reflection;ReflectionTypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetMethodInfo;(System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeBaseDefinition;(System.Reflection.MethodInfo);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeEvents;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeFields;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeInterfaceMap;(System.Reflection.TypeInfo,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeMethods;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperties;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;RuntimeReflectionExtensions;false;GetRuntimeProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetConstructorImpl;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetConstructors;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetElementType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetEvent;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetEvents;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetField;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetFields;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterface;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaceMap;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMember;(System.String,System.Reflection.MemberTypes,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMembers;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMethodImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetMethods;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetNestedType;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetNestedTypes;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetProperties;(System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;GetPropertyImpl;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;TypeDelegator;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Reflection;TypeDelegator;false;get_Assembly;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_AssemblyQualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeDelegator;false;get_UnderlyingSystemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructor;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructors;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetConstructors;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetDefaultMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvent;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvents;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetEvents;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetField;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetFields;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetFields;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetGenericArguments;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetInterfaces;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMember;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMembers;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethod;(System.Type,System.String,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethods;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetMethods;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetNestedType;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetNestedTypes;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperties;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperties;(System.Type,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Reflection.BindingFlags);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeExtensions;false;GetProperty;(System.Type,System.String,System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;false;GetTypeInfo;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection;TypeInfo;true;AsType;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Reflection;TypeInfo;true;GetDeclaredEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;GetDeclaredProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredConstructors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredMembers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_DeclaredProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_GenericTypeParameters;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Reflection;TypeInfo;true;get_ImplementedInterfaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;MissingSatelliteAssemblyException;false;MissingSatelliteAssemblyException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;MissingSatelliteAssemblyException;false;get_CultureName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;CreateFileBasedResourceManager;(System.String,System.String,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;GetResourceFileName;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.String,System.Reflection.Assembly,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;ResourceManager;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceManager;false;get_BaseName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceManager;false;get_ResourceSetType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceReader;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceReader;false;GetResourceData;(System.String,System.String,System.Byte[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceReader;false;ResourceReader;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceSet;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Resources;ResourceSet;false;ResourceSet;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Resources;ResourceSet;false;ResourceSet;(System.Resources.IResourceReader);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Resources;ResourceWriter;false;ResourceWriter;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncIteratorMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;AwaitUnsafeOnCompleted<,>;(TAwaiter,TStateMachine);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;AsyncValueTaskMethodBuilder<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;CallSite;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetOrCreateValue;(TKey);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;GetAsyncEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredCancelableAsyncEnumerable<>;false;WithCancellation;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_configured_task_awaitable].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | | System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier].SyntheticField[m_configuredTaskAwaiter];ReturnValue;value | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>+ConfiguredValueTaskAwaiter;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ConfiguredValueTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ContractHelper;false;RaiseContractFailedEvent;(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception);;Argument[2];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;DateTimeConstantAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;DynamicAttribute;false;DynamicAttribute;(System.Boolean[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;DynamicAttribute;false;get_TransformFlags;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;FormattableStringFactory;false;Create;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;ReadOnlyCollectionBuilder;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | | System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;RuntimeWrappedException;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;RuntimeWrappedException;false;get_WrappedException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;StrongBox;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;StrongBox<>;false;set_Value;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;SwitchExpressionException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.CompilerServices;SwitchExpressionException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_task_awaiter].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Runtime.CompilerServices;TupleElementNamesAttribute;false;TupleElementNamesAttribute;(System.String[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Runtime.CompilerServices;TupleElementNamesAttribute;false;get_TransformNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.CompilerServices;ValueTaskAwaiter<>;false;GetResult;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;Capture;(System.Exception);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;SetCurrentStackTrace;(System.Exception);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.ExceptionServices;ExceptionDispatchInfo;false;get_SourceException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ArrayWithOffset;false;ArrayWithOffset;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;ArrayWithOffset;false;GetArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;COMException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetAddMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetRaiseMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;GetRemoveMethod;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_DeclaringType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_Module;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;ComAwareEventInfo;false;get_ReflectedType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;CriticalHandle;false;CriticalHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;CriticalHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;ExternalException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;GCHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;GCHandle;false;ToIntPtr;(System.Runtime.InteropServices.GCHandle);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;HandleRef;false;HandleRef;(System.Object,System.IntPtr);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;HandleRef;false;ToIntPtr;(System.Runtime.InteropServices.HandleRef);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;HandleRef;false;get_Wrapper;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;Marshal;false;GenerateProgIdForType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;CreateFromPinnedArray<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetMemoryManager<,>;(System.ReadOnlyMemory,TManager,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;MemoryMarshal;false;TryGetString;(System.ReadOnlyMemory,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;DangerousGetHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;SafeHandle;(System.IntPtr,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;SafeHandle;false;SetHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetArray<>;(System.Buffers.ReadOnlySequence,System.ArraySegment);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlyMemory<>;(System.Buffers.ReadOnlySequence,System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.InteropServices;SequenceMarshal;false;TryGetReadOnlySequenceSegment<>;(System.Buffers.ReadOnlySequence,System.Buffers.ReadOnlySequenceSegment,System.Int32,System.Buffers.ReadOnlySequenceSegment,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector64;false;WithElement<>;(System.Runtime.Intrinsics.Vector64,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithElement<>;(System.Runtime.Intrinsics.Vector128,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithLower<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector128;false;WithUpper<>;(System.Runtime.Intrinsics.Vector128,System.Runtime.Intrinsics.Vector64);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithElement<>;(System.Runtime.Intrinsics.Vector256,System.Int32,T);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithLower<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Intrinsics;Vector256;false;WithUpper<>;(System.Runtime.Intrinsics.Vector256,System.Runtime.Intrinsics.Vector128);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveAssemblyToPath;(System.Reflection.AssemblyName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyDependencyResolver;false;ResolveUnmanagedDllToPath;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;EnterContextualReflection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Loader;AssemblyLoadContext;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Remoting;ObjectHandle;false;ObjectHandle;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Remoting;ObjectHandle;false;Unwrap;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;BinaryFormatter;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Binder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;get_SurrogateSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Binder;(System.Runtime.Serialization.SerializationBinder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_Context;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Formatters.Binary;BinaryFormatter;false;set_SurrogateSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;DataContractJsonSerializer;(System.Type,System.Runtime.Serialization.Json.DataContractJsonSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_DateTimeFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;DataContractJsonSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Runtime.Serialization.Json;JsonReaderWriterFactory;false;CreateJsonWriter;(System.IO.Stream,System.Text.Encoding,System.Boolean,System.Boolean,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ItemName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_KeyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;get_ValueName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ItemName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_KeyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;CollectionDataContractAttribute;false;set_ValueName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Runtime.Serialization.DataContractSerializerSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;DataContractSerializer;(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable);;Argument[3].Element;Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;ReadObject;(System.Xml.XmlDictionaryReader,System.Boolean,System.Runtime.Serialization.DataContractResolver);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;get_DataContractResolver;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializer;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializerExtensions;false;GetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataContractSerializerExtensions;false;SetSerializationSurrogateProvider;(System.Runtime.Serialization.DataContractSerializer,System.Runtime.Serialization.ISerializationSurrogateProvider);;Argument[1];Argument[0];generated:taint | +| System.Runtime.Serialization;DataMemberAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DataMemberAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;DateTimeFormat;(System.String,System.IFormatProvider);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;get_FormatProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;DateTimeFormat;false;get_FormatString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;EnumMemberAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;EnumMemberAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ExportOptions;false;get_KnownTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;Convert;(System.Object,System.TypeCode);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;ToDateTime;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterConverter;false;ToString;(System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSerializableMembers;(System.Type,System.Runtime.Serialization.StreamingContext);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetSurrogateForCyclicalReference;(System.Runtime.Serialization.ISerializationSurrogate);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;GetTypeFromAssembly;(System.Reflection.Assembly,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;FormatterServices;false;PopulateObjectMembers;(System.Object,System.Reflection.MemberInfo[],System.Object[]);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;ObjectIDGenerator;false;GetId;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ObjectManager;false;GetObject;(System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;ObjectManager;false;ObjectManager;(System.Runtime.Serialization.ISurrogateSelector,System.Runtime.Serialization.StreamingContext);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationEntry;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Byte);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Char);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.DateTime);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Decimal);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Double);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Int64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.SByte);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.Single);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;AddValue;(System.String,System.UInt64);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetDateTime;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;GetValue;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;SetType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_FullTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfo;false;set_FullTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_ObjectType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationInfoEnumerator;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SerializationObjectManager;false;SerializationObjectManager;(System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;StreamingContext;false;StreamingContext;(System.Runtime.Serialization.StreamingContextStates,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;StreamingContext;false;get_Context;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;ChainSelector;(System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];Argument[0];generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;GetNextSelector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;SurrogateSelector;false;GetSurrogate;(System.Type,System.Runtime.Serialization.StreamingContext,System.Runtime.Serialization.ISurrogateSelector);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;XPathQueryGenerator;false;CreateFromDataContractSerializer;(System.Type,System.Reflection.MemberInfo[],System.Text.StringBuilder,System.Xml.XmlNamespaceManager);;Argument[2];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlDictionaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlObjectSerializer;true;ReadObject;(System.Xml.XmlReader,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Serialization;XmlSerializableServices;false;WriteNodes;(System.Xml.XmlWriter,System.Xml.XmlNode[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;XsdDataContractExporter;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Serialization;XsdDataContractExporter;false;set_Options;(System.Runtime.Serialization.ExportOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;FrameworkName;(System.String,System.Version,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;FrameworkName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_FullName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Identifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Profile;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;FrameworkName;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;TargetFrameworkAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkDisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;get_FrameworkName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Runtime.Versioning;TargetFrameworkAttribute;false;set_FrameworkDisplayName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Runtime.Versioning;VersioningHelper;false;MakeVersionSafeName;(System.String,System.Runtime.Versioning.ResourceScope,System.Runtime.Versioning.ResourceScope,System.Type);;Argument[3];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ChannelBinding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ExtendedProtectionPolicy;(System.Security.Authentication.ExtendedProtection.PolicyEnforcement,System.Security.Authentication.ExtendedProtection.ProtectionScenario,System.Security.Authentication.ExtendedProtection.ServiceNameCollection);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomChannelBinding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicy;false;get_CustomServiceNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ExtendedProtectionPolicyTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;Merge;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Security.Authentication.ExtendedProtection;ServiceNameCollection;false;ServiceNameCollection;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.IO.BinaryReader,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Claim;(System.Security.Claims.Claim,System.Security.Claims.ClaimsIdentity);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Claims;Claim;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;Clone;(System.Security.Claims.ClaimsIdentity);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;Claim;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_OriginalIssuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Properties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;Claim;false;get_ValueType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;AddClaim;(System.Security.Claims.Claim);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;AddClaims;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;ClaimsIdentity;(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable,System.String,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;CreateClaim;(System.IO.BinaryReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Actor;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_BootstrapContext;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Label;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_NameClaimType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;get_RoleClaimType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_Actor;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_BootstrapContext;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsIdentity;false;set_Label;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;AddIdentities;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;AddIdentity;(System.Security.Claims.ClaimsIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.IO.BinaryReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;ClaimsPrincipal;(System.Security.Principal.IPrincipal);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;CreateClaimsIdentity;(System.IO.BinaryReader);;Argument[0];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;FindAll;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;FindFirst;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;WriteTo;(System.IO.BinaryWriter,System.Byte[]);;Argument[1].Element;Argument[0];generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_CustomSerializationData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Identities;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Claims;ClaimsPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.Security.Cryptography.X509Certificates.X500DistinguishedName,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.ECDsa,System.Security.Cryptography.HashAlgorithmName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;CertificateRequest;false;CertificateRequest;(System.String,System.Security.Cryptography.RSA,System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;PublicKey;(System.Security.Cryptography.Oid,System.Security.Cryptography.AsnEncodedData,System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;get_Key;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;PublicKey;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.Security.Cryptography.X509Certificates.X500DistinguishedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;X500DistinguishedName;(System.String,System.Security.Cryptography.X509Certificates.X500DistinguishedNameFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X500DistinguishedName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509BasicConstraintsExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Extensions;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_IssuerName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotAfter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_NotBefore;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PrivateKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SerialNumber;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SignatureAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_SubjectName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2;false;get_Thumbprint;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;RemoveRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;X509Certificate2Collection;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetCertHashString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetKeyAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;GetSerialNumberString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;ToString;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Issuer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Certificate;false;get_Subject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;X509CertificateEnumerator;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection+X509CertificateEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current];value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Remove;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;X509CertificateCollection;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;get_ChainStatus;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Chain;false;set_ChainPolicy;(System.Security.Cryptography.X509Certificates.X509ChainPolicy);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography.X509Certificates;X509ChainElementEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainStatus;false;get_StatusInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ChainStatus;false;set_StatusInformation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509EnhancedKeyUsageExtension;false;get_EnhancedKeyUsages;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509Extension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography.X509Certificates;X509ExtensionEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509KeyUsageExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForECDsa;(System.Security.Cryptography.ECDsa);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;CreateForRSA;(System.Security.Cryptography.RSA,System.Security.Cryptography.RSASignaturePadding);;Argument[1];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SignatureGenerator;false;get_PublicKey;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography.X509Certificates;X509SubjectKeyIdentifierExtension;false;get_SubjectKeyIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.Security.Cryptography.Oid,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;AsnEncodedData;(System.String,System.ReadOnlySpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;CopyFrom;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;Format;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;get_RawData;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedData;false;set_Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;AsnEncodedDataCollection;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current];value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;AsnEncodedDataCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography;AsnEncodedDataEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;CryptoStream;false;CryptoStream;(System.IO.Stream,System.Security.Cryptography.ICryptoTransform,System.Security.Cryptography.CryptoStreamMode,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;CryptoStream;false;FlushAsync;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;CspParameters;false;get_ParentWindowHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;CspParameters;false;set_ParentWindowHandle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureDeformatter;false;DSASignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureFormatter;false;DSASignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;DSASignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;ECCurve;false;get_Oid;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HMAC;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HMAC;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;HashAlgorithmName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;HashAlgorithmName;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.Byte[]);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHMAC;(System.Security.Cryptography.HashAlgorithmName,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;CreateHash;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;IncrementalHash;false;get_AlgorithmName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;FromFriendlyName;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;FromOidValue;(System.String,System.Security.Cryptography.OidGroup);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;Oid;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;get_FriendlyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;Oid;false;set_FriendlyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;Oid;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier].Element;value | | System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.OidEnumerator.Current];value | +| System.Security.Cryptography;OidCollection;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;OidCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;OidCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security.Cryptography;OidEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PKCS1MaskGenerationMethod;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PKCS1MaskGenerationMethod;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[2];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;PasswordDeriveBytes;(System.Byte[],System.Byte[],System.String,System.Int32,System.Security.Cryptography.CspParameters);;Argument[4];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;get_HashName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;PasswordDeriveBytes;false;set_HashName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;CreateOaep;(System.Security.Cryptography.HashAlgorithmName);;Argument[0];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAEncryptionPadding;false;get_OaepHashAlgorithm;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;RSAOAEPKeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;RSAOAEPKeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAOAEPKeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;RSAPKCS1KeyExchangeDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;get_RNG;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeDeformatter;false;set_RNG;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;RSAPKCS1KeyExchangeFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;get_Rng;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Cryptography;RSAPKCS1KeyExchangeFormatter;false;set_Rng;(System.Security.Cryptography.RandomNumberGenerator);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;RSAPKCS1SignatureDeformatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureDeformatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;RSAPKCS1SignatureFormatter;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetHashAlgorithm;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Cryptography;RSAPKCS1SignatureFormatter;false;SetKey;(System.Security.Cryptography.AsymmetricAlgorithm);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.Security.Principal.GenericIdentity);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;GenericIdentity;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericIdentity;false;get_AuthenticationType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;get_Claims;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericIdentity;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security.Principal;GenericPrincipal;false;GenericPrincipal;(System.Security.Principal.IIdentity,System.String[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security.Principal;GenericPrincipal;false;get_Identity;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;PermissionSet;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;AddAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;AddChild;(System.Security.SecurityElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;Attribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;Copy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SearchForChildByTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SearchForTextOfTag;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;SecurityElement;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Children;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Tag;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Security;SecurityElement;false;set_Children;(System.Collections.ArrayList);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;set_Tag;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityElement;false;set_Text;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Security;SecurityException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;false;Encode;(System.IO.TextWriter,System.String);;Argument[1];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.Char[],System.Int32,System.Int32);;Argument[1].Element;Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.IO.TextWriter,System.String,System.Int32,System.Int32);;Argument[1];Argument[0];generated:taint | +| System.Text.Encodings.Web;TextEncoder;true;Encode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json.Serialization;JsonStringEnumConverter;false;JsonStringEnumConverter;(System.Text.Json.JsonNamingPolicy,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.Buffers.ReadOnlySequence,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.IO.Stream,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;Parse;(System.ReadOnlyMemory,System.Text.Json.JsonDocumentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;ParseValue;(System.Text.Json.Utf8JsonReader);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;TryParseValue;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonDocument);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonDocument;false;get_RootElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement+ArrayEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text.Json;JsonElement;false;EnumerateArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;EnumerateObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.ReadOnlySpan,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;TryGetProperty;(System.String,System.Text.Json.JsonElement);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonElement;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonEncodedText;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;JsonException;(System.String,System.String,System.Nullable,System.Nullable,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonReaderState;false;JsonReaderState;(System.Text.Json.JsonReaderOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonReaderState;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializer;false;Deserialize;(System.Text.Json.Utf8JsonReader,System.Type,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializer;false;Deserialize<>;(System.Text.Json.Utf8JsonReader,System.Text.Json.JsonSerializerOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;JsonSerializerOptions;(System.Text.Json.JsonSerializerOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_DictionaryKeyPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_Encoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_PropertyNamingPolicy;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;get_ReferenceHandler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_DictionaryKeyPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_Encoder;(System.Text.Encodings.Web.JavaScriptEncoder);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_PropertyNamingPolicy;(System.Text.Json.JsonNamingPolicy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;JsonSerializerOptions;false;set_ReferenceHandler;(System.Text.Json.Serialization.ReferenceHandler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.Buffers.ReadOnlySequence,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;Utf8JsonReader;(System.ReadOnlySpan,System.Boolean,System.Text.Json.JsonReaderState);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonReader;false;get_CurrentState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;Utf8JsonReader;false;get_Position;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Reset;(System.Buffers.IBufferWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Reset;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.Buffers.IBufferWriter,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;Utf8JsonWriter;(System.IO.Stream,System.Text.Json.JsonWriterOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.Json;Utf8JsonWriter;false;get_Options;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;CaptureCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Group;false;Synchronized;(System.Text.RegularExpressions.Group);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;GroupCollection;false;TryGetValue;(System.String,System.Text.RegularExpressions.Group);;Argument[Qualifier];ReturnValue;generated:taint | | System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;GroupCollection;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Match;false;NextMatch;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Match;false;Synchronized;(System.Text.RegularExpressions.Match);;Argument[0];ReturnValue;generated:taint | | System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;MatchCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text.RegularExpressions;Regex;false;Escape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;GroupNameFromNumber;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;IsMatch;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;IsMatch;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Match;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[1];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Matches;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[3];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Replace;(System.String,System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Split;(System.String,System.String,System.Text.RegularExpressions.RegexOptions,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;Unescape;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_CapNames;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_Caps;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;Regex;false;set_CapNames;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;Regex;false;set_Caps;(System.Collections.IDictionary);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[2];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[3];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;RegexCompilationInfo;(System.String,System.Text.RegularExpressions.RegexOptions,System.String,System.String,System.Boolean,System.TimeSpan);;Argument[5];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_MatchTimeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;get_Pattern;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_MatchTimeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexCompilationInfo;false;set_Pattern;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexMatchTimeoutException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.RegularExpressions;RegexParseException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text.RegularExpressions;RegexRunner;false;Scan;(System.Text.RegularExpressions.Regex,System.String,System.Int32,System.Int32,System.Int32,System.Int32,System.Boolean,System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Decoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Decoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Decoder;false;set_Fallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;DecoderFallbackException;false;DecoderFallbackException;(System.String,System.Byte[],System.Int32);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Text;DecoderFallbackException;false;get_BytesUnknown;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallback;false;DecoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;DecoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;DecoderReplacementFallbackBuffer;false;DecoderReplacementFallbackBuffer;(System.Text.DecoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoder;false;get_Fallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoder;false;get_FallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoder;false;set_Fallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;EncoderReplacementFallback;false;CreateFallbackBuffer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;EncoderReplacementFallback;false;EncoderReplacementFallback;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;EncoderReplacementFallback;false;get_DefaultString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;EncoderReplacementFallbackBuffer;false;EncoderReplacementFallbackBuffer;(System.Text.EncoderReplacementFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Text;Encoding;false;Convert;(System.Text.Encoding,System.Text.Encoding,System.Byte[],System.Int32,System.Int32);;Argument[2].Element;ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];Argument[Qualifier];generated:taint | | System.Text;Encoding;false;GetBytes;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;taint | +| System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;Encoding;false;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[2];ReturnValue;generated:taint | | System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;false;get_DecoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;false;get_EncoderFallback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;false;set_DecoderFallback;(System.Text.DecoderFallback);;Argument[0];Argument[Qualifier];generated:taint | +| System.Text;Encoding;false;set_EncoderFallback;(System.Text.EncoderFallback);;Argument[0];Argument[Qualifier];generated:taint | | System.Text;Encoding;true;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char[]);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | @@ -1301,8 +6066,16 @@ | System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetDecoder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;Encoding;true;GetEncoder;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;Encoding;true;GetString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;EncodingProvider;true;GetEncoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;EncodingProvider;true;GetEncoding;(System.String,System.Text.EncoderFallback,System.Text.DecoderFallback);;Argument[1];ReturnValue;generated:taint | +| System.Text;SpanRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;SpanRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder+ChunkEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder+ChunkEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Text;StringBuilder;false;Append;(System.Boolean);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Byte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char);;Argument[Qualifier];ReturnValue;value | @@ -1380,11 +6153,129 @@ | System.Text;StringBuilder;false;AppendLine;();;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[Qualifier];ReturnValue;value | +| System.Text;StringBuilder;false;GetChunks;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Byte);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[]);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Decimal);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Double);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Int64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.SByte);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.Single);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.String,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Insert;(System.Int32,System.UInt64);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Remove;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Replace;(System.Char,System.Char,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringBuilder;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Text;StringBuilder;false;Replace;(System.String,System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:value | | System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];ReturnValue.Element;value | | System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];ReturnValue.Element;value | | System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];ReturnValue.Element;value | | System.Text;StringBuilder;false;ToString;();;Argument[Qualifier].Element;ReturnValue;taint | | System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue;taint | +| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Text;StringRuneEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;BatchBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;BatchedJoinBlock;(System.Int32,System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Collections.Generic.IList>>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BatchedJoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BroadcastBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;BufferBlock;(System.Threading.Tasks.Dataflow.DataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;BufferBlock<>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObservable<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;AsObserver<>;(System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Encapsulate<,>;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];Argument[1];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;LinkTo<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Post<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput);;Argument[1];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;Receive<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;ReceiveAsync<>;(System.Threading.Tasks.Dataflow.ISourceBlock,System.TimeSpan,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;SendAsync<>;(System.Threading.Tasks.Dataflow.ITargetBlock,TInput,System.Threading.CancellationToken);;Argument[1];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlock;false;TryReceive<>;(System.Threading.Tasks.Dataflow.IReceivableSourceBlock,TOutput);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_NameFormat;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_NameFormat;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;DataflowBlockOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,,>;false;get_Target3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;JoinBlock;(System.Threading.Tasks.Dataflow.GroupingDataflowBlockOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock>,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock>);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;JoinBlock<,>;false;get_Target2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;TransformManyBlock<,>;false;ReserveMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ConsumeMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];Argument[0];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;LinkTo;(System.Threading.Tasks.Dataflow.ITargetBlock,System.Threading.Tasks.Dataflow.DataflowLinkOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;OfferMessage;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,T,System.Threading.Tasks.Dataflow.ISourceBlock,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ReleaseReservation;(System.Threading.Tasks.Dataflow.DataflowMessageHeader,System.Threading.Tasks.Dataflow.ITargetBlock);;Argument[Qualifier];Argument[1];generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;TryReceiveAll;(System.Collections.Generic.IList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Dataflow;WriteOnceBlock<>;false;get_Completion;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;GetResult;(System.Int16);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetException;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks.Sources;ManualResetValueTaskSourceCore<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;ConcurrentExclusiveSchedulerPair;(System.Threading.Tasks.TaskScheduler,System.Int32,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ConcurrentScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ConcurrentExclusiveSchedulerPair;false;get_ExclusiveScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelLoopResult;false;get_LowestBreakIteration;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;get_TaskScheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ParallelOptions;false;set_CancellationToken;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ParallelOptions;false;set_TaskScheduler;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;Task;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | @@ -1405,7 +6296,11 @@ | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Delay;(System.Int32,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;Delay;(System.TimeSpan,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;FromCanceled;(System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;Run<>;(System.Func>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task;false;Run<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | @@ -1414,12 +6309,19 @@ | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | | System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;WhenAll;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAll;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;Task;false;WhenAny;(System.Threading.Tasks.Task[]);;Argument[0].Element;ReturnValue;generated:taint | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | | System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue.SyntheticField[m_configuredTaskAwaiter].SyntheticField[m_task_configured_task_awaitable];value | | System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[1];value | | System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | @@ -1475,6 +6377,19 @@ | System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;get_Result;();;Argument[Qualifier];ReturnValue;taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait;(System.IAsyncDisposable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;ConfigureAwait<>;(System.Collections.Generic.IAsyncEnumerable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskAsyncEnumerableExtensions;false;WithCancellation<>;(System.Collections.Generic.IAsyncEnumerable,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCanceledException;false;TaskCanceledException;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCanceledException;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCompletionSource;false;TaskCompletionSource;(System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;SetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;TrySetResult;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskCompletionSource<>;false;get_Task;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskExtensions;false;Unwrap;(System.Threading.Tasks.Task);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskExtensions;false;Unwrap<>;(System.Threading.Tasks.Task>);;Argument[0];ReturnValue;generated:taint | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | @@ -1523,6 +6438,12 @@ | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskFactory;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | @@ -1559,6 +6480,86 @@ | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;TaskFactory;(System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;TaskFactory<>;false;get_Scheduler;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;UnobservedTaskExceptionEventArgs;(System.AggregateException);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;UnobservedTaskExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;FromResult<>;(TResult);;Argument[0];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;AsTask;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;Preserve;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Sources.IValueTaskSource,System.Int16);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(System.Threading.Tasks.Task);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;ValueTask;(TResult);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading.Tasks;ValueTask<>;false;get_Result;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.Int32,System.Threading.WaitHandle);;Argument[1];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Exception,System.Int32,System.Threading.WaitHandle);;Argument[3];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;AbandonedMutexException;(System.String,System.Int32,System.Threading.WaitHandle);;Argument[2];Argument[Qualifier];generated:taint | +| System.Threading;AbandonedMutexException;false;get_Mutex;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CancellationToken;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CancellationTokenSource;false;get_Token;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;CompressedStack;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Threading;CountdownEvent;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;ExecutionContext;false;CreateCopy;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Threading;HostExecutionContextManager;false;SetHostExecutionContext;(System.Threading.HostExecutionContext);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Threading;LazyInitializer;false;EnsureInitialized<>;(T,System.Boolean,System.Object);;Argument[2];ReturnValue;generated:taint | +| System.Threading;ManualResetEventSlim;false;get_WaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;WaitAsync;(System.TimeSpan,System.Threading.CancellationToken);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;SemaphoreSlim;false;get_AvailableWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;Thread;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;Thread;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;ThreadExceptionEventArgs;false;ThreadExceptionEventArgs;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;ThreadExceptionEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;WaitHandle;false;set_SafeWaitHandle;(Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;WaitHandle;true;get_Handle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Threading;WaitHandle;true;set_Handle;(System.IntPtr);;Argument[0];Argument[Qualifier];generated:taint | +| System.Threading;WaitHandleExtensions;false;SetSafeWaitHandle;(System.Threading.WaitHandle,Microsoft.Win32.SafeHandles.SafeWaitHandle);;Argument[1];Argument[0];generated:taint | +| System.Timers;Timer;false;get_Site;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Timers;Timer;false;get_SynchronizingObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Timers;Timer;false;set_Site;(System.ComponentModel.ISite);;Argument[0];Argument[Qualifier];generated:taint | +| System.Timers;Timer;false;set_SynchronizingObject;(System.ComponentModel.ISynchronizeInvoke);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;CommittableTransaction;false;get_AsyncState;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;CommittableTransaction;false;get_AsyncWaitHandle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistDurable;(System.Guid,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistPromotableSinglePhase;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.IEnlistmentNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;EnlistVolatile;(System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;PromoteAndEnlistDurable;(System.Guid,System.Transactions.IPromotableSinglePhaseNotification,System.Transactions.ISinglePhaseNotification,System.Transactions.EnlistmentOptions);;Argument[0];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;Rollback;(System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;SetDistributedTransactionIdentifier;(System.Transactions.IPromotableSinglePhaseNotification,System.Guid);;Argument[1];Argument[Qualifier];generated:taint | +| System.Transactions;Transaction;false;get_PromoterType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;Transaction;false;get_TransactionInformation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionEventArgs;false;get_Transaction;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionInformation;false;get_DistributedIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionOptions;false;get_Timeout;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Transactions;TransactionOptions;false;set_Timeout;(System.TimeSpan);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.EnterpriseServicesInteropOption);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.TimeSpan,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint | +| System.Transactions;TransactionScope;false;TransactionScope;(System.Transactions.Transaction,System.Transactions.TransactionScopeAsyncFlowOption);;Argument[0];Argument[Qualifier];generated:taint | | System.Web.UI.WebControls;TextBox;false;get_Text;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Values;();;Argument[Qualifier];ReturnValue;taint | @@ -1566,6 +6567,8 @@ | System.Web;HttpServerUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlAttributeEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlAttributeEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | +| System.Web;HttpUtility;false;HtmlDecode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;HtmlDecode;(System.String,System.IO.TextWriter);;Argument[0];Argument[1];generated:taint | | System.Web;HttpUtility;false;HtmlEncode;(System.Object);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | @@ -1575,51 +6578,1302 @@ | System.Web;HttpUtility;false;UrlEncode;(System.Byte[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlEncodeToBytes;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;generated:taint | +| System.Web;HttpUtility;false;UrlPathEncode;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;ValueSerializerAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Windows.Markup;ValueSerializerAttribute;false;get_ValueSerializerTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Ancestors<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;AncestorsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Attributes;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantNodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantNodesAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Descendants<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;DescendantsAndSelf;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Elements<>;(System.Collections.Generic.IEnumerable,System.Xml.Linq.XName);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;InDocumentOrder<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;Extensions;false;Nodes<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;XAttribute;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_NextAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_PreviousAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XAttribute;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XCData;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XCData;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;XComment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XComment;false;XComment;(System.Xml.Linq.XComment);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XComment;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XComment;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;Add;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;AddFirst;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;AddFirst;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;CreateWriter;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;DescendantNodes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Descendants;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Descendants;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Element;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Elements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Elements;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;Nodes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XContainer;false;ReplaceNodes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XContainer;false;get_FirstNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XContainer;false;get_LastNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;XDeclaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDeclaration;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XDocument;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XDocument;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDeclaration,System.Object[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;XDocument;(System.Xml.Linq.XDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocument;false;get_Declaration;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;get_Root;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocument;false;set_Declaration;(System.Xml.Linq.XDeclaration);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;XDocumentType;(System.Xml.Linq.XDocumentType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XDocumentType;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XDocumentType;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;AncestorsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;AncestorsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attribute;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Attributes;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantNodesAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantsAndSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;DescendantsAndSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.Stream,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.TextReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.IO.TextReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Load;(System.Xml.XmlReader,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Parse;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;Parse;(System.String,System.Xml.Linq.LoadOptions);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;ReadXml;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAll;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;ReplaceAttributes;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XElement;false;SaveAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetAttributeValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetElementValue;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;SetValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XName,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;XElement;(System.Xml.Linq.XStreamingElement);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XElement;false;get_FirstAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_LastAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XElement;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XName;false;Get;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;Get;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XName;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;GetName;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNamespace;false;get_NamespaceName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;AddAfterSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;AddBeforeSelf;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;Ancestors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;Ancestors;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;CreateReader;(System.Xml.Linq.ReaderOptions);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ElementsAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ElementsAfterSelf;(System.Xml.Linq.XName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;NodesAfterSelf;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ReadFrom;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Linq;XNode;false;ReplaceWith;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XNode;false;ReplaceWith;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Linq;XNode;false;get_NextNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;AddAnnotation;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XObject;false;Annotation;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotation<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotations;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;Annotations<>;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_BaseUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;XProcessingInstruction;(System.Xml.Linq.XProcessingInstruction);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XProcessingInstruction;false;set_Target;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;XStreamingElement;(System.Xml.Linq.XName,System.Object[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Linq;XStreamingElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XStreamingElement;false;set_Name;(System.Xml.Linq.XName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Linq;XText;false;WriteToAsync;(System.Xml.XmlWriter,System.Threading.CancellationToken);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Linq;XText;false;XText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;XText;(System.Xml.Linq.XText);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Linq;XText;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Linq;XText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;XmlPreloadedResolver;(System.Xml.XmlResolver,System.Xml.Resolvers.XmlKnownDtds,System.Collections.Generic.IEqualityComparer);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Resolvers;XmlPreloadedResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;Extensions;false;GetSchemaInfo;(System.Xml.Linq.XElement);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;ValidationEventArgs;false;get_Exception;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;ValidationEventArgs;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;Clone;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlAtomicValue;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlAtomicValue;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlAtomicValue;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Elements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Includes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_TargetNamespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchema;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_TargetNamespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchema;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAll;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotated;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnnotation;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAny;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAny;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAnyAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAnyAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAppInfo;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_AttributeType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttribute;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;get_RedefinedAttributeGroup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaAttributeGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaChoice;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint | | System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaCollection;false;XmlSchemaCollection;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml.Schema;XmlSchemaComplexContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentExtension;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexContentRestriction;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeUses;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_AttributeWildcard;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_ContentModel;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_ContentTypeParticle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_ContentModel;(System.Xml.Schema.XmlSchemaContentModel);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaComplexType;false;set_Particle;(System.Xml.Schema.XmlSchemaParticle);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDatatype;true;ChangeType;(System.Object,System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Language;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Markup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Language;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Markup;(System.Xml.XmlNode[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaDocumentation;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_Constraints;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_DefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_ElementSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_ElementType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_FixedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SchemaTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;get_SubstitutionGroup;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_DefaultValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_FixedValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SchemaTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaElement;false;set_SubstitutionGroup;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;XmlSchemaException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_SourceSchemaObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_Schema;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_SchemaLocation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;get_UnhandledAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_Id;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_Schema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_SchemaLocation;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaExternal;false;set_UnhandledAttributes;(System.Xml.XmlAttribute[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaFacet;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaFacet;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroup;false;set_Particle;(System.Xml.Schema.XmlSchemaGroupBase);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;get_Particle;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;get_RefName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaGroupRef;false;set_RefName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Fields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;get_Selector;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaIdentityConstraint;false;set_Selector;(System.Xml.Schema.XmlSchemaXPath);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaImport;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInclude;false;get_Annotation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInclude;false;set_Annotation;(System.Xml.Schema.XmlSchemaAnnotation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Schema;XmlSchemaInference;false;InferSchema;(System.Xml.XmlReader,System.Xml.Schema.XmlSchemaSet);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInferenceException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;get_SchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_MemberType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaAttribute;(System.Xml.Schema.XmlSchemaAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaElement;(System.Xml.Schema.XmlSchemaElement);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaInfo;false;set_SchemaType;(System.Xml.Schema.XmlSchemaType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaKeyref;false;get_Refer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaKeyref;false;set_Refer;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_Public;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;get_System;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_Public;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaNotation;false;set_System;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_Namespaces;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_Parent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_Namespaces;(System.Xml.Serialization.XmlSerializerNamespaces);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_Parent;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObject;false;set_SourceUri;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current];value | | System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Remove;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaObjectCollection;false;XmlSchemaObjectCollection;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObjectTable;false;get_Names;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaObjectTable;false;get_Values;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_AttributeGroups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_Groups;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaRedefine;false;get_SchemaTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSequence;false;get_Items;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.String,System.Xml.XmlReader);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Add;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Reprocess;(System.Xml.Schema.XmlSchema);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;XmlSchemaSet;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_CompilationSettings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_GlobalTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;set_CompilationSettings;(System.Xml.Schema.XmlSchemaCompilationSettings);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSet;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContent;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContent;false;set_Content;(System.Xml.Schema.XmlSchemaContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentExtension;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_AnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Attributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_AnyAttribute;(System.Xml.Schema.XmlSchemaAnyAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleContentRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleType;false;get_Content;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleType;false;set_Content;(System.Xml.Schema.XmlSchemaSimpleTypeContent);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_BaseItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;get_ItemTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_BaseItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeList;false;set_ItemTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_BaseTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;get_Facets;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseType;(System.Xml.Schema.XmlSchemaSimpleType);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeRestriction;false;set_BaseTypeName;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseMemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_BaseTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;get_MemberTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaSimpleTypeUnion;false;set_MemberTypes;(System.Xml.XmlQualifiedName[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_BaseSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_BaseXmlSchemaType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_Datatype;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;get_QualifiedName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaType;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;SetSourceObject;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidationException;false;get_SourceObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;AddSchema;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;GetExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;GetExpectedParticles;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;Initialize;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;SkipToEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[3];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateAttribute;(System.String,System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateElement;(System.String,System.String,System.Xml.Schema.XmlSchemaInfo,System.String,System.String,System.String,System.String);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateEndElement;(System.Xml.Schema.XmlSchemaInfo,System.Object);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;ValidateWhitespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;XmlSchemaValidator;(System.Xml.XmlNameTable,System.Xml.Schema.XmlSchemaSet,System.Xml.IXmlNamespaceResolver,System.Xml.Schema.XmlSchemaValidationFlags);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_LineInfoProvider;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;get_ValidationEventSender;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_LineInfoProvider;(System.Xml.IXmlLineInfo);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_SourceUri;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_ValidationEventSender;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaValidator;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Schema;XmlSchemaXPath;false;get_XPath;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Schema;XmlSchemaXPath;false;set_XPath;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;Add;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;AddUnique;(System.String,System.Object);;Argument[Qualifier];Argument[1];generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;MakeUnique;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;CodeIdentifiers;false;ToArray;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;ImportContext;false;ImportContext;(System.Xml.Serialization.CodeIdentifiers,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;ImportContext;false;get_TypeIdentifiers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;ImportContext;false;get_Warnings;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;SoapAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributeOverrides;false;get_Item;(System.Type,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapEnum;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;get_SoapType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapAttribute;(System.Xml.Serialization.SoapAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapElement;(System.Xml.Serialization.SoapElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapEnum;(System.Xml.Serialization.SoapEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapAttributes;false;set_SoapType;(System.Xml.Serialization.SoapTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;SoapElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;SoapEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;SoapIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[]);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapReflectionImporter;false;SoapReflectionImporter;(System.Xml.Serialization.SoapAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapSchemaMember;false;set_MemberType;(System.Xml.XmlQualifiedName);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;SoapTypeAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;SoapTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;UnreferencedObjectEventArgs;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;UnreferencedObjectEventArgs;false;get_UnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;XmlAnyElementAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAnyElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Remove;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayAttribute;false;XmlArrayAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;XmlArrayItemAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlArrayItemAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Remove;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;XmlAttributeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_AttributeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_AttributeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_Attr;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_ExpectedAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributeOverrides;false;get_Item;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAnyAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAnyElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlArray;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlArrayItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlChoiceIdentifier;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlDefaultValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlEnum;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlRoot;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlText;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlAnyAttribute;(System.Xml.Serialization.XmlAnyAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlArray;(System.Xml.Serialization.XmlArrayAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlAttribute;(System.Xml.Serialization.XmlAttributeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlDefaultValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlEnum;(System.Xml.Serialization.XmlEnumAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlRoot;(System.Xml.Serialization.XmlRootAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlText;(System.Xml.Serialization.XmlTextAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlAttributes;false;set_XmlType;(System.Xml.Serialization.XmlTypeAttribute);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;XmlChoiceIdentifierAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlChoiceIdentifierAttribute;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownAttribute;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnknownNode;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlDeserializationEvents;false;get_OnUnreferencedObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.String,System.Type);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;XmlElementAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlElementAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Remove;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementEventArgs;false;get_Element;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementEventArgs;false;get_ExpectedElements;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlElementEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;XmlEnumAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlEnumAttribute;false;set_Name;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;XmlIncludeAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlIncludeAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlMapping;false;SetKey;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMapping;false;get_XsdElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMemberMapping;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlMembersMapping;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_ObjectBeingDeserialized;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlNodeEventArgs;false;get_Text;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportMembersMapping;(System.String,System.String,System.Xml.Serialization.XmlReflectionMember[],System.Boolean,System.Boolean,System.Boolean,System.Xml.Serialization.XmlMappingAccess);;Argument[2].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;ImportTypeMapping;(System.Type,System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionImporter;false;XmlReflectionImporter;(System.Xml.Serialization.XmlAttributeOverrides,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_MemberName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_MemberType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_SoapAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;get_XmlAttributes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_MemberName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_MemberType;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_SoapAttributes;(System.Xml.Serialization.SoapAttributes);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlReflectionMember;false;set_XmlAttributes;(System.Xml.Serialization.XmlAttributes);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;XmlRootAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_ElementName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_ElementName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlRootAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaEnumerator;false;XmlSchemaEnumerator;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaEnumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportMembersMapping;(System.Xml.Serialization.XmlMembersMapping,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlMembersMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;ExportTypeMapping;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaExporter;false;XmlSchemaExporter;(System.Xml.Serialization.XmlSchemas);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaProviderAttribute;false;XmlSchemaProviderAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemaProviderAttribute;false;get_MethodName;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Argument[Qualifier].Element;value | | System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;OnInsert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;OnSet;(System.Int32,System.Object,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSchemas;false;Remove;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | | System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_Collection;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+CollectionFixup;false;get_CollectionItems;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Callback;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Ids;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;get_Source;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader+Fixup;false;set_Source;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+CollectionFixup);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddFixup;(System.Xml.Serialization.XmlSerializationReader+Fixup);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;AddTarget;(System.String,System.Object);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;CollapseWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;EnsureArrayIndex;(System.Array,System.Int32,System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;GetTarget;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadNullableString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReference;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencedElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.Boolean,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadReferencingElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadSerializable;(System.Xml.Serialization.IXmlSerializable,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadString;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ReadTypedPrimitive;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ShrinkArray;(System.Array,System.Int32,System.Type,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToByteArrayBase64;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;ToXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;get_Document;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayBase64;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromByteArrayHex;(System.Byte[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[]);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromEnum;(System.Int64,System.String[],System.Int64[],System.String);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlNmTokens;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;FromXmlQualifiedName;(System.Xml.XmlQualifiedName,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteAttribute;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementEncoded;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementLiteral;(System.Xml.XmlNode,System.String,System.String,System.Boolean,System.Boolean);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementString;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[]);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteElementStringRaw;(System.String,System.String,System.Xml.XmlQualifiedName);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteId;(System.Object);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncoded;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.Byte[],System.Xml.XmlQualifiedName);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringEncodedRaw;(System.String,System.String,System.String,System.Xml.XmlQualifiedName);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteral;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.Byte[]);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteNullableStringLiteralRaw;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WritePotentiallyReferencingElement;(System.String,System.String,System.Object,System.Type,System.Boolean,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteReferencingElement;(System.String,System.String,System.Object,System.Boolean);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteRpcResult;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteSerializable;(System.Xml.Serialization.IXmlSerializable,System.String,System.String,System.Boolean,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteTypedPrimitive;(System.String,System.String,System.Object,System.Boolean);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.Byte[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXmlAttribute;(System.Xml.XmlNode,System.Object);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;WriteXsiType;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;get_Writer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializationWriter;false;set_Writer;(System.Xml.XmlWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.String,System.Xml.Serialization.XmlDeserializationEvents);;Argument[Qualifier];Argument[2];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;Deserialize;(System.Xml.XmlReader,System.Xml.Serialization.XmlDeserializationEvents);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[]);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;FromMappings;(System.Xml.Serialization.XmlMapping[],System.Type);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializer;false;XmlSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;XmlSerializerAssemblyAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_AssemblyName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;get_CodeBase;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_AssemblyName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerAssemblyAttribute;false;set_CodeBase;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlAttributeOverrides,System.Type[],System.Xml.Serialization.XmlRootAttribute,System.String,System.String);;Argument[4];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Type,System.Xml.Serialization.XmlRootAttribute);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerFactory;false;CreateSerializer;(System.Xml.Serialization.XmlTypeMapping);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;XmlSerializerVersionAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_ParentAssemblyId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_ParentAssemblyId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlSerializerVersionAttribute;false;set_Version;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;XmlTextAttribute;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;get_DataType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;get_Type;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;set_DataType;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTextAttribute;false;set_Type;(System.Type);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;XmlTypeAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;get_Namespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;set_Namespace;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Serialization;XmlTypeAttribute;false;set_TypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;Extensions;false;CreateNavigator;(System.Xml.Linq.XNode,System.Xml.XmlNameTable);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XDocumentExtensions;false;ToXPathNavigable;(System.Xml.Linq.XNode);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathDocument;false;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathDocument;false;XPathDocument;(System.Xml.XmlReader,System.Xml.XmlSpace);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;XPathException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.XPath;XPathException;false;XPathException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.XPath;XPathException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathExpression;false;Compile;(System.String,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XPathItem;true;ValueAs;(System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;ValueAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_TypedValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_ValueAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;false;get_XmlType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Compile;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Evaluate;(System.Xml.XPath.XPathExpression,System.Xml.XPath.XPathNodeIterator);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;GetNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;Select;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;SelectSingleNode;(System.Xml.XPath.XPathExpression);;Argument[0];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;WriteSubtree;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_InnerXml;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_OuterXml;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNavigator;true;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNodeIterator;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.XPath;XPathNodeIterator;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslCompiledTransform;false;Load;(System.Reflection.MethodInfo,System.Byte[],System.Type[]);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[0];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[2];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;Transform;(System.Xml.XPath.XPathNavigator,System.Xml.Xsl.XsltArgumentList,System.Xml.XmlResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XslTransform;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;GetExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;GetParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;RemoveExtensionObject;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltArgumentList;false;RemoveParam;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltCompileException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Xsl;XsltException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml.Xsl;XsltException;false;XsltException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml.Xsl;XsltException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml.Xsl;XsltException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Get;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;NameTable;false;Get;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;UniqueId;false;UniqueId;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;UniqueId;false;UniqueId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlAttribute;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlAttribute;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlAttribute;false;get_OwnerElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttribute;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;Append;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertAfter;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;InsertBefore;(System.Xml.XmlAttribute,System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;Prepend;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;Remove;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlAttributeCollection;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_ItemOf;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlAttributeCollection;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;Add;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.String,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlBinaryReaderSession;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlCDataSection;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCDataSection;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlCharacterData;false;XmlCharacterData;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;true;AppendData;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlCharacterData;true;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCharacterData;true;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlCharacterData;true;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlComment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;DecodeName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeLocalName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;EncodeNmToken;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyNCName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyNMTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyPublicId;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyTOKEN;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyWhitespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlConvert;false;VerifyXmlChars;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetElementFromRow;(System.Data.DataRow);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;GetRowFromElement;(System.Xml.XmlElement);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;XmlDataDocument;(System.Data.DataSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDataDocument;false;get_DataSet;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;get_Standalone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDeclaration;false;set_Encoding;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDeclaration;false;set_Standalone;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionary;false;Add;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;Add;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionary;false;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[5];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateDictionaryReader;(System.Xml.XmlReader);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;CreateTextReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadContentAsString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;false;ReadString;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;GetAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;GetNonAtomizedNames;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadArray;(System.String,System.String,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.DateTime[],System.Int32,System.Int32);;Argument[Qualifier];Argument[2].Element;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsQualifiedName;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsString;(System.Xml.XmlDictionaryString[],System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadDateTimeArray;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryReader;true;ReadElementContentAsUniqueId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryString;false;XmlDictionaryString;(System.Xml.IXmlDictionary,System.String,System.Int32);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryString;false;get_Dictionary;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryString;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateBinaryWriter;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlBinaryWriterSession,System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;CreateDictionaryWriter;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteAttributeString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteBase64Async;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteElementString;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;false;WriteStartAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteQualifiedName;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteStartAttribute;(System.String,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteString;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteTextNode;(System.Xml.XmlDictionaryReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteValue;(System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlAttribute;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDictionaryWriter;true;WriteXmlnsAttribute;(System.String,System.Xml.XmlDictionaryString);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocument;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateAttribute;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentFragment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateDocumentType;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateElement;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateEntityReference;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNavigator;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateNode;(System.Xml.XmlNodeType,System.String,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateProcessingInstruction;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;CreateXmlDeclaration;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;ImportNode;(System.Xml.XmlNode,System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];taint | +| System.Xml;XmlDocument;false;Save;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocument;false;XmlDocument;(System.Xml.XmlImplementation);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocument;false;get_DocumentElement;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_DocumentType;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_Implementation;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocument;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocument;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentFragment;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentFragment;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocumentFragment;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlDocumentFragment;false;XmlDocumentFragment;(System.Xml.XmlDocument);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;XmlDocumentType;(System.String,System.String,System.String,System.String,System.Xml.XmlDocument);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlDocumentType;false;get_Entities;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_Notations;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlDocumentType;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttributeNode;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;GetElementsByTagName;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeAt;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;RemoveAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttribute;(System.String,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlElement;false;SetAttributeNode;(System.Xml.XmlAttribute);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlElement;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlElement;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlElement;false;set_Prefix;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlEntity;false;get_NotationName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntity;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntity;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntityReference;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlEntityReference;false;WriteContentTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlEntityReference;false;XmlEntityReference;(System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlException;false;XmlException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlException;false;get_SourceUri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlImplementation;false;CreateDocument;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlImplementation;false;XmlImplementation;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String);;Argument[Qualifier];ReturnValue;value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;value | +| System.Xml;XmlNamedNodeMap;false;Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;RemoveNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNamedNodeMap;false;SetNamedItem;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;XmlNamespaceManager;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlNamespaceManager;false;get_DefaultNamespace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNamespaceManager;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNode;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNode;false;SelectNodes;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectNodes;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;AppendChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;CreateNavigator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;GetNamespaceOfPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;GetPrefixOfNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertAfter;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[1].Element;generated:taint | +| System.Xml;XmlNode;true;InsertBefore;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;PrependChild;(System.Xml.XmlNode);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;RemoveChild;(System.Xml.XmlNode);;Argument[0].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[0].Element;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[1].Element;ReturnValue;generated:taint | +| System.Xml;XmlNode;true;ReplaceChild;(System.Xml.XmlNode,System.Xml.XmlNode);;Argument[Qualifier];Argument[0].Element;generated:taint | | System.Xml;XmlNode;true;get_Attributes;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_ChildNodes;();;Argument[Qualifier];ReturnValue;taint | @@ -1628,6 +7882,8 @@ | System.Xml;XmlNode;true;get_InnerText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNode;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNode;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | | System.Xml;XmlNode;true;get_LastChild;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_Name;();;Argument[Qualifier];ReturnValue;taint | @@ -1642,6 +7898,69 @@ | System.Xml;XmlNode;true;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[2].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;XmlNodeChangedEventArgs;(System.Xml.XmlNode,System.Xml.XmlNode,System.Xml.XmlNode,System.String,System.String,System.Xml.XmlNodeChangedAction);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_NewParent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_NewValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_Node;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_OldParent;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeChangedEventArgs;false;get_OldValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeList;true;get_ItemOf;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;GetAttribute;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;GetAttribute;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;LookupNamespace;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;XmlNodeReader;(System.Xml.XmlNode);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlNodeReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_LocalName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_NamespaceURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_Prefix;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNodeReader;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNotation;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlNotation;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[1].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[4];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[5];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[6];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[7];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;XmlParserContext;(System.Xml.XmlNameTable,System.Xml.XmlNamespaceManager,System.String,System.String,System.String,System.String,System.String,System.String,System.Xml.XmlSpace,System.Text.Encoding);;Argument[9];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_DocTypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_InternalSubset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_NamespaceManager;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_PublicId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_SystemId;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlParserContext;false;set_BaseURI;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_DocTypeName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_InternalSubset;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_NamespaceManager;(System.Xml.XmlNamespaceManager);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_PublicId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_SystemId;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlParserContext;false;set_XmlLang;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlProcessingInstruction;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;XmlProcessingInstruction;(System.String,System.String,System.Xml.XmlDocument);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;get_Data;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlProcessingInstruction;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlProcessingInstruction;false;set_Data;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;set_InnerText;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlProcessingInstruction;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlQualifiedName;false;ToString;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.IO.Stream,System.Xml.XmlReaderSettings,System.String);;Argument[0];ReturnValue;taint | @@ -1654,9 +7973,137 @@ | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.Xml.XmlReader,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | +| System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAs;(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsDateTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsDateTime;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsObject;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementContentAsString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadElementString;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;ReadSubtree;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Item;(System.String,System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_Name;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReader;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReaderSettings;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlReaderSettings;false;set_NameTable;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlReaderSettings;false;set_Schemas;(System.Xml.Schema.XmlSchemaSet);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlReaderSettings;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlResolver;true;ResolveUri;(System.Uri,System.String);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlSecureResolver;false;XmlSecureResolver;(System.Xml.XmlResolver,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlSecureResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlSignificantWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlSignificantWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlSignificantWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlText;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlText;false;SplitText;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlText;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlText;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;GetRemainder;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.IO.TextReader,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;XmlTextReader;(System.Xml.XmlNameTable);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextReader;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;get_NameTable;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextReader;false;set_XmlResolver;(System.Xml.XmlResolver);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;LookupPrefix;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextWriter;false;WriteStartAttribute;(System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.Stream,System.Text.Encoding);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;XmlTextWriter;(System.IO.TextWriter);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlTextWriter;false;get_BaseStream;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlTextWriter;false;get_XmlLang;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlUrlResolver;false;set_Credentials;(System.Net.ICredentials);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlUrlResolver;false;set_Proxy;(System.Net.IWebProxy);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;LookupNamespace;(System.String);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;XmlValidatingReader;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlValidatingReader;false;get_Reader;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlValidatingReader;false;get_Schemas;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWhitespace;false;CloneNode;(System.Boolean);;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWhitespace;false;WriteTo;(System.Xml.XmlWriter);;Argument[Qualifier];Argument[0];generated:taint | +| System.Xml;XmlWhitespace;false;set_Value;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.Stream,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.IO.TextWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.String,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Text.StringBuilder,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[0];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;Create;(System.Xml.XmlWriter,System.Xml.XmlWriterSettings);;Argument[1];ReturnValue;generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteAttributeStringAsync;(System.String,System.String,System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String);;Argument[2];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteElementString;(System.String,System.String,System.String,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteStartAttribute;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;false;WriteStartAttribute;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteAttributes;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteAttributesAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNmToken;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNode;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNode;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XPath.XPathNavigator,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteNodeAsync;(System.Xml.XmlReader,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteQualifiedName;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteValue;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriter;true;WriteValue;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;get_Encoding;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;get_IndentChars;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;get_NewLineChars;();;Argument[Qualifier];ReturnValue;generated:taint | +| System.Xml;XmlWriterSettings;false;set_Encoding;(System.Text.Encoding);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;set_IndentChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System.Xml;XmlWriterSettings;false;set_NewLineChars;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;AggregateException;false;AggregateException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;AggregateException;false;AggregateException;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;AggregateException;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AggregateException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;AggregateException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AggregateException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;AppDomain;false;ApplyPolicy;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;ArgumentException;false;ArgumentException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;ArgumentException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;ArgumentException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ArgumentException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentException;false;get_ParamName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ArgumentOutOfRangeException;false;ArgumentOutOfRangeException;(System.String,System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;ArgumentOutOfRangeException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ArgumentOutOfRangeException;false;get_ActualValue;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArgumentOutOfRangeException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Array;false;AsReadOnly<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;CopyTo;(System.Array,System.Int64);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;Array;false;Fill<>;(T[],T);;Argument[1];Argument[0].Element;generated:taint | +| System;Array;false;Fill<>;(T[],T,System.Int32,System.Int32);;Argument[1];Argument[0].Element;generated:taint | | System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | | System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | | System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | @@ -1667,6 +8114,23 @@ | System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;Reverse<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | | System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;get_SyncRoot;();;Argument[Qualifier];ReturnValue;generated:value | +| System;ArraySegment<>+Enumerator;false;get_Current;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;ArraySegment;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ArraySegment<>;false;ArraySegment;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;get_Array;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ArraySegment<>;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;BadImageFormatException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;BadImageFormatException;(System.String,System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;BadImageFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;BadImageFormatException;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_FileName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_FusionLog;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;BadImageFormatException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Boolean;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;Argument[1];taint | | System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;ReturnValue;taint | @@ -1999,6 +8463,61 @@ | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[1].Element;taint | | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[2];taint | | System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;DBNull;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTime;false;GetDateTimeFormats;(System.Char,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value | +| System;DateTime;false;ToLocalTime;();;Argument[Qualifier];ReturnValue;generated:value | +| System;DateTime;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;DateTime;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;DateTime;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTime;false;ToUniversalTime;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;DateTimeOffset;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;DateTimeOffset;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;DateTimeOffset;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Decimal;false;ToDecimal;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:value | +| System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;Combine;(System.Delegate,System.Delegate);;Argument[1];ReturnValue;generated:taint | +| System;Delegate;false;Combine;(System.Delegate[]);;Argument[0].Element;ReturnValue;generated:taint | +| System;Delegate;false;CreateDelegate;(System.Type,System.Reflection.MethodInfo,System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System;Delegate;false;Delegate;(System.Object,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Object,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Type,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Delegate;false;Delegate;(System.Type,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Delegate;false;DynamicInvoke;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System;Delegate;false;Remove;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;RemoveAll;(System.Delegate,System.Delegate);;Argument[0];ReturnValue;generated:taint | +| System;Delegate;false;get_Method;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;false;get_Target;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;DynamicInvokeImpl;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| System;Delegate;true;GetInvocationList;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;GetMethodImpl;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Delegate;true;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Double;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Double;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Double;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Enum;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint | +| System;Enum;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Environment;false;ExpandEnvironmentVariables;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Exception;false;Exception;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String,System.Exception);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;Exception;(System.String,System.Exception);;Argument[1];Argument[Qualifier];generated:taint | +| System;Exception;false;GetBaseException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Exception;false;get_HelpLink;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_InnerException;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_StackTrace;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;get_TargetSite;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Exception;false;set_HelpLink;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Exception;false;set_Source;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;FormattableString;false;CurrentCulture;(System.FormattableString);;Argument[0];ReturnValue;generated:taint | +| System;FormattableString;false;Invariant;(System.FormattableString);;Argument[0];ReturnValue;generated:taint | +| System;FormattableString;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;FormattableString;false;ToString;(System.String,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Half;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Half;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | | System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles);;Argument[0];ReturnValue;taint | @@ -2012,16 +8531,112 @@ | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];Argument[1];taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];ReturnValue;taint | +| System;IntPtr;false;IntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint | +| System;IntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;Lazy;(TMetadata,System.Threading.LazyThreadSafetyMode);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<,>;false;get_Metadata;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Lazy<>;false;Lazy;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(T);;Argument[0];Argument[Qualifier];generated:taint | +| System;Lazy<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Lazy<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System;Memory<>;false;Memory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;Memory<>;false;Memory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;Memory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Memory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Memory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Index);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory;(System.String,System.Range);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(System.ArraySegment,System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[]);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Index);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;AsMemory<>;(T[],System.Range);;Argument[0].Element;ReturnValue;generated:taint | +| System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;Trim<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimEnd<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart;(System.Memory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart;(System.ReadOnlyMemory);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Memory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Memory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlyMemory,T);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MemoryExtensions;false;TrimStart<>;(System.Span,System.ReadOnlySpan);;Argument[0];ReturnValue;generated:taint | +| System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingFieldException;false;MissingFieldException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingFieldException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MissingMemberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;MissingMemberException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingMemberException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;MissingMethodException;false;MissingMethodException;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;MissingMethodException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;MulticastDelegate;false;CombineImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value | +| System;MulticastDelegate;false;RemoveImpl;(System.Delegate);;Argument[Qualifier];ReturnValue;generated:value | +| System;NotFiniteNumberException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Nullable;false;GetUnderlyingType;(System.Type);;Argument[0];ReturnValue;generated:taint | | System;Nullable<>;false;GetValueOrDefault;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[0];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;Nullable;(T);;Argument[0];ReturnValue.Property[System.Nullable<>.Value];value | +| System;Nullable<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Nullable<>;false;get_HasValue;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;taint | | System;Nullable<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | +| System;ObjectDisposedException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;ObjectDisposedException;false;ObjectDisposedException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;ObjectDisposedException;false;ObjectDisposedException;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;ObjectDisposedException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ObjectDisposedException;false;get_ObjectName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;Clone;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_ServicePack;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_Version;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperatingSystem;false;get_VersionString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Exception,System.Threading.CancellationToken);;Argument[2];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.String,System.Threading.CancellationToken);;Argument[1];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;OperationCanceledException;(System.Threading.CancellationToken);;Argument[0];Argument[Qualifier];generated:taint | +| System;OperationCanceledException;false;get_CancellationToken;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[]);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ReadOnlyMemory<>;false;ReadOnlyMemory;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];generated:taint | +| System;ReadOnlyMemory<>;false;Slice;(System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;Slice;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlyMemory<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;ReadOnlySpan<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeFieldHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeMethodHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;RuntimeTypeHandle;false;get_Value;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;SequencePosition;false;GetObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;SequencePosition;false;SequencePosition;(System.Object,System.Int32);;Argument[0];Argument[Qualifier];generated:taint | +| System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;generated:taint | +| System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;generated:taint | +| System;Span<>;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Clone;();;Argument[Qualifier];ReturnValue;value | | System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint | @@ -2052,6 +8667,7 @@ | System;String;false;Concat;(System.String[]);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Copy;(System.String);;Argument[0];ReturnValue;value | +| System;String;false;EnumerateRunes;();;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[2];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];ReturnValue;taint | @@ -2108,6 +8724,9 @@ | System;String;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;taint | +| System;String;false;Replace;(System.String,System.String,System.Boolean,System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;generated:taint | +| System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[1];ReturnValue;generated:taint | +| System;String;false;Replace;(System.String,System.String,System.StringComparison);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | | System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | | System;String;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue.Element;taint | @@ -2122,11 +8741,13 @@ | System;String;false;String;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;String;false;Substring;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | +| System;String;false;ToDateTime;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;ToLower;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLower;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLowerInvariant;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToString;();;Argument[Qualifier];ReturnValue;value | | System;String;false;ToString;(System.IFormatProvider);;Argument[Qualifier];ReturnValue;value | +| System;String;false;ToType;(System.Type,System.IFormatProvider);;Argument[Qualifier];ReturnValue;generated:taint | | System;String;false;ToUpper;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToUpper;(System.Globalization.CultureInfo);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToUpperInvariant;();;Argument[Qualifier];ReturnValue;taint | @@ -2139,6 +8760,58 @@ | System;String;false;TrimStart;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char[]);;Argument[Qualifier];ReturnValue;taint | +| System;StringNormalizationExtensions;false;Normalize;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;StringNormalizationExtensions;false;Normalize;(System.String,System.Text.NormalizationForm);;Argument[0];ReturnValue;generated:taint | +| System;TimeZone;true;ToLocalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZone;true;ToUniversalTime;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;CreateAdjustmentRule;(System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo+TransitionTime,System.TimeZoneInfo+TransitionTime);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DateEnd;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DateStart;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightDelta;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionEnd;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+AdjustmentRule;false;get_DaylightTransitionStart;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;CreateFixedDateRule;(System.DateTime,System.Int32,System.Int32);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;CreateFloatingDateRule;(System.DateTime,System.Int32,System.Int32,System.DayOfWeek);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo+TransitionTime;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo+TransitionTime;false;get_TimeOfDay;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTime;(System.DateTime,System.TimeZoneInfo,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeBySystemTimeZoneId;(System.DateTime,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeFromUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ConvertTimeToUtc;(System.DateTime,System.TimeZoneInfo);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[]);;Argument[5].Element;ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[1];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[2];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[3];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[4];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;CreateCustomTimeZone;(System.String,System.TimeSpan,System.String,System.String,System.String,System.TimeZoneInfo+AdjustmentRule[],System.Boolean);;Argument[5].Element;ReturnValue;generated:taint | +| System;TimeZoneInfo;false;FindSystemTimeZoneById;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TimeZoneInfo;false;GetUtcOffset;(System.DateTime);;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;GetUtcOffset;(System.DateTimeOffset);;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_BaseUtcOffset;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_DaylightName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_DisplayName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_Id;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TimeZoneInfo;false;get_StandardName;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | | System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | @@ -2174,6 +8847,7 @@ | System;Tuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | | System;Tuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | | System;Tuple;false;Create<>;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | @@ -2181,6 +8855,13 @@ | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | | System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple<,,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item3];ReturnValue;value | @@ -2188,6 +8869,8 @@ | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item6];ReturnValue;value | | System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Rest;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | @@ -2195,6 +8878,13 @@ | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | | System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple<,,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,,>;false;get_Item7;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item3];ReturnValue;value | @@ -2202,47 +8892,74 @@ | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item6];ReturnValue;value | | System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | | System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple<,,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,,>;false;get_Item6;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item3];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item4];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item5];ReturnValue;value | | System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | | System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple<,,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,,>;false;get_Item5;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item1];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item2];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item3];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item4];ReturnValue;value | | System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | | System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple<,,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,,>;false;get_Item4;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item1];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item2];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item3];ReturnValue;value | | System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item4];ReturnValue;value | +| System;Tuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | | System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple<,,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,,>;false;get_Item3;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item1];ReturnValue;value | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item2];ReturnValue;value | | System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item3];ReturnValue;value | +| System;Tuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | | System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple<,>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Tuple<,>;false;get_Item2;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item1];ReturnValue;value | | System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item2];ReturnValue;value | +| System;Tuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<>;false;Tuple;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<>;false;get_Item1;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Tuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<>.Item1];ReturnValue;value | | System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | | System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | @@ -2370,13 +9087,159 @@ | System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item1];Argument[1];value | | System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item2];Argument[2];value | | System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Argument[0].Property[System.Tuple<>.Item1];Argument[1];value | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,,>;(System.ValueTuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,,>;(System.ValueTuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<,>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToTuple<>;(System.ValueTuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,,>;(System.Tuple>>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,,>;(System.Tuple>);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<,>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;TupleExtensions;false;ToValueTuple<>;(System.Tuple);;Argument[0];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructor;(System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetConstructors;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetEvent;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetField;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetFields;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetInterface;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMember;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMembers;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Int32,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethod;(System.String,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetMethods;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetNestedType;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetNestedTypes;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperties;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type,System.Type[],System.Reflection.ParameterModifier[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;GetProperty;(System.String,System.Type[]);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;MakeGenericSignatureType;(System.Type,System.Type[]);;Argument[0];ReturnValue;generated:taint | +| System;Type;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;false;get_TypeInitializer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;GetEvents;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;GetMember;(System.String,System.Reflection.BindingFlags);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Type;true;get_GenericTypeArguments;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeInitializationException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TypeInitializationException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeLoadException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;TypeLoadException;false;TypeLoadException;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | +| System;TypeLoadException;false;get_Message;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;TypeLoadException;false;get_TypeName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UIntPtr;false;ToPointer;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UIntPtr;false;UIntPtr;(System.Void*);;Argument[0];Argument[Qualifier];generated:taint | +| System;UnhandledExceptionEventArgs;false;UnhandledExceptionEventArgs;(System.Object,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;UnhandledExceptionEventArgs;false;get_ExceptionObject;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;EscapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;EscapeString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;EscapeUriString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;GetComponents;(System.UriComponents,System.UriFormat);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;GetLeftPart;(System.UriPartial);;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;Uri;false;MakeRelative;(System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;MakeRelativeUri;(System.Uri);;Argument[0];ReturnValue;generated:taint | | System;Uri;false;ToString;();;Argument[Qualifier];ReturnValue;taint | +| System;Uri;false;TryCreate;(System.String,System.UriKind,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.String,System.Uri);;Argument[1];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;TryCreate;(System.Uri,System.Uri,System.Uri);;Argument[1];ReturnValue;generated:taint | +| System;Uri;false;UnescapeDataString;(System.String);;Argument[0];ReturnValue;generated:taint | +| System;Uri;false;Uri;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[0];Argument[Qualifier];generated:taint | | System;Uri;false;Uri;(System.String);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.UriKind);;Argument[0];ReturnValue;taint | +| System;Uri;false;Uri;(System.Uri,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.String,System.Boolean);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System;Uri;false;Uri;(System.Uri,System.Uri);;Argument[1];Argument[Qualifier];generated:taint | +| System;Uri;false;get_Authority;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_DnsSafeHost;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_IdnHost;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_LocalPath;();;Argument[Qualifier];ReturnValue;generated:taint | | System;Uri;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_PathAndQuery;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_Query;();;Argument[Qualifier];ReturnValue;taint | +| System;Uri;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;Uri;false;get_UserInfo;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String);;Argument[1];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String);;Argument[3];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.String,System.String,System.Int32,System.String,System.String);;Argument[4];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;UriBuilder;(System.Uri);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;get_Fragment;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Host;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Password;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Path;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Query;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Scheme;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_Uri;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;get_UserName;();;Argument[Qualifier];ReturnValue;generated:taint | +| System;UriBuilder;false;set_Fragment;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Host;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Password;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Path;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Query;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_Scheme;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriBuilder;false;set_UserName;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| System;UriFormatException;false;GetObjectData;(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext);;Argument[Qualifier];Argument[0];generated:taint | +| System;UriParser;false;Register;(System.UriParser,System.String,System.Int32);;Argument[1];Argument[0];generated:taint | +| System;UriParser;true;GetComponents;(System.Uri,System.UriComponents,System.UriFormat);;Argument[0];ReturnValue;generated:taint | +| System;UriParser;true;OnNewUri;();;Argument[Qualifier];ReturnValue;generated:value | +| System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[0];ReturnValue;generated:taint | +| System;UriParser;true;Resolve;(System.Uri,System.Uri,System.UriFormatException);;Argument[1];ReturnValue;generated:taint | +| System;UriTypeConverter;false;ConvertFrom;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object);;Argument[2];ReturnValue;generated:taint | +| System;UriTypeConverter;false;ConvertTo;(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object,System.Type);;Argument[2];ReturnValue;generated:taint | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | | System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | @@ -2412,6 +9275,7 @@ | System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | | System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | | System;ValueTuple;false;Create<>;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | | System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | @@ -2426,6 +9290,7 @@ | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item6];ReturnValue;value | | System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | | System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | @@ -2440,6 +9305,7 @@ | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item6];ReturnValue;value | | System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | | System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | @@ -2452,6 +9318,7 @@ | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item4];ReturnValue;value | | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item5];ReturnValue;value | | System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | | System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | @@ -2462,6 +9329,7 @@ | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item3];ReturnValue;value | | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item4];ReturnValue;value | | System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | | System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | @@ -2470,15 +9338,18 @@ | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item2];ReturnValue;value | | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item3];ReturnValue;value | | System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | | System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item1];ReturnValue;value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item2];ReturnValue;value | | System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item3];ReturnValue;value | +| System;ValueTuple<,>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | | System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | | System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item1];ReturnValue;value | | System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item2];ReturnValue;value | +| System;ValueTuple<>;false;ToString;();;Argument[Qualifier];ReturnValue;generated:taint | | System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | | System;ValueTuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<>.Item1];ReturnValue;value | diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.ql b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.ql index 513fe486b2c..961faf60084 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.ql +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.ql @@ -1,4 +1,5 @@ import shared.FlowSummaries +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate::Csv private import semmle.code.csharp.dataflow.ExternalFlow class IncludeFilteredSummarizedCallable extends IncludeSummarizedCallable { @@ -12,10 +13,10 @@ class IncludeFilteredSummarizedCallable extends IncludeSummarizedCallable { override predicate relevantSummary( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { - this.propagatesFlow(input, output, preservesValue) and + this.(SummarizedCallable).propagatesFlow(input, output, preservesValue) and not exists(IncludeSummarizedCallable rsc | - rsc.isBaseCallableOrPrototype() and - rsc.propagatesFlow(input, output, preservesValue) and + isBaseCallableOrPrototype(rsc) and + rsc.(SummarizedCallable).propagatesFlow(input, output, preservesValue) and this.(UnboundCallable).overridesOrImplementsUnbound(rsc) ) } diff --git a/csharp/ql/test/library-tests/dispatch/viableCallable.expected b/csharp/ql/test/library-tests/dispatch/viableCallable.expected index 74028980ba8..5a78d028b6c 100644 --- a/csharp/ql/test/library-tests/dispatch/viableCallable.expected +++ b/csharp/ql/test/library-tests/dispatch/viableCallable.expected @@ -216,16 +216,19 @@ | ViableCallable.cs:178:13:178:17 | dynamic call to operator + | + | Double | | ViableCallable.cs:178:13:178:17 | dynamic call to operator + | + | Int32 | | ViableCallable.cs:178:13:178:17 | dynamic call to operator + | + | Int64 | +| ViableCallable.cs:178:13:178:17 | dynamic call to operator + | + | NFloat | | ViableCallable.cs:178:13:178:17 | dynamic call to operator + | + | Single | | ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | Decimal | | ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | Double | | ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | Int32 | | ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | Int64 | +| ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | NFloat | | ViableCallable.cs:180:13:180:17 | dynamic call to operator - | - | Single | | ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | Decimal | | ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | Double | | ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | Int32 | | ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | Int64 | +| ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | NFloat | | ViableCallable.cs:182:13:182:18 | dynamic call to operator + | + | Single | | ViableCallable.cs:185:17:185:25 | object creation of type C10 | C10 | C10 | | ViableCallable.cs:186:9:186:153 | call to method InvokeMember | + | C10 | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected index 6120caaad32..5f7866b09d1 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected @@ -82,97 +82,97 @@ edges | EntityFramework.cs:219:18:219:36 | call to method First [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | | EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | | EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | EntityFramework.cs:219:18:219:61 | access to property Street | -| EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:76:18:76:28 | access to local variable taintSource | -| EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:77:35:77:45 | access to local variable taintSource : String | -| EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:78:18:78:42 | (...) ... | -| EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:78:32:78:42 | access to local variable taintSource : String | -| EntityFrameworkCore.cs:77:18:77:46 | object creation of type RawSqlString : RawSqlString | EntityFrameworkCore.cs:77:18:77:46 | (...) ... | -| EntityFrameworkCore.cs:77:35:77:45 | access to local variable taintSource : String | EntityFrameworkCore.cs:77:18:77:46 | object creation of type RawSqlString : RawSqlString | -| EntityFrameworkCore.cs:78:18:78:42 | call to operator implicit conversion : RawSqlString | EntityFrameworkCore.cs:78:18:78:42 | (...) ... | -| EntityFrameworkCore.cs:78:32:78:42 | access to local variable taintSource : String | EntityFrameworkCore.cs:78:18:78:42 | call to operator implicit conversion : RawSqlString | -| EntityFrameworkCore.cs:85:13:88:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:92:29:92:30 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:87:24:87:32 | "tainted" : String | EntityFrameworkCore.cs:85:13:88:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:92:13:92:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:94:13:94:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:92:13:92:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:92:13:92:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:92:29:92:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:92:13:92:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:94:13:94:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:107:13:110:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:114:29:114:30 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:109:24:109:32 | "tainted" : String | EntityFrameworkCore.cs:107:13:110:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:114:13:114:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:116:19:116:21 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:114:13:114:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:114:13:114:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:114:29:114:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:114:13:114:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:116:19:116:21 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:129:13:132:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:135:27:135:28 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:131:24:131:32 | "tainted" : String | EntityFrameworkCore.cs:129:13:132:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:135:27:135:28 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:219:35:219:35 | p [property Name] : String | -| EntityFrameworkCore.cs:148:13:151:13 | { ..., ... } [property Title] : String | EntityFrameworkCore.cs:155:18:155:19 | access to local variable p1 [property Title] : String | -| EntityFrameworkCore.cs:150:25:150:33 | "tainted" : String | EntityFrameworkCore.cs:148:13:151:13 | { ..., ... } [property Title] : String | -| EntityFrameworkCore.cs:155:18:155:19 | access to local variable p1 [property Title] : String | EntityFrameworkCore.cs:155:18:155:25 | access to property Title | -| EntityFrameworkCore.cs:167:13:174:13 | { ..., ... } [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:175:29:175:30 | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:168:29:173:17 | array creation of type Address[] [element, property Street] : String | EntityFrameworkCore.cs:167:13:174:13 | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:168:35:173:17 | { ..., ... } [element, property Street] : String | EntityFrameworkCore.cs:168:29:173:17 | array creation of type Address[] [element, property Street] : String | -| EntityFrameworkCore.cs:169:21:172:21 | object creation of type Address [property Street] : String | EntityFrameworkCore.cs:168:35:173:17 | { ..., ... } [element, property Street] : String | -| EntityFrameworkCore.cs:169:33:172:21 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:169:21:172:21 | object creation of type Address [property Street] : String | -| EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | EntityFrameworkCore.cs:169:33:172:21 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:176:13:176:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:180:13:180:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:13:175:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:29:175:30 | access to local variable p1 [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:175:13:175:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:176:13:176:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:176:13:176:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:180:13:180:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:180:13:180:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:183:13:186:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:187:31:187:32 | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | EntityFrameworkCore.cs:183:13:186:13 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:187:13:187:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:25 | [post] access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:187:13:187:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:31:187:32 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:187:13:187:25 | [post] access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:202:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:208:71:208:72 | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:201:24:201:32 | "tainted" : String | EntityFrameworkCore.cs:199:13:202:13 | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:204:13:207:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:208:85:208:86 | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | EntityFrameworkCore.cs:204:13:207:13 | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Address, property Street] : String | EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Person, property Name] : String | EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFrameworkCore.cs:208:71:208:72 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Person, property Name] : String | -| EntityFrameworkCore.cs:208:85:208:86 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Address, property Street] : String | EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Person, property Name] : String | EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:219:35:219:35 | p [property Name] : String | EntityFrameworkCore.cs:222:29:222:29 | access to parameter p [property Name] : String | -| EntityFrameworkCore.cs:222:13:222:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:222:13:222:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:222:13:222:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:222:29:222:29 | access to parameter p [property Name] : String | EntityFrameworkCore.cs:222:13:222:23 | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:230:18:230:36 | call to method First [property Name] : String | -| EntityFrameworkCore.cs:230:18:230:36 | call to method First [property Name] : String | EntityFrameworkCore.cs:230:18:230:41 | access to property Name | -| EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:238:18:238:38 | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:238:18:238:38 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:238:18:238:45 | access to property Street | -| EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:36 | call to method First [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:36 | call to method First [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:46 | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:46 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:245:18:245:54 | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:245:18:245:54 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:245:18:245:61 | access to property Street | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | +| EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | +| EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | +| EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | +| EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | +| EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | +| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | +| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | +| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | +| EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | +| EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | +| EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | +| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | +| EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | +| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | +| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | nodes | EntityFramework.cs:59:13:62:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | | EntityFramework.cs:61:24:61:32 | "tainted" : String | semmle.label | "tainted" : String | @@ -247,87 +247,87 @@ nodes | EntityFramework.cs:219:18:219:46 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | | EntityFramework.cs:219:18:219:54 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | | EntityFramework.cs:219:18:219:61 | access to property Street | semmle.label | access to property Street | -| EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:76:18:76:28 | access to local variable taintSource | semmle.label | access to local variable taintSource | -| EntityFrameworkCore.cs:77:18:77:46 | (...) ... | semmle.label | (...) ... | -| EntityFrameworkCore.cs:77:18:77:46 | object creation of type RawSqlString : RawSqlString | semmle.label | object creation of type RawSqlString : RawSqlString | -| EntityFrameworkCore.cs:77:35:77:45 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | -| EntityFrameworkCore.cs:78:18:78:42 | (...) ... | semmle.label | (...) ... | -| EntityFrameworkCore.cs:78:18:78:42 | call to operator implicit conversion : RawSqlString | semmle.label | call to operator implicit conversion : RawSqlString | -| EntityFrameworkCore.cs:78:32:78:42 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | -| EntityFrameworkCore.cs:85:13:88:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:87:24:87:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:92:13:92:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:92:13:92:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:92:29:92:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:94:13:94:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:107:13:110:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:109:24:109:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:114:13:114:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:114:13:114:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:114:29:114:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:116:19:116:21 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:129:13:132:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:131:24:131:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:135:27:135:28 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:148:13:151:13 | { ..., ... } [property Title] : String | semmle.label | { ..., ... } [property Title] : String | -| EntityFrameworkCore.cs:150:25:150:33 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:155:18:155:19 | access to local variable p1 [property Title] : String | semmle.label | access to local variable p1 [property Title] : String | -| EntityFrameworkCore.cs:155:18:155:25 | access to property Title | semmle.label | access to property Title | -| EntityFrameworkCore.cs:167:13:174:13 | { ..., ... } [property Addresses, element, property Street] : String | semmle.label | { ..., ... } [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:168:29:173:17 | array creation of type Address[] [element, property Street] : String | semmle.label | array creation of type Address[] [element, property Street] : String | -| EntityFrameworkCore.cs:168:35:173:17 | { ..., ... } [element, property Street] : String | semmle.label | { ..., ... } [element, property Street] : String | -| EntityFrameworkCore.cs:169:21:172:21 | object creation of type Address [property Street] : String | semmle.label | object creation of type Address [property Street] : String | -| EntityFrameworkCore.cs:169:33:172:21 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:175:13:175:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:13:175:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:175:29:175:30 | access to local variable p1 [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:176:13:176:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:180:13:180:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:183:13:186:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:187:13:187:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:187:13:187:25 | [post] access to property Addresses [element, property Street] : String | semmle.label | [post] access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:187:31:187:32 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:188:13:188:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:192:13:192:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:199:13:202:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | -| EntityFrameworkCore.cs:201:24:201:32 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:204:13:207:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | -| EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | semmle.label | "tainted" : String | -| EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Address, property Street] : String | semmle.label | { ..., ... } [property Address, property Street] : String | -| EntityFrameworkCore.cs:208:60:208:88 | { ..., ... } [property Person, property Name] : String | semmle.label | { ..., ... } [property Person, property Name] : String | -| EntityFrameworkCore.cs:208:71:208:72 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | -| EntityFrameworkCore.cs:208:85:208:86 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses [element, property Address, property Street] : String | -| EntityFrameworkCore.cs:209:13:209:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses [element, property Person, property Name] : String | -| EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 [property Address, property Street] : String | -| EntityFrameworkCore.cs:209:37:209:53 | access to local variable personAddressMap1 [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 [property Person, property Name] : String | -| EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:210:13:210:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | -| EntityFrameworkCore.cs:216:13:216:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | -| EntityFrameworkCore.cs:219:35:219:35 | p [property Name] : String | semmle.label | p [property Name] : String | -| EntityFrameworkCore.cs:222:13:222:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:222:13:222:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:222:29:222:29 | access to parameter p [property Name] : String | semmle.label | access to parameter p [property Name] : String | -| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | -| EntityFrameworkCore.cs:230:18:230:28 | access to property Persons [element, property Name] : String | semmle.label | access to property Persons [element, property Name] : String | -| EntityFrameworkCore.cs:230:18:230:36 | call to method First [property Name] : String | semmle.label | call to method First [property Name] : String | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | semmle.label | access to property Name | -| EntityFrameworkCore.cs:238:18:238:30 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:238:18:238:38 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:238:18:238:45 | access to property Street | semmle.label | access to property Street | -| EntityFrameworkCore.cs:245:18:245:28 | access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons [element, property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:36 | call to method First [property Addresses, element, property Street] : String | semmle.label | call to method First [property Addresses, element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:46 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | -| EntityFrameworkCore.cs:245:18:245:54 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | -| EntityFrameworkCore.cs:245:18:245:61 | access to property Street | semmle.label | access to property Street | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | semmle.label | access to local variable taintSource | +| EntityFrameworkCore.cs:84:18:84:46 | (...) ... | semmle.label | (...) ... | +| EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | semmle.label | object creation of type RawSqlString : RawSqlString | +| EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | +| EntityFrameworkCore.cs:85:18:85:42 | (...) ... | semmle.label | (...) ... | +| EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | semmle.label | call to operator implicit conversion : RawSqlString | +| EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } [property Title] : String | semmle.label | { ..., ... } [property Title] : String | +| EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 [property Title] : String | semmle.label | access to local variable p1 [property Title] : String | +| EntityFrameworkCore.cs:162:18:162:25 | access to property Title | semmle.label | access to property Title | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } [property Addresses, element, property Street] : String | semmle.label | { ..., ... } [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] [element, property Street] : String | semmle.label | array creation of type Address[] [element, property Street] : String | +| EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } [element, property Street] : String | semmle.label | { ..., ... } [element, property Street] : String | +| EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address [property Street] : String | semmle.label | object creation of type Address [property Street] : String | +| EntityFrameworkCore.cs:176:33:179:21 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:182:13:182:15 | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:13:182:23 | [post] access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | [post] access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:194:13:194:25 | [post] access to property Addresses [element, property Street] : String | semmle.label | [post] access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } [property Name] : String | semmle.label | { ..., ... } [property Name] : String | +| EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } [property Street] : String | semmle.label | { ..., ... } [property Street] : String | +| EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Address, property Street] : String | semmle.label | { ..., ... } [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } [property Person, property Name] : String | semmle.label | { ..., ... } [property Person, property Name] : String | +| EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 [property Name] : String | semmle.label | access to local variable p1 [property Name] : String | +| EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 [property Street] : String | semmle.label | access to local variable a1 [property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | [post] access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Address, property Street] : String | semmle.label | [post] access to property PersonAddresses [element, property Address, property Street] : String | +| EntityFrameworkCore.cs:216:13:216:31 | [post] access to property PersonAddresses [element, property Person, property Name] : String | semmle.label | [post] access to property PersonAddresses [element, property Person, property Name] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 [property Address, property Street] : String | +| EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 [property Person, property Name] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Address, property Street] : String | +| EntityFrameworkCore.cs:223:13:223:15 | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | semmle.label | access to local variable ctx [property PersonAddresses, element, property Person, property Name] : String | +| EntityFrameworkCore.cs:226:35:226:35 | p [property Name] : String | semmle.label | p [property Name] : String | +| EntityFrameworkCore.cs:229:13:229:15 | [post] access to local variable ctx [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:229:13:229:23 | [post] access to property Persons [element, property Name] : String | semmle.label | [post] access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:229:29:229:29 | access to parameter p [property Name] : String | semmle.label | access to parameter p [property Name] : String | +| EntityFrameworkCore.cs:230:13:230:15 | access to local variable ctx [property Persons, element, property Name] : String | semmle.label | access to local variable ctx [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:28 | access to property Persons [element, property Name] : String | semmle.label | access to property Persons [element, property Name] : String | +| EntityFrameworkCore.cs:237:18:237:36 | call to method First [property Name] : String | semmle.label | call to method First [property Name] : String | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | semmle.label | access to property Name | +| EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:245:18:245:38 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:245:18:245:45 | access to property Street | semmle.label | access to property Street | +| EntityFrameworkCore.cs:252:18:252:28 | access to property Persons [element, property Addresses, element, property Street] : String | semmle.label | access to property Persons [element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:36 | call to method First [property Addresses, element, property Street] : String | semmle.label | call to method First [property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses [element, property Street] : String | semmle.label | access to property Addresses [element, property Street] : String | +| EntityFrameworkCore.cs:252:18:252:54 | call to method First
    [property Street] : String | semmle.label | call to method First
    [property Street] : String | +| EntityFrameworkCore.cs:252:18:252:61 | access to property Street | semmle.label | access to property Street | subpaths #select | EntityFramework.cs:129:18:129:25 | access to property Title | EntityFramework.cs:124:25:124:33 | "tainted" : String | EntityFramework.cs:129:18:129:25 | access to property Title | $@ | EntityFramework.cs:124:25:124:33 | "tainted" : String | "tainted" : String | @@ -341,17 +341,17 @@ subpaths | EntityFramework.cs:219:18:219:61 | access to property Street | EntityFramework.cs:145:34:145:42 | "tainted" : String | EntityFramework.cs:219:18:219:61 | access to property Street | $@ | EntityFramework.cs:145:34:145:42 | "tainted" : String | "tainted" : String | | EntityFramework.cs:219:18:219:61 | access to property Street | EntityFramework.cs:159:26:159:34 | "tainted" : String | EntityFramework.cs:219:18:219:61 | access to property Street | $@ | EntityFramework.cs:159:26:159:34 | "tainted" : String | "tainted" : String | | EntityFramework.cs:219:18:219:61 | access to property Street | EntityFramework.cs:180:26:180:34 | "tainted" : String | EntityFramework.cs:219:18:219:61 | access to property Street | $@ | EntityFramework.cs:180:26:180:34 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:76:18:76:28 | access to local variable taintSource | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:76:18:76:28 | access to local variable taintSource | $@ | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:77:18:77:46 | (...) ... | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:77:18:77:46 | (...) ... | $@ | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:78:18:78:42 | (...) ... | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | EntityFrameworkCore.cs:78:18:78:42 | (...) ... | $@ | EntityFrameworkCore.cs:75:31:75:39 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:155:18:155:25 | access to property Title | EntityFrameworkCore.cs:150:25:150:33 | "tainted" : String | EntityFrameworkCore.cs:155:18:155:25 | access to property Title | $@ | EntityFrameworkCore.cs:150:25:150:33 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | EntityFrameworkCore.cs:87:24:87:32 | "tainted" : String | EntityFrameworkCore.cs:230:18:230:41 | access to property Name | $@ | EntityFrameworkCore.cs:87:24:87:32 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | EntityFrameworkCore.cs:109:24:109:32 | "tainted" : String | EntityFrameworkCore.cs:230:18:230:41 | access to property Name | $@ | EntityFrameworkCore.cs:109:24:109:32 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | EntityFrameworkCore.cs:131:24:131:32 | "tainted" : String | EntityFrameworkCore.cs:230:18:230:41 | access to property Name | $@ | EntityFrameworkCore.cs:131:24:131:32 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | EntityFrameworkCore.cs:201:24:201:32 | "tainted" : String | EntityFrameworkCore.cs:230:18:230:41 | access to property Name | $@ | EntityFrameworkCore.cs:201:24:201:32 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:238:18:238:45 | access to property Street | EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | EntityFrameworkCore.cs:238:18:238:45 | access to property Street | $@ | EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:238:18:238:45 | access to property Street | EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | EntityFrameworkCore.cs:238:18:238:45 | access to property Street | $@ | EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:238:18:238:45 | access to property Street | EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | EntityFrameworkCore.cs:238:18:238:45 | access to property Street | $@ | EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:245:18:245:61 | access to property Street | EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:61 | access to property Street | $@ | EntityFrameworkCore.cs:171:34:171:42 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:245:18:245:61 | access to property Street | EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:61 | access to property Street | $@ | EntityFrameworkCore.cs:185:26:185:34 | "tainted" : String | "tainted" : String | -| EntityFrameworkCore.cs:245:18:245:61 | access to property Street | EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:61 | access to property Street | $@ | EntityFrameworkCore.cs:206:26:206:34 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | $@ | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:84:18:84:46 | (...) ... | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | $@ | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:85:18:85:42 | (...) ... | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | $@ | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:162:18:162:25 | access to property Title | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | $@ | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | $@ | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | $@ | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | $@ | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:237:18:237:41 | access to property Name | $@ | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:245:18:245:45 | access to property Street | EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | $@ | EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:245:18:245:45 | access to property Street | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | $@ | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:245:18:245:45 | access to property Street | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:245:18:245:45 | access to property Street | $@ | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:252:18:252:61 | access to property Street | EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | $@ | EntityFrameworkCore.cs:178:34:178:42 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:252:18:252:61 | access to property Street | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | $@ | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | "tainted" : String | +| EntityFrameworkCore.cs:252:18:252:61 | access to property Street | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | $@ | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | "tainted" : String | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/EntityFrameworkCore.cs b/csharp/ql/test/library-tests/frameworks/EntityFramework/EntityFrameworkCore.cs index 4cf1dd138c8..b45290dc799 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/EntityFrameworkCore.cs +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/EntityFrameworkCore.cs @@ -56,7 +56,7 @@ namespace EFCoreTests Microsoft.EntityFrameworkCore.Storage.IRawSqlCommandBuilder builder; - async void SqlExprs(MyContext ctx) + async void SqlExprs(MyContext ctx, System.Threading.CancellationToken token) { // Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlCommand ctx.Database.ExecuteSqlCommand(""); // SqlExpr @@ -68,6 +68,13 @@ namespace EFCoreTests // Microsoft.EntityFrameworkCore.RawSqlString new RawSqlString(""); // SqlExpr RawSqlString str = ""; // SqlExpr + + ctx.Persons.FromSqlRaw("sql"); + ctx.Database.ExecuteSqlRaw("sql", (IEnumerable)null); + ctx.Database.ExecuteSqlRaw("sql"); + await ctx.Database.ExecuteSqlRawAsync("sql", token); + await ctx.Database.ExecuteSqlRawAsync("sql"); + await ctx.Database.ExecuteSqlRawAsync("sql", (IEnumerable)null, token); } void TestRawSqlStringDataFlow() diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected index 9e043ec7486..9fb5be26eeb 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected @@ -1,3 +1,4 @@ +summary | Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | | Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | | Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | @@ -130,3 +131,11 @@ | System.Data.Entity;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Data.Entity;DbSet<>;false;Update;(T);;Argument[0];Argument[Qualifier].Element;value | | System.Data.Entity;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +sourceNode +sinkNode +| EntityFrameworkCore.cs:72:36:72:40 | "sql" | sql | +| EntityFrameworkCore.cs:73:40:73:44 | "sql" | sql | +| EntityFrameworkCore.cs:74:40:74:44 | "sql" | sql | +| EntityFrameworkCore.cs:75:51:75:55 | "sql" | sql | +| EntityFrameworkCore.cs:76:51:76:55 | "sql" | sql | +| EntityFrameworkCore.cs:77:51:77:55 | "sql" | sql | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.ql b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.ql index 61bee675bf1..41cc8379b3d 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.ql +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.ql @@ -1,6 +1,13 @@ import semmle.code.csharp.frameworks.EntityFramework::EntityFramework import shared.FlowSummaries +import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow private class IncludeEFSummarizedCallable extends IncludeSummarizedCallable { IncludeEFSummarizedCallable() { this instanceof EFSummarizedCallable } } + +query predicate sourceNode(DataFlow::Node node, string kind) { + ExternalFlow::sourceNode(node, kind) +} + +query predicate sinkNode(DataFlow::Node node, string kind) { ExternalFlow::sinkNode(node, kind) } diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/SqlExprs.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/SqlExprs.expected index faaddc5257b..5008ff2695c 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/SqlExprs.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/SqlExprs.expected @@ -3,5 +3,11 @@ | EntityFrameworkCore.cs:66:13:66:29 | call to method Build | | EntityFrameworkCore.cs:69:13:69:32 | object creation of type RawSqlString | | EntityFrameworkCore.cs:70:32:70:33 | call to operator implicit conversion | -| EntityFrameworkCore.cs:77:18:77:46 | object creation of type RawSqlString | -| EntityFrameworkCore.cs:78:18:78:42 | call to operator implicit conversion | +| EntityFrameworkCore.cs:72:13:72:41 | call to method FromSqlRaw | +| EntityFrameworkCore.cs:73:13:73:72 | call to method ExecuteSqlRaw | +| EntityFrameworkCore.cs:74:13:74:45 | call to method ExecuteSqlRaw | +| EntityFrameworkCore.cs:75:19:75:63 | call to method ExecuteSqlRawAsync | +| EntityFrameworkCore.cs:76:19:76:56 | call to method ExecuteSqlRawAsync | +| EntityFrameworkCore.cs:77:19:77:90 | call to method ExecuteSqlRawAsync | +| EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString | +| EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/StoredFlowSources.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/StoredFlowSources.expected index 4a0ecb82c3f..2b6c64790ce 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/StoredFlowSources.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/StoredFlowSources.expected @@ -10,11 +10,11 @@ | EntityFramework.cs:219:18:219:61 | access to property Street | | EntityFrameworkCore.cs:52:22:52:25 | access to property Id | | EntityFrameworkCore.cs:53:24:53:29 | access to property Name | -| EntityFrameworkCore.cs:229:18:229:39 | access to property Id | -| EntityFrameworkCore.cs:230:18:230:41 | access to property Name | -| EntityFrameworkCore.cs:237:18:237:41 | access to property Id | -| EntityFrameworkCore.cs:238:18:238:45 | access to property Street | -| EntityFrameworkCore.cs:244:18:244:46 | access to property Addresses | -| EntityFrameworkCore.cs:244:18:244:57 | access to property Id | -| EntityFrameworkCore.cs:245:18:245:46 | access to property Addresses | -| EntityFrameworkCore.cs:245:18:245:61 | access to property Street | +| EntityFrameworkCore.cs:236:18:236:39 | access to property Id | +| EntityFrameworkCore.cs:237:18:237:41 | access to property Name | +| EntityFrameworkCore.cs:244:18:244:41 | access to property Id | +| EntityFrameworkCore.cs:245:18:245:45 | access to property Street | +| EntityFrameworkCore.cs:251:18:251:46 | access to property Addresses | +| EntityFrameworkCore.cs:251:18:251:57 | access to property Id | +| EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses | +| EntityFrameworkCore.cs:252:18:252:61 | access to property Street | diff --git a/csharp/ql/test/library-tests/frameworks/JsonNET/Json.ql b/csharp/ql/test/library-tests/frameworks/JsonNET/Json.ql index 81067f76838..5615e5873e8 100644 --- a/csharp/ql/test/library-tests/frameworks/JsonNET/Json.ql +++ b/csharp/ql/test/library-tests/frameworks/JsonNET/Json.ql @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.TaintTracking class Configuration extends TaintTracking::Configuration { Configuration() { this = "Json.NET test" } diff --git a/csharp/ql/test/library-tests/frameworks/NHibernate/DataFlow.ql b/csharp/ql/test/library-tests/frameworks/NHibernate/DataFlow.ql index ab97e1494ff..655a0ef2856 100644 --- a/csharp/ql/test/library-tests/frameworks/NHibernate/DataFlow.ql +++ b/csharp/ql/test/library-tests/frameworks/NHibernate/DataFlow.ql @@ -1,5 +1,4 @@ import csharp -import semmle.code.csharp.dataflow.TaintTracking class MyConfiguration extends TaintTracking::Configuration { MyConfiguration() { this = "MyConfiguration" } diff --git a/csharp/ql/test/library-tests/structuralcomparison/StructuralComparison.cs b/csharp/ql/test/library-tests/structuralcomparison/StructuralComparison.cs new file mode 100644 index 00000000000..c27746a7765 --- /dev/null +++ b/csharp/ql/test/library-tests/structuralcomparison/StructuralComparison.cs @@ -0,0 +1,54 @@ +using System; + +public class Class +{ + private readonly int x = 0; + private readonly int y = 1; + + public int M0() => 0; + public int M1(int a) => a; + public int M2(int v1, int v2) => v1 + v2; + + + public void M3() + { + var z1 = x + y; + var z2 = x + y; + } + + public void M4() + { + var z3 = M1(x); + var z4 = M1(x); + var z5 = M1(y); + var z6 = M0(); + var z7 = M2(x, y) + M2(x, y); + M2(x, y); + M2(y, x); + M2(y, x); + } +} + +public class BaseClass +{ + public int Field; + public object Prop { get; set; } +} + +public class DerivedClass : BaseClass +{ + public void M4() + { + var x1 = base.Field; + var x2 = Field; + var x3 = this.Field; + } + + public void M5() + { + var y1 = base.Prop; + var y2 = Prop; + var y3 = this.Prop; + } +} + diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected new file mode 100644 index 00000000000..cdabf17445b --- /dev/null +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected @@ -0,0 +1,179 @@ +same +| StructuralComparison.cs:15:18:15:18 | access to field x | StructuralComparison.cs:16:18:16:18 | access to field x | +| StructuralComparison.cs:15:18:15:22 | ... + ... | StructuralComparison.cs:16:18:16:22 | ... + ... | +| StructuralComparison.cs:15:22:15:22 | access to field y | StructuralComparison.cs:16:22:16:22 | access to field y | +| StructuralComparison.cs:21:18:21:22 | call to method M1 | StructuralComparison.cs:22:18:22:22 | call to method M1 | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:22:21:22:21 | access to field x | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:25:21:25:21 | access to field x | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:25:32:25:32 | access to field x | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:26:12:26:12 | access to field x | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:27:15:27:15 | access to field x | +| StructuralComparison.cs:21:21:21:21 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:22:21:22:21 | access to field x | StructuralComparison.cs:25:21:25:21 | access to field x | +| StructuralComparison.cs:22:21:22:21 | access to field x | StructuralComparison.cs:25:32:25:32 | access to field x | +| StructuralComparison.cs:22:21:22:21 | access to field x | StructuralComparison.cs:26:12:26:12 | access to field x | +| StructuralComparison.cs:22:21:22:21 | access to field x | StructuralComparison.cs:27:15:27:15 | access to field x | +| StructuralComparison.cs:22:21:22:21 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:23:21:23:21 | access to field y | StructuralComparison.cs:25:24:25:24 | access to field y | +| StructuralComparison.cs:23:21:23:21 | access to field y | StructuralComparison.cs:25:35:25:35 | access to field y | +| StructuralComparison.cs:23:21:23:21 | access to field y | StructuralComparison.cs:26:15:26:15 | access to field y | +| StructuralComparison.cs:23:21:23:21 | access to field y | StructuralComparison.cs:27:12:27:12 | access to field y | +| StructuralComparison.cs:23:21:23:21 | access to field y | StructuralComparison.cs:28:12:28:12 | access to field y | +| StructuralComparison.cs:25:18:25:25 | call to method M2 | StructuralComparison.cs:25:29:25:36 | call to method M2 | +| StructuralComparison.cs:25:18:25:25 | call to method M2 | StructuralComparison.cs:26:9:26:16 | call to method M2 | +| StructuralComparison.cs:25:21:25:21 | access to field x | StructuralComparison.cs:25:32:25:32 | access to field x | +| StructuralComparison.cs:25:21:25:21 | access to field x | StructuralComparison.cs:26:12:26:12 | access to field x | +| StructuralComparison.cs:25:21:25:21 | access to field x | StructuralComparison.cs:27:15:27:15 | access to field x | +| StructuralComparison.cs:25:21:25:21 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:25:24:25:24 | access to field y | StructuralComparison.cs:25:35:25:35 | access to field y | +| StructuralComparison.cs:25:24:25:24 | access to field y | StructuralComparison.cs:26:15:26:15 | access to field y | +| StructuralComparison.cs:25:24:25:24 | access to field y | StructuralComparison.cs:27:12:27:12 | access to field y | +| StructuralComparison.cs:25:24:25:24 | access to field y | StructuralComparison.cs:28:12:28:12 | access to field y | +| StructuralComparison.cs:25:29:25:36 | call to method M2 | StructuralComparison.cs:26:9:26:16 | call to method M2 | +| StructuralComparison.cs:25:32:25:32 | access to field x | StructuralComparison.cs:26:12:26:12 | access to field x | +| StructuralComparison.cs:25:32:25:32 | access to field x | StructuralComparison.cs:27:15:27:15 | access to field x | +| StructuralComparison.cs:25:32:25:32 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:25:35:25:35 | access to field y | StructuralComparison.cs:26:15:26:15 | access to field y | +| StructuralComparison.cs:25:35:25:35 | access to field y | StructuralComparison.cs:27:12:27:12 | access to field y | +| StructuralComparison.cs:25:35:25:35 | access to field y | StructuralComparison.cs:28:12:28:12 | access to field y | +| StructuralComparison.cs:26:12:26:12 | access to field x | StructuralComparison.cs:27:15:27:15 | access to field x | +| StructuralComparison.cs:26:12:26:12 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:26:15:26:15 | access to field y | StructuralComparison.cs:27:12:27:12 | access to field y | +| StructuralComparison.cs:26:15:26:15 | access to field y | StructuralComparison.cs:28:12:28:12 | access to field y | +| StructuralComparison.cs:27:9:27:16 | call to method M2 | StructuralComparison.cs:28:9:28:16 | call to method M2 | +| StructuralComparison.cs:27:9:27:17 | ...; | StructuralComparison.cs:28:9:28:17 | ...; | +| StructuralComparison.cs:27:12:27:12 | access to field y | StructuralComparison.cs:28:12:28:12 | access to field y | +| StructuralComparison.cs:27:15:27:15 | access to field x | StructuralComparison.cs:28:15:28:15 | access to field x | +| StructuralComparison.cs:42:18:42:27 | access to field Field | StructuralComparison.cs:43:18:43:22 | access to field Field | +| StructuralComparison.cs:42:18:42:27 | access to field Field | StructuralComparison.cs:44:18:44:27 | access to field Field | +| StructuralComparison.cs:43:18:43:22 | access to field Field | StructuralComparison.cs:44:18:44:27 | access to field Field | +| StructuralComparison.cs:49:18:49:26 | access to property Prop | StructuralComparison.cs:50:18:50:21 | access to property Prop | +| StructuralComparison.cs:49:18:49:26 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | +| StructuralComparison.cs:50:18:50:21 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | +gvn +| StructuralComparison.cs:5:26:5:26 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:5:26:5:26 | this access | (kind:Expr(12)) | +| StructuralComparison.cs:5:26:5:30 | ... = ... | ((kind:Expr(16),true,x) :: (0 :: (kind:Expr(63)))) | +| StructuralComparison.cs:5:30:5:30 | 0 | 0 | +| StructuralComparison.cs:6:26:6:26 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:6:26:6:26 | this access | (kind:Expr(12)) | +| StructuralComparison.cs:6:26:6:30 | ... = ... | ((kind:Expr(16),true,y) :: (1 :: (kind:Expr(63)))) | +| StructuralComparison.cs:6:30:6:30 | 1 | 1 | +| StructuralComparison.cs:8:24:8:24 | 0 | 0 | +| StructuralComparison.cs:9:29:9:29 | access to parameter a | (kind:Expr(15),false,a) | +| StructuralComparison.cs:10:38:10:39 | access to parameter v1 | (kind:Expr(15),false,v1) | +| StructuralComparison.cs:10:38:10:44 | ... + ... | ((kind:Expr(15),false,v2) :: ((kind:Expr(15),false,v1) :: (kind:Expr(44)))) | +| StructuralComparison.cs:10:43:10:44 | access to parameter v2 | (kind:Expr(15),false,v2) | +| StructuralComparison.cs:14:5:17:5 | {...} | ((((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))) | +| StructuralComparison.cs:15:9:15:23 | ... ...; | (((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:15:13:15:14 | access to local variable z1 | (kind:Expr(14),false,z1) | +| StructuralComparison.cs:15:13:15:22 | Int32 z1 = ... | ((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:15:18:15:18 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:15:18:15:18 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:15:18:15:22 | ... + ... | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) | +| StructuralComparison.cs:15:22:15:22 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:15:22:15:22 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:16:9:16:23 | ... ...; | (((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:16:13:16:14 | access to local variable z2 | (kind:Expr(14),false,z2) | +| StructuralComparison.cs:16:13:16:22 | Int32 z2 = ... | ((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:16:18:16:18 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:16:18:16:18 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:16:18:16:22 | ... + ... | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) | +| StructuralComparison.cs:16:22:16:22 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:16:22:16:22 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:20:5:29:5 | {...} | ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))))))))) | +| StructuralComparison.cs:21:9:21:23 | ... ...; | (((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:21:13:21:14 | access to local variable z3 | (kind:Expr(14),false,z3) | +| StructuralComparison.cs:21:13:21:22 | Int32 z3 = ... | ((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:21:18:21:22 | call to method M1 | ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | +| StructuralComparison.cs:21:18:21:22 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:21:21:21:21 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:21:21:21:21 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:22:9:22:23 | ... ...; | (((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:22:13:22:14 | access to local variable z4 | (kind:Expr(14),false,z4) | +| StructuralComparison.cs:22:13:22:22 | Int32 z4 = ... | ((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:22:18:22:22 | call to method M1 | ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | +| StructuralComparison.cs:22:18:22:22 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:22:21:22:21 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:22:21:22:21 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:23:9:23:23 | ... ...; | (((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:23:13:23:14 | access to local variable z5 | (kind:Expr(14),false,z5) | +| StructuralComparison.cs:23:13:23:22 | Int32 z5 = ... | ((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:23:18:23:22 | call to method M1 | ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | +| StructuralComparison.cs:23:18:23:22 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:23:21:23:21 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:23:21:23:21 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:24:9:24:22 | ... ...; | (((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:24:13:24:14 | access to local variable z6 | (kind:Expr(14),false,z6) | +| StructuralComparison.cs:24:13:24:21 | Int32 z6 = ... | ((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) | +| StructuralComparison.cs:24:18:24:21 | call to method M0 | ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) | +| StructuralComparison.cs:24:18:24:21 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:9:25:37 | ... ...; | (((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:25:13:25:14 | access to local variable z7 | (kind:Expr(14),false,z7) | +| StructuralComparison.cs:25:13:25:36 | Int32 z7 = ... | ((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:25:18:25:25 | call to method M2 | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | +| StructuralComparison.cs:25:18:25:25 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:18:25:36 | ... + ... | (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) | +| StructuralComparison.cs:25:21:25:21 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:25:21:25:21 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:24:25:24 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:25:24:25:24 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:29:25:36 | call to method M2 | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | +| StructuralComparison.cs:25:29:25:36 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:32:25:32 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:25:32:25:32 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:25:35:25:35 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:25:35:25:35 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:26:9:26:16 | call to method M2 | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | +| StructuralComparison.cs:26:9:26:16 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:26:9:26:17 | ...; | (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) | +| StructuralComparison.cs:26:12:26:12 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:26:12:26:12 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:26:15:26:15 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:26:15:26:15 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:27:9:27:16 | call to method M2 | ((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | +| StructuralComparison.cs:27:9:27:16 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:27:9:27:17 | ...; | (((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) | +| StructuralComparison.cs:27:12:27:12 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:27:12:27:12 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:27:15:27:15 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:27:15:27:15 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:28:9:28:16 | call to method M2 | ((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | +| StructuralComparison.cs:28:9:28:16 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:28:9:28:17 | ...; | (((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) | +| StructuralComparison.cs:28:12:28:12 | access to field y | (kind:Expr(16),true,y) | +| StructuralComparison.cs:28:12:28:12 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:28:15:28:15 | access to field x | (kind:Expr(16),true,x) | +| StructuralComparison.cs:28:15:28:15 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:41:5:45:5 | {...} | ((((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | +| StructuralComparison.cs:42:9:42:28 | ... ...; | (((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:42:13:42:14 | access to local variable x1 | (kind:Expr(14),false,x1) | +| StructuralComparison.cs:42:13:42:27 | Int32 x1 = ... | ((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:42:18:42:21 | base access | (kind:Expr(13),false,BaseClass) | +| StructuralComparison.cs:42:18:42:27 | access to field Field | (kind:Expr(16),true,Field) | +| StructuralComparison.cs:43:9:43:23 | ... ...; | (((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:43:13:43:14 | access to local variable x2 | (kind:Expr(14),false,x2) | +| StructuralComparison.cs:43:13:43:22 | Int32 x2 = ... | ((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:43:18:43:22 | access to field Field | (kind:Expr(16),true,Field) | +| StructuralComparison.cs:43:18:43:22 | this access | (kind:Expr(12),false,DerivedClass) | +| StructuralComparison.cs:44:9:44:28 | ... ...; | (((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:44:13:44:14 | access to local variable x3 | (kind:Expr(14),false,x3) | +| StructuralComparison.cs:44:13:44:27 | Int32 x3 = ... | ((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:44:18:44:21 | this access | (kind:Expr(12),false,DerivedClass) | +| StructuralComparison.cs:44:18:44:27 | access to field Field | (kind:Expr(16),true,Field) | +| StructuralComparison.cs:48:5:52:5 | {...} | ((((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | +| StructuralComparison.cs:49:9:49:27 | ... ...; | (((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:49:13:49:14 | access to local variable y1 | (kind:Expr(14),false,y1) | +| StructuralComparison.cs:49:13:49:26 | Object y1 = ... | ((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:49:18:49:21 | base access | (kind:Expr(13),false,BaseClass) | +| StructuralComparison.cs:49:18:49:26 | access to property Prop | (kind:Expr(17),true,Prop) | +| StructuralComparison.cs:50:9:50:22 | ... ...; | (((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:50:13:50:14 | access to local variable y2 | (kind:Expr(14),false,y2) | +| StructuralComparison.cs:50:13:50:21 | Object y2 = ... | ((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:50:18:50:21 | access to property Prop | (kind:Expr(17),true,Prop) | +| StructuralComparison.cs:50:18:50:21 | this access | (kind:Expr(12),false,DerivedClass) | +| StructuralComparison.cs:51:9:51:27 | ... ...; | (((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:51:13:51:14 | access to local variable y3 | (kind:Expr(14),false,y3) | +| StructuralComparison.cs:51:13:51:26 | Object y3 = ... | ((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:51:18:51:21 | this access | (kind:Expr(12),false,DerivedClass) | +| StructuralComparison.cs:51:18:51:26 | access to property Prop | (kind:Expr(17),true,Prop) | diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.ql b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.ql new file mode 100644 index 00000000000..d0ec2841d86 --- /dev/null +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.ql @@ -0,0 +1,31 @@ +import csharp +import semmle.code.csharp.commons.StructuralComparison + +/** + * All pairs of controls flow elements found in the source and within the same + * enclosing callable excluding all instances of `ThisAccess` to reduce the size + * of the output. + */ +private predicate candidate(ControlFlowElement x, ControlFlowElement y) { + x.fromSource() and + y.fromSource() and + x != y and + x.getEnclosingCallable() = y.getEnclosingCallable() and + not x instanceof ThisAccess +} + +query predicate same(ControlFlowElement x, ControlFlowElement y) { + exists(Location l1, Location l2 | + candidate(x, y) and + sameGvn(x, y) and + l1 = x.getLocation() and + l2 = y.getLocation() and + ( + l1.getStartLine() < l2.getStartLine() + or + l1.getStartLine() = l2.getStartLine() and l1.getStartColumn() < l2.getStartColumn() + ) + ) +} + +query predicate gvn(ControlFlowElement x, Gvn gvn) { gvn = toGvn(x) and x.fromSource() } diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.cs b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.cs index e36143d6b40..e3aa1ad3067 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.cs +++ b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.cs @@ -1,4 +1,5 @@ using System; +using System.Linq.Expressions; class Test { @@ -8,6 +9,8 @@ class Test var bad1 = (int)1; var bad2 = (Test)this; var bad3 = this as Test; + func = (Func)(x => x); // MISSING + exprFunc = (Expression>)(x => x); // GOOD var good1 = (object)1; @@ -17,6 +20,9 @@ class Test var good5 = (Action)(x => { }); var good6 = (Action)(delegate (int x) { }); var good7 = (Action)((int x) => { }); + func = x => x; + exprFunc = x => x; + exprFuncUntyped = (Expression>)(x => x); // FP } enum Enum @@ -27,4 +33,8 @@ class Test D = 9 | (32 << A), E = 9 | (32 << (int)A) // BAD } + + private Func func; + private Expression> exprFunc; + private LambdaExpression exprFuncUntyped; } diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.expected b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.expected index f5c4b708253..11ac047b255 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.expected +++ b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/UselessCastToSelf.expected @@ -1,5 +1,7 @@ -| UselessCastToSelf.cs:8:20:8:25 | (...) ... | This cast is redundant because the expression already has type Int32. | -| UselessCastToSelf.cs:9:20:9:29 | (...) ... | This cast is redundant because the expression already has type Test. | -| UselessCastToSelf.cs:10:20:10:31 | ... as ... | This cast is redundant because the expression already has type Test. | -| UselessCastToSelf.cs:26:17:26:22 | (...) ... | This cast is redundant because the expression already has type Int32. | -| UselessCastToSelf.cs:28:24:28:29 | (...) ... | This cast is redundant because the expression already has type Int32. | +| UselessCastToSelf.cs:9:20:9:25 | (...) ... | This cast is redundant because the expression already has type Int32. | +| UselessCastToSelf.cs:10:20:10:29 | (...) ... | This cast is redundant because the expression already has type Test. | +| UselessCastToSelf.cs:11:20:11:31 | ... as ... | This cast is redundant because the expression already has type Test. | +| UselessCastToSelf.cs:13:20:13:56 | (...) ... | This cast is redundant because the expression already has type Expression>>. | +| UselessCastToSelf.cs:25:27:25:63 | (...) ... | This cast is redundant because the expression already has type Expression>>. | +| UselessCastToSelf.cs:32:17:32:22 | (...) ... | This cast is redundant because the expression already has type Int32. | +| UselessCastToSelf.cs:34:24:34:29 | (...) ... | This cast is redundant because the expression already has type Int32. | diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/options b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/options new file mode 100644 index 00000000000..f9a3f3419c0 --- /dev/null +++ b/csharp/ql/test/query-tests/Language Abuse/UselessCastToSelf/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj \ No newline at end of file diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs b/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs index fe6d9ad1695..0ec950e836d 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs +++ b/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs @@ -17,8 +17,8 @@ class A : I1, I2 class B : A { - public static bool operator==(B b1, B b2) { return false; } - public static bool operator!=(B b1, B b2) { return true; } + public static bool operator ==(B b1, B b2) { return false; } + public static bool operator !=(B b1, B b2) { return true; } public void M(B b) { } } @@ -68,11 +68,11 @@ class Tests ((I2)a).Foo(); // GOOD: Cast to an interface - o = a==(A)b; // GOOD: EQExpr + o = a == (A)b; // GOOD: EQExpr - o = b==(B)b; // GOOD: Operator call + o = b == (B)b; // GOOD: Operator call - var act = (Action) (() => { }); // GOOD + var act = (Action)(() => { }); // GOOD var objects = args.Select(arg => (object)arg); // GOOD @@ -126,9 +126,9 @@ static class IExtensions static class StaticMethods { - public static void M1(A _) { } - public static void M1(B _) { } - public static void M2(B _) { } + public static void M1(A _) { } + public static void M1(B _) { } + public static void M2(B _) { } } class Constructors : I2 @@ -162,4 +162,12 @@ class Constructors : I2 new Sub((Sub)ss); // BAD } } + + class Dynamic + { + void M(object o) + { + var s0 = ((dynamic)o).ToString(); // GOOD + } + } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.expected b/csharp/ql/test/query-tests/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.expected index 25d15f527f7..5d635dbad88 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-020/ExternalAPIsUsedWithUntrustedData.expected @@ -1,3 +1,2 @@ -| System.Collections.Specialized.NameValueCollection.get_Item(string) [qualifier] | 1 | 1 | | System.Web.HttpRequest.get_QueryString() [qualifier] | 1 | 1 | | System.Web.HttpResponse.Write(string) [param 0] | 1 | 1 | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected index 57ba315175c..4135e7ce5d6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected @@ -1,12 +1,13 @@ edges +| UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:9:20:9:50 | access to indexer : String | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:13:28:13:31 | access to local variable name | +| UntrustedData.cs:9:20:9:50 | access to indexer : String | UntrustedData.cs:13:28:13:31 | access to local variable name | nodes | UntrustedData.cs:9:20:9:30 | access to property Request | semmle.label | access to property Request | -| UntrustedData.cs:9:20:9:42 | access to property QueryString | semmle.label | access to property QueryString | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| UntrustedData.cs:9:20:9:50 | access to indexer : String | semmle.label | access to indexer : String | | UntrustedData.cs:13:28:13:31 | access to local variable name | semmle.label | access to local variable name | subpaths #select | UntrustedData.cs:9:20:9:30 | access to property Request | UntrustedData.cs:9:20:9:30 | access to property Request | UntrustedData.cs:9:20:9:30 | access to property Request | Call to System.Web.HttpRequest.get_QueryString with untrusted data from $@. | UntrustedData.cs:9:20:9:30 | access to property Request | access to property Request | -| UntrustedData.cs:9:20:9:42 | access to property QueryString | UntrustedData.cs:9:20:9:42 | access to property QueryString | UntrustedData.cs:9:20:9:42 | access to property QueryString | Call to System.Collections.Specialized.NameValueCollection.get_Item with untrusted data from $@. | UntrustedData.cs:9:20:9:42 | access to property QueryString | access to property QueryString | | UntrustedData.cs:13:28:13:31 | access to local variable name | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:13:28:13:31 | access to local variable name | Call to System.Web.HttpResponse.Write with untrusted data from $@. | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | access to property QueryString : NameValueCollection | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected index f0bbe6e13f5..59f27496610 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected @@ -1,4 +1,5 @@ edges +| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:10:23:10:53 | access to indexer : String | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:12:50:12:53 | access to local variable path | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:17:51:17:54 | access to local variable path | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:25:30:25:33 | access to local variable path | @@ -6,8 +7,16 @@ edges | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:36:25:36:31 | access to local variable badPath | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:38:49:38:55 | access to local variable badPath | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:51:26:51:29 | access to local variable path | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:12:50:12:53 | access to local variable path | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:17:51:17:54 | access to local variable path | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:25:30:25:33 | access to local variable path | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:31:30:31:33 | access to local variable path | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:36:25:36:31 | access to local variable badPath | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:38:49:38:55 | access to local variable badPath | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:51:26:51:29 | access to local variable path | nodes | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | semmle.label | access to indexer : String | | TaintedPath.cs:12:50:12:53 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:17:51:17:54 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:25:30:25:33 | access to local variable path | semmle.label | access to local variable path | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected index 799b00e69f8..06d2429450c 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected @@ -3,26 +3,53 @@ edges | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:27:26:47 | ... + ... | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:50:26:66 | ... + ... | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | | CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | +| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | +| CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | +| CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | +| CommandInjection.cs:32:13:32:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | +| CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | CommandInjection.cs:32:13:32:26 | [post] access to local variable startInfoProps : ProcessStartInfo | +| CommandInjection.cs:33:13:33:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | +| CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | CommandInjection.cs:33:13:33:26 | [post] access to local variable startInfoProps : ProcessStartInfo | +| CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | +| CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | nodes | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | CommandInjection.cs:25:32:25:51 | access to property Text : String | semmle.label | access to property Text : String | | CommandInjection.cs:26:27:26:47 | ... + ... | semmle.label | ... + ... | | CommandInjection.cs:26:50:26:66 | ... + ... | semmle.label | ... + ... | +| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | semmle.label | object creation of type ProcessStartInfo : ProcessStartInfo | | CommandInjection.cs:28:63:28:71 | access to local variable userInput | semmle.label | access to local variable userInput | +| CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | CommandInjection.cs:28:74:28:82 | access to local variable userInput | semmle.label | access to local variable userInput | +| CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | +| CommandInjection.cs:29:27:29:35 | access to local variable startInfo | semmle.label | access to local variable startInfo | +| CommandInjection.cs:32:13:32:26 | [post] access to local variable startInfoProps : ProcessStartInfo | semmle.label | [post] access to local variable startInfoProps : ProcessStartInfo | | CommandInjection.cs:32:39:32:47 | access to local variable userInput | semmle.label | access to local variable userInput | +| CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | +| CommandInjection.cs:33:13:33:26 | [post] access to local variable startInfoProps : ProcessStartInfo | semmle.label | [post] access to local variable startInfoProps : ProcessStartInfo | | CommandInjection.cs:33:40:33:48 | access to local variable userInput | semmle.label | access to local variable userInput | +| CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | +| CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | semmle.label | [post] access to local variable startInfoProps : ProcessStartInfo | | CommandInjection.cs:34:47:34:55 | access to local variable userInput | semmle.label | access to local variable userInput | +| CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | +| CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | semmle.label | access to local variable startInfoProps | subpaths #select | CommandInjection.cs:26:27:26:47 | ... + ... | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:26:27:26:47 | ... + ... | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:26:50:26:66 | ... + ... | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:26:50:26:66 | ... + ... | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:28:63:28:71 | access to local variable userInput | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:28:63:28:71 | access to local variable userInput | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:28:74:28:82 | access to local variable userInput | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:28:74:28:82 | access to local variable userInput | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | +| CommandInjection.cs:29:27:29:35 | access to local variable startInfo | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:32:39:32:47 | access to local variable userInput | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:32:39:32:47 | access to local variable userInput | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:33:40:33:48 | access to local variable userInput | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:33:40:33:48 | access to local variable userInput | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | | CommandInjection.cs:34:47:34:55 | access to local variable userInput | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:34:47:34:55 | access to local variable userInput | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | +| CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | $@ flows to here and is used in a command. | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox | User-provided value | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected index 90a98c2d215..859767e8b29 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/StoredXSS/XSS.expected @@ -7,13 +7,24 @@ edges | XSS.cs:26:32:26:40 | access to local variable userInput [element] : String | XSS.cs:26:32:26:51 | call to method ToString | | XSS.cs:27:29:27:37 | access to local variable userInput [element] : String | XSS.cs:27:29:27:48 | call to method ToString | | XSS.cs:28:26:28:34 | access to local variable userInput [element] : String | XSS.cs:28:26:28:45 | call to method ToString | +| XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:27:37:61 | access to indexer : String | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:38:36:38:39 | access to local variable name | +| XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:38:36:38:39 | access to local variable name | +| XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:57:27:57:73 | access to indexer : String | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:59:22:59:25 | access to local variable name | +| XSS.cs:57:27:57:73 | access to indexer : String | XSS.cs:59:22:59:25 | access to local variable name | +| XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:75:27:75:61 | access to indexer : String | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:76:36:76:39 | access to local variable name | +| XSS.cs:75:27:75:61 | access to indexer : String | XSS.cs:76:36:76:39 | access to local variable name | | XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | XSS.cs:79:36:79:40 | access to local variable name2 | +| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:85:27:85:61 | access to indexer : String | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:86:28:86:31 | access to local variable name | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:87:31:87:34 | access to local variable name | +| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:86:28:86:31 | access to local variable name | +| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:87:31:87:34 | access to local variable name | +| XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:94:27:94:61 | access to indexer : String | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:95:31:95:34 | access to local variable name | +| XSS.cs:94:27:94:61 | access to indexer : String | XSS.cs:95:31:95:34 | access to local variable name | | script.aspx:12:1:12:14 | <%= ... %> | script.aspx:12:1:12:14 | <%= ... %> | | script.aspx:16:1:16:34 | <%= ... %> | script.aspx:16:1:16:34 | <%= ... %> | | script.aspx:20:1:20:41 | <%= ... %> | script.aspx:20:1:20:41 | <%= ... %> | @@ -28,17 +39,22 @@ nodes | XSS.cs:28:26:28:34 | access to local variable userInput [element] : String | semmle.label | access to local variable userInput [element] : String | | XSS.cs:28:26:28:45 | call to method ToString | semmle.label | call to method ToString | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSS.cs:37:27:37:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:38:36:38:39 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSS.cs:57:27:57:73 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:59:22:59:25 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSS.cs:75:27:75:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:76:36:76:39 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | semmle.label | access to property Request : HttpRequestBase | | XSS.cs:79:36:79:40 | access to local variable name2 | semmle.label | access to local variable name2 | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSS.cs:85:27:85:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:86:28:86:31 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:87:31:87:34 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSS.cs:94:27:94:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:95:31:95:34 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:134:20:134:33 | access to property RawUrl | semmle.label | access to property RawUrl | | script.aspx:12:1:12:14 | <%= ... %> | semmle.label | <%= ... %> | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected index e15a42e1bff..b5bf1f609f3 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected @@ -1,6 +1,9 @@ edges +| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:25:19:52 | access to indexer : String | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | +| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | +| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | | XSSAspNet.cs:43:28:43:46 | access to property QueryString : NameValueCollection | XSSAspNet.cs:43:28:43:55 | access to indexer | | XSSAspNetCore.cs:21:52:21:64 | access to property Query : IQueryCollection | XSSAspNetCore.cs:21:52:21:76 | call to operator implicit conversion | | XSSAspNetCore.cs:40:56:40:58 | foo : String | XSSAspNetCore.cs:44:51:44:53 | access to parameter foo | @@ -12,6 +15,7 @@ edges | XSSAspNetCore.cs:72:51:72:65 | access to property Headers : IHeaderDictionary | XSSAspNetCore.cs:72:51:72:72 | call to operator implicit conversion | nodes | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XSSAspNet.cs:19:25:19:52 | access to indexer : String | semmle.label | access to indexer : String | | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | semmle.label | access to local variable sayHi | | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | semmle.label | access to local variable sayHi | | XSSAspNet.cs:43:28:43:46 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected index c83f74fedc2..b0fd2471366 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected @@ -1,12 +1,20 @@ edges +| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:11:27:11:61 | access to indexer : String | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:14:54:14:78 | ... + ... | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:16:21:16:45 | ... + ... | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:23:21:23:45 | ... + ... | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:24:53:24:77 | ... + ... | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:27:48:27:70 | ... + ... | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:29:20:29:42 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:14:54:14:78 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:16:21:16:45 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:23:21:23:45 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:24:53:24:77 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:27:48:27:70 | ... + ... | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:29:20:29:42 | ... + ... | nodes | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | | LDAPInjection.cs:14:54:14:78 | ... + ... | semmle.label | ... + ... | | LDAPInjection.cs:16:21:16:45 | ... + ... | semmle.label | ... + ... | | LDAPInjection.cs:23:21:23:45 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected index c892fe902e7..e3faaba88be 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected @@ -1 +1,11 @@ -| Test.cs:15:25:15:80 | ... + ... | $@ flows to here and is inserted as XML. | Test.cs:8:27:8:49 | access to property QueryString | User-provided value | +edges +| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:8:27:8:65 | access to indexer : String | +| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:15:25:15:80 | ... + ... | +| Test.cs:8:27:8:65 | access to indexer : String | Test.cs:15:25:15:80 | ... + ... | +nodes +| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| Test.cs:8:27:8:65 | access to indexer : String | semmle.label | access to indexer : String | +| Test.cs:15:25:15:80 | ... + ... | semmle.label | ... + ... | +subpaths +#select +| Test.cs:15:25:15:80 | ... + ... | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:15:25:15:80 | ... + ... | $@ flows to here and is inserted as XML. | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | User-provided value | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected index 9fdf938b2e1..97cbabb543d 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected @@ -1,8 +1,12 @@ edges +| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:23:23:23:53 | access to indexer : String | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:29:64:29:67 | access to local variable code | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:40:36:40:39 | access to local variable code | +| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:29:64:29:67 | access to local variable code | +| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:40:36:40:39 | access to local variable code | nodes | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| CodeInjection.cs:23:23:23:53 | access to indexer : String | semmle.label | access to indexer : String | | CodeInjection.cs:29:64:29:67 | access to local variable code | semmle.label | access to local variable code | | CodeInjection.cs:40:36:40:39 | access to local variable code | semmle.label | access to local variable code | | CodeInjection.cs:56:36:56:44 | access to property Text | semmle.label | access to property Text | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected index bfc4fe2e2f6..8cd9b0955df 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected @@ -1,8 +1,12 @@ edges +| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:8:27:8:61 | access to indexer : String | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | +| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | +| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | nodes | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| ResourceInjection.cs:8:27:8:61 | access to indexer : String | semmle.label | access to indexer : String | | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | semmle.label | access to local variable connectionString | | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | semmle.label | access to local variable connectionString | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected index 2465cef9ba4..a8d1ebb8202 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected @@ -1,9 +1,15 @@ edges +| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:27:26:27:58 | object creation of type StringReader | @@ -11,6 +17,7 @@ edges | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | nodes | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | semmle.label | access to indexer : String | | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | semmle.label | object creation of type StringReader | | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | semmle.label | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | semmle.label | object creation of type StringReader | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected index be4965b2f6d..3fbeefe8100 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected @@ -1,8 +1,12 @@ edges +| LogForging.cs:17:27:17:49 | access to property QueryString : NameValueCollection | LogForging.cs:17:27:17:61 | access to indexer : String | | LogForging.cs:17:27:17:49 | access to property QueryString : NameValueCollection | LogForging.cs:20:21:20:43 | ... + ... | | LogForging.cs:17:27:17:49 | access to property QueryString : NameValueCollection | LogForging.cs:26:50:26:72 | ... + ... | +| LogForging.cs:17:27:17:61 | access to indexer : String | LogForging.cs:20:21:20:43 | ... + ... | +| LogForging.cs:17:27:17:61 | access to indexer : String | LogForging.cs:26:50:26:72 | ... + ... | nodes | LogForging.cs:17:27:17:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| LogForging.cs:17:27:17:61 | access to indexer : String | semmle.label | access to indexer : String | | LogForging.cs:20:21:20:43 | ... + ... | semmle.label | ... + ... | | LogForging.cs:26:50:26:72 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected index 703063363d6..2aa7b13890b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected @@ -1,16 +1,23 @@ edges | ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | +| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | +| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | +| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | +| UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | +| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | nodes | ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | semmle.label | access to local variable format | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:32:23:32:31 | access to property Text | semmle.label | access to property Text | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | semmle.label | access to local variable format | subpaths #select diff --git a/csharp/ql/test/query-tests/Security Features/CWE-209/ExceptionInformationExposure.expected b/csharp/ql/test/query-tests/Security Features/CWE-209/ExceptionInformationExposure.expected index d2ef58dd347..3ad51c3a585 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-209/ExceptionInformationExposure.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-209/ExceptionInformationExposure.expected @@ -1,21 +1,30 @@ edges -| ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | +| ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | +| ExceptionInformationExposure.cs:23:32:23:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | +| ExceptionInformationExposure.cs:39:28:39:44 | access to property InnerException : Exception | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | +| ExceptionInformationExposure.cs:40:28:40:29 | access to local variable ex : Exception | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | +| ExceptionInformationExposure.cs:41:28:41:29 | access to local variable ex : Exception | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | +| ExceptionInformationExposure.cs:47:28:47:44 | object creation of type MyException : MyException | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | nodes | ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex : Exception | semmle.label | access to local variable ex : Exception | | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | semmle.label | call to method ToString | | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | semmle.label | access to local variable ex | +| ExceptionInformationExposure.cs:23:32:23:33 | access to local variable ex : Exception | semmle.label | access to local variable ex : Exception | | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | semmle.label | access to property StackTrace | +| ExceptionInformationExposure.cs:39:28:39:44 | access to property InnerException : Exception | semmle.label | access to property InnerException : Exception | | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | semmle.label | access to property StackTrace | +| ExceptionInformationExposure.cs:40:28:40:29 | access to local variable ex : Exception | semmle.label | access to local variable ex : Exception | | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | semmle.label | access to property StackTrace | +| ExceptionInformationExposure.cs:41:28:41:29 | access to local variable ex : Exception | semmle.label | access to local variable ex : Exception | | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | semmle.label | call to method ToString | +| ExceptionInformationExposure.cs:47:28:47:44 | object creation of type MyException : MyException | semmle.label | object creation of type MyException : MyException | | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | semmle.label | call to method ToString | subpaths #select -| ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | call to method ToString | -| ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex | access to local variable ex : Exception | +| ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:19:32:19:44 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:19:32:19:33 | access to local variable ex | access to local variable ex : Exception | | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:21:32:21:33 | access to local variable ex | access to local variable ex | -| ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | access to property StackTrace | -| ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | access to property StackTrace | -| ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | access to property StackTrace | -| ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | call to method ToString | -| ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | call to method ToString | +| ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | ExceptionInformationExposure.cs:23:32:23:33 | access to local variable ex : Exception | ExceptionInformationExposure.cs:23:32:23:44 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:23:32:23:33 | access to local variable ex | access to local variable ex : Exception | +| ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | ExceptionInformationExposure.cs:39:28:39:44 | access to property InnerException : Exception | ExceptionInformationExposure.cs:39:28:39:55 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:39:28:39:44 | access to property InnerException | access to property InnerException : Exception | +| ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | ExceptionInformationExposure.cs:40:28:40:29 | access to local variable ex : Exception | ExceptionInformationExposure.cs:40:28:40:40 | access to property StackTrace | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:40:28:40:29 | access to local variable ex | access to local variable ex : Exception | +| ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | ExceptionInformationExposure.cs:41:28:41:29 | access to local variable ex : Exception | ExceptionInformationExposure.cs:41:28:41:40 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:41:28:41:29 | access to local variable ex | access to local variable ex : Exception | +| ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | ExceptionInformationExposure.cs:47:28:47:44 | object creation of type MyException : MyException | ExceptionInformationExposure.cs:47:28:47:55 | call to method ToString | Exception information from $@ flows to here, and is exposed to the user. | ExceptionInformationExposure.cs:47:28:47:44 | object creation of type MyException | object creation of type MyException : MyException | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected index a829177db0a..3e99fa0ceb3 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected @@ -1,6 +1,8 @@ edges | UrlRedirect.cs:12:31:12:53 | access to property QueryString : NameValueCollection | UrlRedirect.cs:12:31:12:61 | access to indexer | +| UrlRedirect.cs:22:22:22:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:22:22:22:52 | access to indexer : String | | UrlRedirect.cs:22:22:22:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:47:29:47:31 | access to local variable url | +| UrlRedirect.cs:22:22:22:52 | access to indexer : String | UrlRedirect.cs:47:29:47:31 | access to local variable url | | UrlRedirect.cs:37:44:37:66 | access to property QueryString : NameValueCollection | UrlRedirect.cs:37:44:37:74 | access to indexer | | UrlRedirect.cs:38:47:38:69 | access to property QueryString : NameValueCollection | UrlRedirect.cs:38:47:38:77 | access to indexer | | UrlRedirectCore.cs:13:44:13:48 | value : String | UrlRedirectCore.cs:16:22:16:26 | access to parameter value | @@ -18,6 +20,7 @@ nodes | UrlRedirect.cs:12:31:12:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:12:31:12:61 | access to indexer | semmle.label | access to indexer | | UrlRedirect.cs:22:22:22:44 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| UrlRedirect.cs:22:22:22:52 | access to indexer : String | semmle.label | access to indexer : String | | UrlRedirect.cs:37:44:37:66 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:37:44:37:74 | access to indexer | semmle.label | access to indexer | | UrlRedirect.cs:38:47:38:69 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected index ff2a8485d99..c5fbc6b2a66 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected @@ -1,4 +1,5 @@ edges +| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:10:27:10:61 | access to indexer : String | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | @@ -6,6 +7,14 @@ edges | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | +| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:11:27:11:61 | access to indexer : String | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | @@ -13,9 +22,18 @@ edges | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | nodes | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | semmle.label | access to indexer : String | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | | XPathInjection.cs:16:33:16:33 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:19:29:19:29 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:28:20:28:20 | access to local variable s | semmle.label | access to local variable s | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected index e2c79ba302a..19549b0dcb3 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected @@ -1,11 +1,18 @@ edges +| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:11:28:11:63 | access to indexer : String | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | nodes | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | semmle.label | access to local variable userInput | | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | semmle.label | access to local variable userInput | | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | semmle.label | access to local variable userInput | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected index 7c8fe73f7f7..100f4fc61cc 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected @@ -1,7 +1,10 @@ edges +| ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:13:28:13:63 | access to indexer : String | | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | +| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | nodes | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | semmle.label | access to local variable userInput | subpaths #select diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected index e11bf9ba17a..c9c2f544940 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected @@ -1,7 +1,10 @@ edges +| RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:10:24:10:55 | access to indexer : String | | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:14:19:14:23 | access to local variable regex | +| RegexInjection.cs:10:24:10:55 | access to indexer : String | RegexInjection.cs:14:19:14:23 | access to local variable regex | nodes | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| RegexInjection.cs:10:24:10:55 | access to indexer : String | semmle.label | access to indexer : String | | RegexInjection.cs:14:19:14:23 | access to local variable regex | semmle.label | access to local variable regex | subpaths #select diff --git a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected index 7d1d6c24a33..5e5b963f9f6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected @@ -1,5 +1,7 @@ edges +| ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:12:26:12:59 | access to indexer : String | | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:16:13:16:30 | ... == ... | +| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | ConditionalBypass.cs:16:13:16:30 | ... == ... | | ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | @@ -19,6 +21,7 @@ edges | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | ConditionalBypass.cs:84:13:84:40 | ... == ... | nodes | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | +| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | semmle.label | access to indexer : String | | ConditionalBypass.cs:16:13:16:30 | ... == ... | semmle.label | ... == ... | | ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | diff --git a/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected b/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected index 3cda5170cb0..8ee9904f360 100644 --- a/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected +++ b/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected @@ -1 +1 @@ -| // This file contains auto-generated code.\n\nnamespace System\n{\n// Generated from `System.Uri` in `System.Private.Uri, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Uri : System.Runtime.Serialization.ISerializable\n{\n public override bool Equals(object comparand) => throw null;\n public override int GetHashCode() => throw null;\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) => throw null;\n public override string ToString() => throw null;\n}\n\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\n// Generated from `System.Collections.SortedList` in `System.Collections.NonGeneric, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class SortedList : System.Collections.ICollection, System.Collections.IDictionary, System.Collections.IEnumerable, System.ICloneable\n{\n public virtual void Add(object key, object value) => throw null;\n public virtual void Clear() => throw null;\n public virtual object Clone() => throw null;\n public virtual bool Contains(object key) => throw null;\n public virtual void CopyTo(System.Array array, int arrayIndex) => throw null;\n public virtual int Count { get => throw null; }\n public virtual object GetByIndex(int index) => throw null;\n public virtual System.Collections.IDictionaryEnumerator GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n public virtual bool IsFixedSize { get => throw null; }\n public virtual bool IsReadOnly { get => throw null; }\n public virtual bool IsSynchronized { get => throw null; }\n public virtual object this[object key] { get => throw null; set => throw null; }\n public virtual System.Collections.ICollection Keys { get => throw null; }\n public virtual void Remove(object key) => throw null;\n public virtual object SyncRoot { get => throw null; }\n public virtual System.Collections.ICollection Values { get => throw null; }\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Generic\n{\n// Generated from `System.Collections.Generic.Stack<>` in `System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Stack : System.Collections.Generic.IEnumerable, System.Collections.Generic.IReadOnlyCollection, System.Collections.ICollection, System.Collections.IEnumerable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int arrayIndex) => throw null;\n public int Count { get => throw null; }\n System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public T Peek() => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Specialized\n{\n// Generated from `System.Collections.Specialized.NameObjectCollectionBase` in `System.Collections.Specialized, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class NameObjectCollectionBase : System.Collections.ICollection, System.Collections.IEnumerable, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int index) => throw null;\n public virtual int Count { get => throw null; }\n public virtual System.Collections.IEnumerator GetEnumerator() => throw null;\n public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public virtual void OnDeserialization(object sender) => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n// Generated from `System.Collections.Specialized.NameValueCollection` in `System.Collections.Specialized, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class NameValueCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n public string this[string name] { get => throw null; set => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.ComponentConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ComponentConverter : System.ComponentModel.ReferenceConverter\n{\n}\n\n// Generated from `System.ComponentModel.DefaultEventAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultEventAttribute : System.Attribute\n{\n public DefaultEventAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.DefaultPropertyAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultPropertyAttribute : System.Attribute\n{\n public DefaultPropertyAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.ReferenceConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ReferenceConverter : System.ComponentModel.TypeConverter\n{\n}\n\n// Generated from `System.ComponentModel.TypeConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverter\n{\n}\n\n}\nnamespace Timers\n{\n// Generated from `System.Timers.TimersDescriptionAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TimersDescriptionAttribute\n{\n public TimersDescriptionAttribute(string description) => throw null;\n internal TimersDescriptionAttribute(string description, string unused) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.TypeConverterAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverterAttribute : System.Attribute\n{\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n public TypeConverterAttribute() => throw null;\n public TypeConverterAttribute(System.Type type) => throw null;\n public TypeConverterAttribute(string typeName) => throw null;\n}\n\n// Generated from `System.ComponentModel.TypeDescriptionProviderAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeDescriptionProviderAttribute : System.Attribute\n{\n public TypeDescriptionProviderAttribute(System.Type type) => throw null;\n public TypeDescriptionProviderAttribute(string typeName) => throw null;\n}\n\n}\nnamespace Windows\n{\nnamespace Markup\n{\n// Generated from `System.Windows.Markup.ValueSerializerAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ValueSerializerAttribute : System.Attribute\n{\n public ValueSerializerAttribute(System.Type valueSerializerType) => throw null;\n public ValueSerializerAttribute(string valueSerializerTypeName) => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Enumerable` in `System.Linq, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Enumerable\n{\n public static System.Collections.Generic.IEnumerable Select(this System.Collections.Generic.IEnumerable source, System.Func selector) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.IQueryable` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic interface IQueryable : System.Collections.IEnumerable\n{\n}\n\n}\nnamespace Runtime\n{\nnamespace CompilerServices\n{\n// Generated from `System.Runtime.CompilerServices.CallSite` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class CallSite\n{\n internal CallSite(System.Runtime.CompilerServices.CallSiteBinder binder) => throw null;\n}\n\n// Generated from `System.Runtime.CompilerServices.CallSite<>` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class CallSite : System.Runtime.CompilerServices.CallSite where T: class\n{\n private CallSite() : base(default(System.Runtime.CompilerServices.CallSiteBinder)) => throw null;\n private CallSite(System.Runtime.CompilerServices.CallSiteBinder binder) : base(default(System.Runtime.CompilerServices.CallSiteBinder)) => throw null;\n}\n\n// Generated from `System.Runtime.CompilerServices.CallSiteBinder` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class CallSiteBinder\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.ParallelEnumerable` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class ParallelEnumerable\n{\n public static System.Linq.ParallelQuery AsParallel(this System.Collections.IEnumerable source) => throw null;\n}\n\n// Generated from `System.Linq.ParallelQuery` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ParallelQuery : System.Collections.IEnumerable\n{\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n internal ParallelQuery(System.Linq.Parallel.QuerySettings specifiedSettings) => throw null;\n}\n\nnamespace Parallel\n{\n// Generated from `System.Linq.Parallel.QuerySettings` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\ninternal struct QuerySettings\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Queryable` in `System.Linq.Queryable, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Queryable\n{\n public static System.Linq.IQueryable AsQueryable(this System.Collections.IEnumerable source) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Serialization\n{\n// Generated from `System.Runtime.Serialization.DataContractAttribute` in `System.Runtime.Serialization.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataContractAttribute : System.Attribute\n{\n public DataContractAttribute() => throw null;\n}\n\n// Generated from `System.Runtime.Serialization.DataMemberAttribute` in `System.Runtime.Serialization.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataMemberAttribute : System.Attribute\n{\n public DataMemberAttribute() => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n// Generated from `System.Security.Cryptography.PaddingMode` in `System.Security.Cryptography.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic enum PaddingMode\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Text\n{\nnamespace RegularExpressions\n{\n// Generated from `System.Text.RegularExpressions.Capture` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Capture\n{\n internal Capture(string text, int index, int length) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Group` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Group : System.Text.RegularExpressions.Capture\n{\n internal Group(string text, int[] caps, int capcount, string name) : base(default(string), default(int), default(int)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Match` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Match : System.Text.RegularExpressions.Group\n{\n internal Match(System.Text.RegularExpressions.Regex regex, int capcount, string text, int begpos, int len, int startpos) : base(default(string), default(int[]), default(int), default(string)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Regex` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Regex : System.Runtime.Serialization.ISerializable\n{\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo si, System.Runtime.Serialization.StreamingContext context) => throw null;\n public System.Text.RegularExpressions.Match Match(string input) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public Regex(string pattern) => throw null;\n public Regex(string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public string Replace(string input, string replacement) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.RegexOptions` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\n[System.Flags]\npublic enum RegexOptions\n{\n IgnoreCase,\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Web\n{\n// Generated from `System.Web.HtmlString` in `../../../resources/stubs/System.Web.cs:34:18:34:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HtmlString : System.Web.IHtmlString\n{\n}\n\n// Generated from `System.Web.HttpContextBase` in `../../../resources/stubs/System.Web.cs:24:18:24:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpContextBase\n{\n public virtual System.Web.HttpRequestBase Request { get => throw null; }\n}\n\n// Generated from `System.Web.HttpCookie` in `../../../resources/stubs/System.Web.cs:173:18:173:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpCookie\n{\n}\n\n// Generated from `System.Web.HttpCookieCollection` in `../../../resources/stubs/System.Web.cs:191:27:191:46; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class HttpCookieCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n}\n\n// Generated from `System.Web.HttpRequest` in `../../../resources/stubs/System.Web.cs:145:18:145:28; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpRequest\n{\n}\n\n// Generated from `System.Web.HttpRequestBase` in `../../../resources/stubs/System.Web.cs:10:18:10:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpRequestBase\n{\n public virtual System.Collections.Specialized.NameValueCollection QueryString { get => throw null; }\n}\n\n// Generated from `System.Web.HttpResponse` in `../../../resources/stubs/System.Web.cs:156:18:156:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpResponse\n{\n}\n\n// Generated from `System.Web.HttpResponseBase` in `../../../resources/stubs/System.Web.cs:19:18:19:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpResponseBase\n{\n}\n\n// Generated from `System.Web.HttpServerUtility` in `../../../resources/stubs/System.Web.cs:41:18:41:34; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpServerUtility\n{\n}\n\n// Generated from `System.Web.IHtmlString` in `../../../resources/stubs/System.Web.cs:30:22:30:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IHtmlString\n{\n}\n\n// Generated from `System.Web.IHttpHandler` in `../../../resources/stubs/System.Web.cs:132:22:132:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IHttpHandler\n{\n}\n\n// Generated from `System.Web.IServiceProvider` in `../../../resources/stubs/System.Web.cs:136:22:136:37; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IServiceProvider\n{\n}\n\n// Generated from `System.Web.UnvalidatedRequestValues` in `../../../resources/stubs/System.Web.cs:140:18:140:41; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class UnvalidatedRequestValues\n{\n}\n\n// Generated from `System.Web.UnvalidatedRequestValuesBase` in `../../../resources/stubs/System.Web.cs:5:18:5:45; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class UnvalidatedRequestValuesBase\n{\n}\n\nnamespace Mvc\n{\n// Generated from `System.Web.Mvc.ActionMethodSelectorAttribute` in `../../../resources/stubs/System.Web.cs:240:18:240:46; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ActionMethodSelectorAttribute : System.Attribute\n{\n}\n\n// Generated from `System.Web.Mvc.ActionResult` in `../../../resources/stubs/System.Web.cs:232:18:232:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ActionResult\n{\n}\n\n// Generated from `System.Web.Mvc.ControllerContext` in `../../../resources/stubs/System.Web.cs:210:18:210:34; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ControllerContext\n{\n}\n\n// Generated from `System.Web.Mvc.FilterAttribute` in `../../../resources/stubs/System.Web.cs:236:18:236:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class FilterAttribute : System.Attribute\n{\n}\n\n// Generated from `System.Web.Mvc.GlobalFilterCollection` in `../../../resources/stubs/System.Web.cs:280:18:280:39; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class GlobalFilterCollection\n{\n}\n\n// Generated from `System.Web.Mvc.IFilterProvider` in `../../../resources/stubs/System.Web.cs:276:15:276:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\ninternal interface IFilterProvider\n{\n}\n\n// Generated from `System.Web.Mvc.IViewDataContainer` in `../../../resources/stubs/System.Web.cs:218:22:218:39; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IViewDataContainer\n{\n}\n\n// Generated from `System.Web.Mvc.ViewContext` in `../../../resources/stubs/System.Web.cs:214:18:214:28; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewContext : System.Web.Mvc.ControllerContext\n{\n}\n\n// Generated from `System.Web.Mvc.ViewResult` in `../../../resources/stubs/System.Web.cs:272:18:272:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewResult : System.Web.Mvc.ViewResultBase\n{\n}\n\n// Generated from `System.Web.Mvc.ViewResultBase` in `../../../resources/stubs/System.Web.cs:268:18:268:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewResultBase : System.Web.Mvc.ActionResult\n{\n}\n\n}\nnamespace Routing\n{\n// Generated from `System.Web.Routing.RequestContext` in `../../../resources/stubs/System.Web.cs:299:18:299:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class RequestContext\n{\n}\n\n}\nnamespace Script\n{\nnamespace Serialization\n{\n// Generated from `System.Web.Script.Serialization.JavaScriptTypeResolver` in `../../../resources/stubs/System.Web.cs:364:27:364:48; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class JavaScriptTypeResolver\n{\n}\n\n}\n}\nnamespace Security\n{\n// Generated from `System.Web.Security.MembershipUser` in `../../../resources/stubs/System.Web.cs:322:18:322:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class MembershipUser\n{\n}\n\n}\nnamespace SessionState\n{\n// Generated from `System.Web.SessionState.HttpSessionState` in `../../../resources/stubs/System.Web.cs:200:18:200:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpSessionState\n{\n}\n\n}\nnamespace UI\n{\n// Generated from `System.Web.UI.Control` in `../../../resources/stubs/System.Web.cs:76:18:76:24; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Control\n{\n}\n\nnamespace WebControls\n{\n// Generated from `System.Web.UI.WebControls.WebControl` in `../../../resources/stubs/System.Web.cs:104:18:104:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class WebControl : System.Web.UI.Control\n{\n}\n\n}\n}\n}\n}\n\n\n | +| // This file contains auto-generated code.\n\nnamespace System\n{\n// Generated from `System.Uri` in `System.Private.Uri, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Uri : System.Runtime.Serialization.ISerializable\n{\n public override bool Equals(object comparand) => throw null;\n public override int GetHashCode() => throw null;\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) => throw null;\n public override string ToString() => throw null;\n}\n\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\n// Generated from `System.Collections.SortedList` in `System.Collections.NonGeneric, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class SortedList : System.Collections.ICollection, System.Collections.IDictionary, System.Collections.IEnumerable, System.ICloneable\n{\n public virtual void Add(object key, object value) => throw null;\n public virtual void Clear() => throw null;\n public virtual object Clone() => throw null;\n public virtual bool Contains(object key) => throw null;\n public virtual void CopyTo(System.Array array, int arrayIndex) => throw null;\n public virtual int Count { get => throw null; }\n public virtual object GetByIndex(int index) => throw null;\n public virtual System.Collections.IDictionaryEnumerator GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n public virtual bool IsFixedSize { get => throw null; }\n public virtual bool IsReadOnly { get => throw null; }\n public virtual bool IsSynchronized { get => throw null; }\n public virtual object this[object key] { get => throw null; set => throw null; }\n public virtual System.Collections.ICollection Keys { get => throw null; }\n public virtual void Remove(object key) => throw null;\n public virtual object SyncRoot { get => throw null; }\n public virtual System.Collections.ICollection Values { get => throw null; }\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Generic\n{\n// Generated from `System.Collections.Generic.Stack<>` in `System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Stack : System.Collections.Generic.IEnumerable, System.Collections.Generic.IReadOnlyCollection, System.Collections.ICollection, System.Collections.IEnumerable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int arrayIndex) => throw null;\n public int Count { get => throw null; }\n System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public T Peek() => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Specialized\n{\n// Generated from `System.Collections.Specialized.NameObjectCollectionBase` in `System.Collections.Specialized, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class NameObjectCollectionBase : System.Collections.ICollection, System.Collections.IEnumerable, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int index) => throw null;\n public virtual int Count { get => throw null; }\n public virtual System.Collections.IEnumerator GetEnumerator() => throw null;\n public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public virtual void OnDeserialization(object sender) => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n// Generated from `System.Collections.Specialized.NameValueCollection` in `System.Collections.Specialized, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class NameValueCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n public string this[string name] { get => throw null; set => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.ComponentConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ComponentConverter : System.ComponentModel.ReferenceConverter\n{\n}\n\n// Generated from `System.ComponentModel.DefaultEventAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultEventAttribute : System.Attribute\n{\n public DefaultEventAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.DefaultPropertyAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultPropertyAttribute : System.Attribute\n{\n public DefaultPropertyAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.ReferenceConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ReferenceConverter : System.ComponentModel.TypeConverter\n{\n}\n\n// Generated from `System.ComponentModel.TypeConverter` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverter\n{\n}\n\n}\nnamespace Timers\n{\n// Generated from `System.Timers.TimersDescriptionAttribute` in `System.ComponentModel.TypeConverter, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TimersDescriptionAttribute\n{\n public TimersDescriptionAttribute(string description) => throw null;\n internal TimersDescriptionAttribute(string description, string unused) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.TypeConverterAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverterAttribute : System.Attribute\n{\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n public TypeConverterAttribute() => throw null;\n public TypeConverterAttribute(System.Type type) => throw null;\n public TypeConverterAttribute(string typeName) => throw null;\n}\n\n// Generated from `System.ComponentModel.TypeDescriptionProviderAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeDescriptionProviderAttribute : System.Attribute\n{\n public TypeDescriptionProviderAttribute(System.Type type) => throw null;\n public TypeDescriptionProviderAttribute(string typeName) => throw null;\n}\n\n}\nnamespace Windows\n{\nnamespace Markup\n{\n// Generated from `System.Windows.Markup.ValueSerializerAttribute` in `System.ObjectModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ValueSerializerAttribute : System.Attribute\n{\n public ValueSerializerAttribute(System.Type valueSerializerType) => throw null;\n public ValueSerializerAttribute(string valueSerializerTypeName) => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Enumerable` in `System.Linq, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Enumerable\n{\n public static System.Collections.Generic.IEnumerable Select(this System.Collections.Generic.IEnumerable source, System.Func selector) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.IQueryable` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic interface IQueryable : System.Collections.IEnumerable\n{\n}\n\n}\nnamespace Runtime\n{\nnamespace CompilerServices\n{\n// Generated from `System.Runtime.CompilerServices.CallSite` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class CallSite\n{\n internal CallSite(System.Runtime.CompilerServices.CallSiteBinder binder) => throw null;\n}\n\n// Generated from `System.Runtime.CompilerServices.CallSite<>` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class CallSite : System.Runtime.CompilerServices.CallSite where T: class\n{\n private CallSite() : base(default(System.Runtime.CompilerServices.CallSiteBinder)) => throw null;\n private CallSite(System.Runtime.CompilerServices.CallSiteBinder binder) : base(default(System.Runtime.CompilerServices.CallSiteBinder)) => throw null;\n}\n\n// Generated from `System.Runtime.CompilerServices.CallSiteBinder` in `System.Linq.Expressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class CallSiteBinder\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.ParallelEnumerable` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class ParallelEnumerable\n{\n public static System.Linq.ParallelQuery AsParallel(this System.Collections.IEnumerable source) => throw null;\n}\n\n// Generated from `System.Linq.ParallelQuery` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ParallelQuery : System.Collections.IEnumerable\n{\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n internal ParallelQuery(System.Linq.Parallel.QuerySettings specifiedSettings) => throw null;\n}\n\nnamespace Parallel\n{\n// Generated from `System.Linq.Parallel.QuerySettings` in `System.Linq.Parallel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\ninternal struct QuerySettings\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Queryable` in `System.Linq.Queryable, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Queryable\n{\n public static System.Linq.IQueryable AsQueryable(this System.Collections.IEnumerable source) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Serialization\n{\n// Generated from `System.Runtime.Serialization.DataContractAttribute` in `System.Runtime.Serialization.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataContractAttribute : System.Attribute\n{\n public DataContractAttribute() => throw null;\n}\n\n// Generated from `System.Runtime.Serialization.DataMemberAttribute` in `System.Runtime.Serialization.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataMemberAttribute : System.Attribute\n{\n public DataMemberAttribute() => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Security\n{\nnamespace Cryptography\n{\n// Generated from `System.Security.Cryptography.PaddingMode` in `System.Security.Cryptography.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic enum PaddingMode\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Text\n{\nnamespace RegularExpressions\n{\n// Generated from `System.Text.RegularExpressions.Capture` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Capture\n{\n internal Capture(string text, int index, int length) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Group` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Group : System.Text.RegularExpressions.Capture\n{\n internal Group(string text, int[] caps, int capcount, string name) : base(default(string), default(int), default(int)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Match` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Match : System.Text.RegularExpressions.Group\n{\n internal Match(System.Text.RegularExpressions.Regex regex, int capcount, string text, int begpos, int len, int startpos) : base(default(string), default(int[]), default(int), default(string)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Regex` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Regex : System.Runtime.Serialization.ISerializable\n{\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo si, System.Runtime.Serialization.StreamingContext context) => throw null;\n public System.Text.RegularExpressions.Match Match(string input) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public Regex(string pattern) => throw null;\n public Regex(string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public string Replace(string input, string replacement) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.RegexOptions` in `System.Text.RegularExpressions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\n[System.Flags]\npublic enum RegexOptions\n{\n IgnoreCase,\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Web\n{\n// Generated from `System.Web.HtmlString` in `../../../resources/stubs/System.Web.cs:34:18:34:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HtmlString : System.Web.IHtmlString\n{\n}\n\n// Generated from `System.Web.HttpContextBase` in `../../../resources/stubs/System.Web.cs:24:18:24:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpContextBase\n{\n public virtual System.Web.HttpRequestBase Request { get => throw null; }\n}\n\n// Generated from `System.Web.HttpCookie` in `../../../resources/stubs/System.Web.cs:174:18:174:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpCookie\n{\n}\n\n// Generated from `System.Web.HttpCookieCollection` in `../../../resources/stubs/System.Web.cs:192:27:192:46; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class HttpCookieCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n}\n\n// Generated from `System.Web.HttpRequest` in `../../../resources/stubs/System.Web.cs:145:18:145:28; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpRequest\n{\n}\n\n// Generated from `System.Web.HttpRequestBase` in `../../../resources/stubs/System.Web.cs:10:18:10:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpRequestBase\n{\n public virtual System.Collections.Specialized.NameValueCollection QueryString { get => throw null; }\n}\n\n// Generated from `System.Web.HttpResponse` in `../../../resources/stubs/System.Web.cs:156:18:156:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpResponse\n{\n}\n\n// Generated from `System.Web.HttpResponseBase` in `../../../resources/stubs/System.Web.cs:19:18:19:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpResponseBase\n{\n}\n\n// Generated from `System.Web.HttpServerUtility` in `../../../resources/stubs/System.Web.cs:41:18:41:34; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpServerUtility\n{\n}\n\n// Generated from `System.Web.IHtmlString` in `../../../resources/stubs/System.Web.cs:30:22:30:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IHtmlString\n{\n}\n\n// Generated from `System.Web.IHttpHandler` in `../../../resources/stubs/System.Web.cs:132:22:132:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IHttpHandler\n{\n}\n\n// Generated from `System.Web.IServiceProvider` in `../../../resources/stubs/System.Web.cs:136:22:136:37; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IServiceProvider\n{\n}\n\n// Generated from `System.Web.UnvalidatedRequestValues` in `../../../resources/stubs/System.Web.cs:140:18:140:41; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class UnvalidatedRequestValues\n{\n}\n\n// Generated from `System.Web.UnvalidatedRequestValuesBase` in `../../../resources/stubs/System.Web.cs:5:18:5:45; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class UnvalidatedRequestValuesBase\n{\n}\n\nnamespace Mvc\n{\n// Generated from `System.Web.Mvc.ActionMethodSelectorAttribute` in `../../../resources/stubs/System.Web.cs:241:18:241:46; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ActionMethodSelectorAttribute : System.Attribute\n{\n}\n\n// Generated from `System.Web.Mvc.ActionResult` in `../../../resources/stubs/System.Web.cs:233:18:233:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ActionResult\n{\n}\n\n// Generated from `System.Web.Mvc.ControllerContext` in `../../../resources/stubs/System.Web.cs:211:18:211:34; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ControllerContext\n{\n}\n\n// Generated from `System.Web.Mvc.FilterAttribute` in `../../../resources/stubs/System.Web.cs:237:18:237:32; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class FilterAttribute : System.Attribute\n{\n}\n\n// Generated from `System.Web.Mvc.GlobalFilterCollection` in `../../../resources/stubs/System.Web.cs:281:18:281:39; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class GlobalFilterCollection\n{\n}\n\n// Generated from `System.Web.Mvc.IFilterProvider` in `../../../resources/stubs/System.Web.cs:277:15:277:29; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\ninternal interface IFilterProvider\n{\n}\n\n// Generated from `System.Web.Mvc.IViewDataContainer` in `../../../resources/stubs/System.Web.cs:219:22:219:39; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IViewDataContainer\n{\n}\n\n// Generated from `System.Web.Mvc.ViewContext` in `../../../resources/stubs/System.Web.cs:215:18:215:28; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewContext : System.Web.Mvc.ControllerContext\n{\n}\n\n// Generated from `System.Web.Mvc.ViewResult` in `../../../resources/stubs/System.Web.cs:273:18:273:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewResult : System.Web.Mvc.ViewResultBase\n{\n}\n\n// Generated from `System.Web.Mvc.ViewResultBase` in `../../../resources/stubs/System.Web.cs:269:18:269:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class ViewResultBase : System.Web.Mvc.ActionResult\n{\n}\n\n}\nnamespace Routing\n{\n// Generated from `System.Web.Routing.RequestContext` in `../../../resources/stubs/System.Web.cs:300:18:300:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class RequestContext\n{\n}\n\n}\nnamespace Script\n{\nnamespace Serialization\n{\n// Generated from `System.Web.Script.Serialization.JavaScriptTypeResolver` in `../../../resources/stubs/System.Web.cs:365:27:365:48; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class JavaScriptTypeResolver\n{\n}\n\n}\n}\nnamespace Security\n{\n// Generated from `System.Web.Security.MembershipUser` in `../../../resources/stubs/System.Web.cs:323:18:323:31; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class MembershipUser\n{\n}\n\n}\nnamespace SessionState\n{\n// Generated from `System.Web.SessionState.HttpSessionState` in `../../../resources/stubs/System.Web.cs:201:18:201:33; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class HttpSessionState\n{\n}\n\n}\nnamespace UI\n{\n// Generated from `System.Web.UI.Control` in `../../../resources/stubs/System.Web.cs:76:18:76:24; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Control\n{\n}\n\nnamespace WebControls\n{\n// Generated from `System.Web.UI.WebControls.WebControl` in `../../../resources/stubs/System.Web.cs:104:18:104:27; System.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class WebControl : System.Web.UI.Control\n{\n}\n\n}\n}\n}\n}\n\n\n | diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.cs b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.cs new file mode 100644 index 00000000000..aaef1776cd3 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +public class LibraryUsage +{ + public void M1() + { + var l = new List(); // Uninteresting parameterless constructor + var o = new object(); // Uninteresting parameterless constructor + l.Add(o); // Has flow summary + l.Add(o); // Has flow summary + } + + public void M2() + { + var d0 = new DateTime(); // Uninteresting parameterless constructor + var next0 = d0.AddYears(30); // Has no flow summary + + var d1 = new DateTime(2000, 1, 1); // Interesting constructor + var next1 = next0.AddDays(3); // Has no flow summary + var next2 = next1.AddYears(5); // Has no flow summary + } + + public void M3() + { + var guid1 = Guid.Parse("{12345678-1234-1234-1234-123456789012}"); // Has no flow summary + } +} diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.expected b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.expected new file mode 100644 index 00000000000..e64b827f137 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.expected @@ -0,0 +1,2 @@ +| System.Private.CoreLib.dll#System | 5 | +| System.Private.CoreLib.dll#System.Collections.Generic | 2 | diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.qlref b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.qlref new file mode 100644 index 00000000000..98a6202f3eb --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/ExternalLibraryUsage.qlref @@ -0,0 +1 @@ +Telemetry/ExternalLibraryUsage.ql diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.expected b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.expected new file mode 100644 index 00000000000..e9be925c286 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.expected @@ -0,0 +1 @@ +| System.Private.CoreLib.dll#System.Collections.Generic#List<>.Add(T) | 2 | diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.qlref b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.qlref new file mode 100644 index 00000000000..ef9ddfadc00 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/SupportedExternalTaint.qlref @@ -0,0 +1 @@ +Telemetry/SupportedExternalTaint.ql diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.expected b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.expected new file mode 100644 index 00000000000..e62aaf9e271 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.expected @@ -0,0 +1,4 @@ +| System.Private.CoreLib.dll#System#DateTime.AddYears(System.Int32) | 2 | +| System.Private.CoreLib.dll#System#DateTime.AddDays(System.Double) | 1 | +| System.Private.CoreLib.dll#System#DateTime.DateTime(System.Int32,System.Int32,System.Int32) | 1 | +| System.Private.CoreLib.dll#System#Guid.Parse(System.String) | 1 | diff --git a/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.qlref b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.qlref new file mode 100644 index 00000000000..b89f0a48e2e --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/LibraryUsage/UnsupportedExternalAPIs.qlref @@ -0,0 +1 @@ +Telemetry/UnsupportedExternalAPIs.ql diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.cs b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.cs new file mode 100644 index 00000000000..fad50b6c139 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.cs @@ -0,0 +1,16 @@ +using System; +using System.Web; + +public class SupportedExternalSinks +{ + public void M1() + { + var o = new object(); + var response = new HttpResponse(); + response.AddHeader("header", "value"); + response.AppendHeader("header", "value"); + response.Write(o); // Known sink. + response.WriteFile("filename"); // Known sink. + response.Write(o); // Known sink. + } +} diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.expected b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.expected new file mode 100644 index 00000000000..b85e33ddae7 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.expected @@ -0,0 +1,2 @@ +| System.Web.cs#System.Web#HttpResponse.Write(System.Object) | 2 | +| System.Web.cs#System.Web#HttpResponse.WriteFile(System.String) | 1 | diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.qlref b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.qlref new file mode 100644 index 00000000000..e8bd57fad50 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/SupportedExternalSinks.qlref @@ -0,0 +1 @@ +Telemetry/SupportedExternalSinks.ql \ No newline at end of file diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/options b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/options new file mode 100644 index 00000000000..9bbedebd7a2 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSinks/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /r:System.Collections.Specialized.dll +semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.cs b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.cs new file mode 100644 index 00000000000..2a4ea1fdb61 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.cs @@ -0,0 +1,12 @@ +using System; + +public class SupportExternalSources +{ + public void M1() + { + var l1 = Console.ReadLine(); // Known source. + var l2 = Console.ReadLine(); // Known source. + Console.SetError(Console.Out); + var x = Console.Read(); // Know source. + } +} diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.expected b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.expected new file mode 100644 index 00000000000..0f125b04b94 --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.expected @@ -0,0 +1,2 @@ +| System.Console.dll#System#Console.ReadLine() | 2 | +| System.Console.dll#System#Console.Read() | 1 | diff --git a/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.qlref b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.qlref new file mode 100644 index 00000000000..c6819c7775f --- /dev/null +++ b/csharp/ql/test/query-tests/Telemetry/SupportedExternalSources/SupportedExternalSources.qlref @@ -0,0 +1 @@ +Telemetry/SupportedExternalSources.ql diff --git a/csharp/ql/test/resources/stubs/EntityFramework.cs b/csharp/ql/test/resources/stubs/EntityFramework.cs index 85903ed8799..4612349a923 100644 --- a/csharp/ql/test/resources/stubs/EntityFramework.cs +++ b/csharp/ql/test/resources/stubs/EntityFramework.cs @@ -88,10 +88,16 @@ namespace Microsoft.EntityFrameworkCore } } - public static class RelationalDatabaseFacaseExtensions + public static class RelationalDatabaseFacadeExtensions { public static void ExecuteSqlCommand(this Infrastructure.DatabaseFacade db, string sql, params object[] parameters) { } public static Task ExecuteSqlCommandAsync(this Infrastructure.DatabaseFacade db, string sql, params object[] parameters) => throw null; + + public static int ExecuteSqlRaw(this Infrastructure.DatabaseFacade db, string sql, IEnumerable args) => throw null; + public static int ExecuteSqlRaw(this Infrastructure.DatabaseFacade db, string sql, params object[] args) => throw null; + public static Task ExecuteSqlRawAsync(this Infrastructure.DatabaseFacade db, string sql, System.Threading.CancellationToken token) => throw null; + public static Task ExecuteSqlRawAsync(this Infrastructure.DatabaseFacade db, string sql, params object[] args) => throw null; + public static Task ExecuteSqlRawAsync(this Infrastructure.DatabaseFacade db, string sql, IEnumerable args, System.Threading.CancellationToken token) => throw null; } struct RawSqlString @@ -100,6 +106,11 @@ namespace Microsoft.EntityFrameworkCore public static implicit operator Microsoft.EntityFrameworkCore.RawSqlString(FormattableString fs) => throw null; public static implicit operator Microsoft.EntityFrameworkCore.RawSqlString(string s) => throw null; } + + public static class RelationalQueryableExtensions + { + public static void FromSqlRaw(this DbSet set, string sql, params object[] args) => throw null; + } } namespace Microsoft.EntityFrameworkCore.Storage diff --git a/csharp/ql/test/resources/stubs/System.Web.cs b/csharp/ql/test/resources/stubs/System.Web.cs index d4961f7d211..725b672fbe8 100644 --- a/csharp/ql/test/resources/stubs/System.Web.cs +++ b/csharp/ql/test/resources/stubs/System.Web.cs @@ -156,6 +156,7 @@ namespace System.Web public class HttpResponse { public void Write(object o) { } + public void WriteFile(string s) { } public HttpCookieCollection Cookies => null; public void AddHeader(string name, string value) { } public void Redirect(string url) { } diff --git a/csharp/ql/test/shared/FlowSummaries.qll b/csharp/ql/test/shared/FlowSummaries.qll index 6afa16a744a..49744663040 100644 --- a/csharp/ql/test/shared/FlowSummaries.qll +++ b/csharp/ql/test/shared/FlowSummaries.qll @@ -1,44 +1,12 @@ import semmle.code.csharp.dataflow.FlowSummary import semmle.code.csharp.dataflow.internal.FlowSummaryImpl::Private::TestOutput +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate abstract class IncludeSummarizedCallable extends RelevantSummarizedCallable { IncludeSummarizedCallable() { [this.(Modifiable), this.(Accessor).getDeclaration()].isEffectivelyPublic() } - /** Gets the qualified parameter types of this callable as a comma-separated string. */ - private string parameterQualifiedTypeNamesToString() { - result = - concat(Parameter p, int i | - p = this.getParameter(i) - | - p.getType().getQualifiedName(), "," order by i - ) - } - - /** Holds if the summary should apply for all overrides of this. */ - predicate isBaseCallableOrPrototype() { - this.getDeclaringType() instanceof Interface - or - exists(Modifiable m | m = [this.(Modifiable), this.(Accessor).getDeclaration()] | - m.isAbstract() - or - this.getDeclaringType().(Modifiable).isAbstract() and m.(Virtualizable).isVirtual() - ) - } - - /** Gets a string representing, whether the summary should apply for all overrides of this. */ - private string getCallableOverride() { - if this.isBaseCallableOrPrototype() then result = "true" else result = "false" - } - /** Gets a string representing the callable in semi-colon separated format for use in flow summaries. */ - final override string getCallableCsv() { - exists(string namespace, string type | - this.getDeclaringType().hasQualifiedName(namespace, type) and - result = - namespace + ";" + type + ";" + this.getCallableOverride() + ";" + this.getName() + ";" + "(" - + this.parameterQualifiedTypeNamesToString() + ")" - ) - } + final override string getCallableCsv() { result = Csv::asPartialModel(this) } } diff --git a/csharp/ql/test/utils/model-generator/CaptureSinkModels.expected b/csharp/ql/test/utils/model-generator/CaptureSinkModels.expected new file mode 100644 index 00000000000..63cbcbb9cc0 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSinkModels.expected @@ -0,0 +1,4 @@ +| Sinks;NewSinks;false;WrapFieldResponseWriteFile;();;Argument[Qualifier];generated:html | +| Sinks;NewSinks;false;WrapPropResponseWriteFile;();;Argument[Qualifier];generated:html | +| Sinks;NewSinks;false;WrapResponseWrite;(System.Object);;Argument[0];generated:html | +| Sinks;NewSinks;false;WrapResponseWriteFile;(System.String);;Argument[0];generated:html | diff --git a/csharp/ql/test/utils/model-generator/CaptureSinkModels.qlref b/csharp/ql/test/utils/model-generator/CaptureSinkModels.qlref new file mode 100644 index 00000000000..c478ac760c4 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSinkModels.qlref @@ -0,0 +1 @@ +utils/model-generator/CaptureSinkModels.ql \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/CaptureSourceModels.expected b/csharp/ql/test/utils/model-generator/CaptureSourceModels.expected new file mode 100644 index 00000000000..f1cbc0bb151 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSourceModels.expected @@ -0,0 +1,3 @@ +| Sources;NewSources;false;WrapConsoleReadKey;();;ReturnValue;generated:local | +| Sources;NewSources;false;WrapConsoleReadLine;();;ReturnValue;generated:local | +| Sources;NewSources;false;WrapConsoleReadLineAndProcees;(System.String);;ReturnValue;generated:local | diff --git a/csharp/ql/test/utils/model-generator/CaptureSourceModels.qlref b/csharp/ql/test/utils/model-generator/CaptureSourceModels.qlref new file mode 100644 index 00000000000..10593c28e92 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSourceModels.qlref @@ -0,0 +1 @@ +utils/model-generator/CaptureSourceModels.ql \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/CaptureSummaryModels.expected b/csharp/ql/test/utils/model-generator/CaptureSummaryModels.expected new file mode 100644 index 00000000000..2d8e53ab14e --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSummaryModels.expected @@ -0,0 +1,33 @@ +| NoSummaries;PublicClassFlow;false;PublicReturn;(System.Object);;Argument[0];ReturnValue;generated:taint | +| Summaries;BaseClassFlow;true;ReturnParam;(System.Object);;Argument[0];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnField;();;Argument[Qualifier];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnParam0;(System.String,System.Object);;Argument[0];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnParam1;(System.String,System.Object);;Argument[1];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnParamMultiple;(System.Object,System.Object);;Argument[0];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnParamMultiple;(System.Object,System.Object);;Argument[1];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnSubstring;(System.String);;Argument[0];ReturnValue;generated:taint | +| Summaries;BasicFlow;false;ReturnThis;(System.Object);;Argument[Qualifier];ReturnValue;generated:value | +| Summaries;BasicFlow;false;SetField;(System.String);;Argument[0];Argument[Qualifier];generated:taint | +| Summaries;CollectionFlow;false;AddFieldToList;(System.Collections.Generic.List);;Argument[Qualifier];Argument[0].Element;generated:taint | +| Summaries;CollectionFlow;false;AddToList;(System.Collections.Generic.List,System.Object);;Argument[1];Argument[0].Element;generated:taint | +| Summaries;CollectionFlow;false;AssignFieldToArray;(System.Object[]);;Argument[Qualifier];Argument[0].Element;generated:taint | +| Summaries;CollectionFlow;false;AssignToArray;(System.Object,System.Object[]);;Argument[0];Argument[1].Element;generated:taint | +| Summaries;CollectionFlow;false;ReturnArrayElement;(System.Object[]);;Argument[0].Element;ReturnValue;generated:taint | +| Summaries;CollectionFlow;false;ReturnFieldInAList;();;Argument[Qualifier];ReturnValue;generated:taint | +| Summaries;CollectionFlow;false;ReturnListElement;(System.Collections.Generic.List);;Argument[0].Element;ReturnValue;generated:taint | +| Summaries;DerivedClass1Flow;false;ReturnParam1;(System.String,System.String);;Argument[1];ReturnValue;generated:taint | +| Summaries;DerivedClass2Flow;false;ReturnParam0;(System.String,System.Int32);;Argument[0];ReturnValue;generated:taint | +| Summaries;DerivedClass2Flow;false;ReturnParam;(System.Object);;Argument[0];ReturnValue;generated:taint | +| Summaries;EqualsGetHashCodeNoFlow;false;Equals;(System.String);;Argument[0];ReturnValue;generated:taint | +| Summaries;GenericFlow<>;false;AddFieldToGenericList;(System.Collections.Generic.List);;Argument[Qualifier];Argument[0].Element;generated:taint | +| Summaries;GenericFlow<>;false;AddToGenericList<>;(System.Collections.Generic.List,S);;Argument[1];Argument[0].Element;generated:taint | +| Summaries;GenericFlow<>;false;ReturnFieldInGenericList;();;Argument[Qualifier];ReturnValue;generated:taint | +| Summaries;GenericFlow<>;false;ReturnGenericElement<>;(System.Collections.Generic.List);;Argument[0].Element;ReturnValue;generated:taint | +| Summaries;GenericFlow<>;false;ReturnGenericField;();;Argument[Qualifier];ReturnValue;generated:taint | +| Summaries;GenericFlow<>;false;ReturnGenericParam<>;(S);;Argument[0];ReturnValue;generated:taint | +| Summaries;GenericFlow<>;false;SetGenericField;(T);;Argument[0];Argument[Qualifier];generated:taint | +| Summaries;IEnumerableFlow;false;ReturnFieldInIEnumerable;();;Argument[Qualifier];ReturnValue;generated:taint | +| Summaries;IEnumerableFlow;false;ReturnIEnumerable;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| Summaries;IEnumerableFlow;false;ReturnIEnumerableElement;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;generated:taint | +| Summaries;OperatorFlow;false;OperatorFlow;(System.Object);;Argument[0];Argument[Qualifier];generated:taint | +| Summaries;OperatorFlow;false;op_Addition;(Summaries.OperatorFlow,Summaries.OperatorFlow);;Argument[0];ReturnValue;generated:taint | diff --git a/csharp/ql/test/utils/model-generator/CaptureSummaryModels.qlref b/csharp/ql/test/utils/model-generator/CaptureSummaryModels.qlref new file mode 100644 index 00000000000..1ebf2afb19b --- /dev/null +++ b/csharp/ql/test/utils/model-generator/CaptureSummaryModels.qlref @@ -0,0 +1 @@ +utils/model-generator/CaptureSummaryModels.ql \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/NoSummaries.cs b/csharp/ql/test/utils/model-generator/NoSummaries.cs new file mode 100644 index 00000000000..75add7f3413 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/NoSummaries.cs @@ -0,0 +1,101 @@ +using System; + +namespace NoSummaries; + +// Single class with a method that produces a flow summary. +// Just to prove that, if a method like this is correctly exposed, a flow summary will be captured. +public class PublicClassFlow +{ + public object PublicReturn(object input) + { + return input; + } +} + +public sealed class PublicClassNoFlow +{ + private object PrivateReturn(object input) + { + return input; + } + + internal object InternalReturn(object input) + { + return input; + } + + private class PrivateClassNoFlow + { + public object ReturnParam(object input) + { + return input; + } + } + + private class PrivateClassNestedPublicClassNoFlow + { + public class NestedPublicClassFlow + { + public object ReturnParam(object input) + { + return input; + } + } + } +} + +public class EquatableBound : IEquatable +{ + public readonly bool tainted; + public bool Equals(object other) + { + return tainted; + } +} + +public class EquatableUnBound : IEquatable +{ + public readonly bool tainted; + public bool Equals(T? other) + { + return tainted; + } +} + +// No methods in this class will have generated flow summaries as +// simple types are used. +public class SimpleTypes +{ + public bool M1(bool b) + { + return b; + } + + public Boolean M2(Boolean b) + { + return b; + } + + public int M3(int i) + { + return i; + } + + public Int32 M4(Int32 i) + { + return i; + } +} + +public class HigherOrderParameters +{ + public string M1(string s, Func map) + { + return s; + } + + public object M2(Func map, object o) + { + return map(o); + } +} \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/Sinks.cs b/csharp/ql/test/utils/model-generator/Sinks.cs new file mode 100644 index 00000000000..3f89b5eae95 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/Sinks.cs @@ -0,0 +1,70 @@ +using System; +using System.Web; + +namespace Sinks; + +public class NewSinks +{ + private string privateTainted; + public string tainted; + + private string PrivateTaintedProp { get; set; } + public string TaintedProp { get; set; } + public string PrivateSetTaintedProp { get; private set; } + + // New sink + public void WrapResponseWrite(object o) + { + var response = new HttpResponse(); + response.Write(o); + } + + // NOT new sink as method is private + private void PrivateWrapResponseWrite(object o) + { + var response = new HttpResponse(); + response.Write(o); + } + + // New sink + public void WrapResponseWriteFile(string s) + { + var response = new HttpResponse(); + response.WriteFile(s); + } + + // New sink + public void WrapFieldResponseWriteFile() + { + var response = new HttpResponse(); + response.WriteFile(tainted); + } + + // NOT new sink as field is private + public void WrapPrivateFieldResponseWriteFile() + { + var response = new HttpResponse(); + response.WriteFile(privateTainted); + } + + // New sink + public void WrapPropResponseWriteFile() + { + var response = new HttpResponse(); + response.WriteFile(TaintedProp); + } + + // NOT new sink as property is private + public void WrapPrivatePropResponseWriteFile() + { + var response = new HttpResponse(); + response.WriteFile(PrivateTaintedProp); + } + + // NOT new sink as property setter is private + public void WrapPropPrivateSetResponseWriteFile() + { + var response = new HttpResponse(); + response.WriteFile(PrivateSetTaintedProp); + } +} \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/Sources.cs b/csharp/ql/test/utils/model-generator/Sources.cs new file mode 100644 index 00000000000..1db0cd233b3 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/Sources.cs @@ -0,0 +1,31 @@ +using System; + +namespace Sources; + +public class NewSources +{ + // New source + public string? WrapConsoleReadLine() + { + return Console.ReadLine(); + } + + // New source + public string WrapConsoleReadLineAndProcees(string prompt) + { + var s = Console.ReadLine(); + return string.IsNullOrEmpty(s) ? "" : s.ToUpper(); + } + + // NOT new source as method is private + private string? PrivateWrapConsoleReadLine() + { + return Console.ReadLine(); + } + + // New source + public ConsoleKeyInfo WrapConsoleReadKey() + { + return Console.ReadKey(); + } +} \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/Summaries.cs b/csharp/ql/test/utils/model-generator/Summaries.cs new file mode 100644 index 00000000000..c00d2181042 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/Summaries.cs @@ -0,0 +1,233 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +namespace Summaries; + +public class BasicFlow +{ + private string tainted; + + public BasicFlow ReturnThis(object input) + { + return this; + } + + public string ReturnParam0(string input0, object input1) + { + return input0; + } + + public object ReturnParam1(string input0, object input1) + { + return input1; + } + + public object ReturnParamMultiple(object input0, object input1) + { + return (System.DateTime.Now.DayOfWeek == System.DayOfWeek.Monday) ? input0 : input1; + } + + public string ReturnSubstring(string s) + { + return s.Substring(0, 1); + } + + public void SetField(string s) + { + tainted = s; + } + + public string ReturnField() + { + return tainted; + } +} + +public class CollectionFlow +{ + private string tainted; + + public object ReturnArrayElement(object[] input) + { + return input[0]; + } + + public void AssignToArray(object data, object[] target) + { + target[0] = data; + } + + public void AssignFieldToArray(object[] target) + { + target[0] = tainted; + } + + public object ReturnListElement(List input) + { + return input[0]; + } + + public void AddToList(List input, object data) + { + input.Add(data); + } + + public void AddFieldToList(List input) + { + input.Add(tainted); + } + + public List ReturnFieldInAList() + { + return new List { tainted }; + } +} + +public class IEnumerableFlow +{ + private string tainted; + + public IEnumerable ReturnIEnumerable(IEnumerable input) + { + return input; + } + + public object ReturnIEnumerableElement(IEnumerable input) + { + return input.First(); + } + + public IEnumerable ReturnFieldInIEnumerable() + { + return new List { tainted }; + } +} + +public class GenericFlow +{ + private T tainted; + + public void SetGenericField(T t) + { + tainted = t; + } + + public T ReturnGenericField() + { + return tainted; + } + + public void AddFieldToGenericList(List input) + { + input.Add(tainted); + } + + public List ReturnFieldInGenericList() + { + return new List { tainted }; + } + + public S ReturnGenericParam(S input) + { + return input; + } + + public S ReturnGenericElement(List input) + { + return input[0]; + } + + public void AddToGenericList(List input, S data) + { + input.Add(data); + } +} + +public abstract class BaseClassFlow +{ + public virtual object ReturnParam(object input) + { + return input; + } +} + +public class DerivedClass1Flow : BaseClassFlow +{ + public string ReturnParam1(string input0, string input1) + { + return input1; + } +} + +public class DerivedClass2Flow : BaseClassFlow +{ + public override object ReturnParam(object input) + { + return input; + } + + public string ReturnParam0(string input0, int input1) + { + return input0; + } +} + +public class OperatorFlow +{ + public readonly object Field; + + public OperatorFlow(object o) + { + Field = o; + } + + // Flow Summary. + public static OperatorFlow operator +(OperatorFlow a, OperatorFlow b) + { + return a; + } + + // No flow summary. + public static OperatorFlow operator ++(OperatorFlow a) + { + return new OperatorFlow(new object()); + } + + // No flow summary as this is an implicit conversion operator. + public static implicit operator OperatorFlow(string s) + { + return new OperatorFlow(s); + } + + // No flow summary as this is an explicit conversion operator. + public static explicit operator OperatorFlow(string[] b) + { + return new OperatorFlow(b); + } + +} + +public class EqualsGetHashCodeNoFlow +{ + public readonly bool boolTainted; + public readonly int intTainted; + + // No flow summary as this is an override of the Equals method. + public override bool Equals(object obj) + { + return boolTainted; + } + + // Flow summary as this is not an override of the object Equals method. + public string Equals(string s) + { + return s; + } + + // No flow summary as this is an override of the GetHashCode method. + public override int GetHashCode() + { + return intTainted; + } +} \ No newline at end of file diff --git a/csharp/ql/test/utils/model-generator/options b/csharp/ql/test/utils/model-generator/options new file mode 100644 index 00000000000..a55169c6e97 --- /dev/null +++ b/csharp/ql/test/utils/model-generator/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /r:System.Linq.dll /r:System.Collections.Specialized.dll +semmle-extractor-options: ${testdir}/../../resources/stubs/System.Web.cs diff --git a/csharp/tools/tracing-config.lua b/csharp/tools/tracing-config.lua new file mode 100644 index 00000000000..b4ff0206b02 --- /dev/null +++ b/csharp/tools/tracing-config.lua @@ -0,0 +1,57 @@ +function RegisterExtractorPack(id) + local extractor = GetPlatformToolsDirectory() .. + 'Semmle.Extraction.CSharp.Driver' + if OperatingSystem == 'windows' then extractor = extractor .. '.exe' end + local windowsMatchers = { + CreatePatternMatcher({'^dotnet%.exe$'}, MatchCompilerName, extractor, { + prepend = {'--dotnetexec', '--cil'}, + order = ORDER_BEFORE + }), + CreatePatternMatcher({'^csc.*%.exe$'}, MatchCompilerName, extractor, { + prepend = {'--compiler', '"${compiler}"', '--cil'}, + order = ORDER_BEFORE + + }), + CreatePatternMatcher({'^fakes.*%.exe$', 'moles.*%.exe'}, + MatchCompilerName, nil, {trace = false}) + } + local posixMatchers = { + CreatePatternMatcher({'^mcs%.exe$', '^csc%.exe$'}, MatchCompilerName, + extractor, { + prepend = {'--compiler', '"${compiler}"', '--cil'}, + order = ORDER_BEFORE + + }), + CreatePatternMatcher({'^mono', '^dotnet$'}, MatchCompilerName, + extractor, { + prepend = {'--dotnetexec', '--cil'}, + order = ORDER_BEFORE + }), function(compilerName, compilerPath, compilerArguments, _languageId) + if MatchCompilerName('^msbuild$', compilerName, compilerPath, + compilerArguments) or + MatchCompilerName('^xbuild$', compilerName, compilerPath, + compilerArguments) then + return { + order = ORDER_REPLACE, + invocation = BuildExtractorInvocation(id, compilerPath, + compilerPath, + compilerArguments, + nil, { + '/p:UseSharedCompilation=false' + }) + + } + end + end + } + if OperatingSystem == 'windows' then + return windowsMatchers + else + return posixMatchers + end + +end + +-- Return a list of minimum supported versions of the configuration file format +-- return one entry per supported major version. +function GetCompatibleVersions() return {'1.0.0'} end diff --git a/defs.bzl b/defs.bzl new file mode 100644 index 00000000000..d6748d83176 --- /dev/null +++ b/defs.bzl @@ -0,0 +1,5 @@ +codeql_platform = select({ + "@platforms//os:linux": "linux64", + "@platforms//os:macos": "osx64", + "@platforms//os:windows": "win64", +}) diff --git a/docs/codeql/codeql-cli/about-ql-packs.rst b/docs/codeql/codeql-cli/about-ql-packs.rst index 11326387b67..6568cf0a3e6 100644 --- a/docs/codeql/codeql-cli/about-ql-packs.rst +++ b/docs/codeql/codeql-cli/about-ql-packs.rst @@ -6,11 +6,8 @@ About QL packs QL packs are used to organize the files used in CodeQL analysis. They contain queries, library files, query suites, and important metadata. -The `CodeQL repository `__ contains QL packs for -C/C++, C#, Java, JavaScript, Python, and Ruby. The `CodeQL for Go -`__ repository contains a QL pack for Go -analysis. You can also make custom QL packs to contain your own queries and -libraries. +The `CodeQL repository `__ contains standard QL packs for all supported languages. +You can also make custom QL packs to contain your own queries and libraries. QL pack structure ----------------- diff --git a/docs/codeql/codeql-cli/analyzing-databases-with-the-codeql-cli.rst b/docs/codeql/codeql-cli/analyzing-databases-with-the-codeql-cli.rst index 46b3dde4e12..d3b04a32a0b 100644 --- a/docs/codeql/codeql-cli/analyzing-databases-with-the-codeql-cli.rst +++ b/docs/codeql/codeql-cli/analyzing-databases-with-the-codeql-cli.rst @@ -132,7 +132,7 @@ pack names and use the ``--download`` flag:: codeql database analyze microsoft/coding-standards@1.0.0 github/security-queries --format=sarifv2.1.0 --output=query-results.sarif --download -The ``analyze`` command above runs the default suite from ``microsoft/coding-standards v1.0.0`` and the latest version of ``github/secutiry-queries`` on the specified database. +The ``analyze`` command above runs the default suite from ``microsoft/coding-standards v1.0.0`` and the latest version of ``github/security-queries`` on the specified database. For further information about default suites, see ":ref:`Publishing and using CodeQL packs `". For more information about CodeQL packs, see :doc:`About CodeQL Packs `. @@ -147,7 +147,7 @@ you could use the following command from the directory containing your database: The analysis generates a file in the v2.1.0 SARIF format that is supported by all versions of GitHub. This file can be uploaded to GitHub by executing ``codeql github upload-results`` or the code scanning API. -For more information, see `Analyzing a CodeQL database `__ +For more information, see `Analyzing a CodeQL database `__ or `Code scanning API `__ in the GitHub documentation. CodeQL query suites are ``.qls`` files that use directives to select queries to run diff --git a/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst b/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst index 0cf07d574da..f859f07cb7c 100644 --- a/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst +++ b/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst @@ -193,8 +193,7 @@ further options on the command line. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The `CodeQL repository `__ contains -the queries and libraries required for CodeQL analysis of C/C++, C#, Java, -JavaScript/TypeScript, Python, and Ruby. +the queries and libraries required for CodeQL analysis of all supported languages. Clone a copy of this repository into ``codeql-home``. By default, the root of the cloned repository will be called ``codeql``. @@ -203,17 +202,18 @@ CLI that you will extract in step 4. If you use git on the command line, you can clone and rename the repository in a single step by running ``git clone git@github.com:github/codeql.git codeql-repo`` in the ``codeql-home`` folder. -The CodeQL libraries and queries for Go analysis live in the `CodeQL for Go -repository `__. Clone a copy of this -repository into ``codeql-home``, and run ``codeql-go/scripts/install-deps.sh`` -to install its dependencies. +For Go analysis, run ``codeql-repo/go/scripts/install-deps.sh`` to install its dependencies. -The cloned repositories should have a sibling relationship. -For example, if the root of the cloned CodeQL repository is -``$HOME/codeql-home/codeql-repo``, then the root of the cloned CodeQL for Go -repository should be ``$HOME/codeql-home/codeql-go``. +.. pull-quote:: Note -Within these repositories, the queries and libraries are organized into QL + The CodeQL libraries and queries for Go analysis used to live in a + separate `CodeQL for Go repository `__. + These have been moved to the ``github/codeql`` repository. + It is no longer necessary to clone the ``github/codeql-go`` into a separate ``codeql-home/codeql-go`` folder. + + For more information, see the `Relocation announcement `__. + +Within this repository, the queries and libraries are organized into QL packs. Along with the queries themselves, QL packs contain important metadata that tells the CodeQL CLI how to process the query files. For more information, see ":doc:`About QL packs `." diff --git a/docs/codeql/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code.rst b/docs/codeql/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code.rst index f3338283ba7..b04316f6296 100644 --- a/docs/codeql/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code.rst +++ b/docs/codeql/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code.rst @@ -28,7 +28,7 @@ Viewing the abstract syntax tree of a source file .. pull-quote:: Note - If you don't have an appropriate ``printAST.ql`` query in your workspace, the **CodeQL: View AST** command won't work. To fix this, you can update your copy of the `CodeQL `__ repository (or `CodeQL for Go `__ repository) from ``main``. If you do this, you may need to upgrade your databases. Also, query caches may be discarded and your next query runs could be slower. + If you don't have an appropriate ``printAST.ql`` query in your workspace, the **CodeQL: View AST** command won't work. To fix this, you can update your copy of the `CodeQL `__ repository from ``main``. If you do this, you may need to upgrade your databases. Also, query caches may be discarded and your next query runs could be slower. 3. Once the query has run, the AST viewer displays the structure of the source file. 4. To see the nested structure, click the arrows and expand the nodes. diff --git a/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst b/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst index a43c69edecb..b632a86af4c 100644 --- a/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst +++ b/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst @@ -69,8 +69,7 @@ There are two ways to do this: This ensures that the queries and libraries you write in VS Code also work in the query console on LGTM Enterprise. If you prefer to add the CodeQL queries and libraries to an :ref:`existing workspace ` instead of the starter workspace, then you should - clone the appropriate branch of the `general CodeQL repository `__ and the - `CodeQL repository for Go `__ and add them to your workspace. + clone the appropriate branch of the `CodeQL repository `__ and add it to your workspace. .. _starter-workspace: @@ -78,8 +77,7 @@ Using the starter workspace ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The starter workspace is a Git repository. It contains: -* The `repository of CodeQL libraries and queries `__ for C/C++, C#, Java, JavaScript, Python, and Ruby. This is included as a submodule, so it can be updated without affecting your custom queries. -* The `repository of CodeQL libraries and queries `__ for Go. This is also included as a submodule. +* The `repository of CodeQL libraries and queries `__ all supported languages. This is included as a submodule, so it can be updated without affecting your custom queries. * A series of folders named ``codeql-custom-queries-``. These are ready for you to start developing your own custom queries for each language, using the standard libraries. There are some example queries to get you started. To use the starter workspace: @@ -114,10 +112,6 @@ For example, to make a custom CodeQL folder called ``my-custom-cpp-pack`` depend For more information about why you need to add a ``qlpack.yml`` file, see ":ref:`About QL packs `." -.. pull-quote:: Note - - The CodeQL libraries for Go are not included in the ``github/codeql`` repository, but are stored separately. To analyze Go projects, clone the repository at https://github.com/github/codeql-go and add it to your workspace as above. - Further reading ---------------- diff --git a/docs/codeql/codeql-language-guides/modeling-data-flow-in-go-libraries.rst b/docs/codeql/codeql-language-guides/modeling-data-flow-in-go-libraries.rst index 9e3c068701e..e8b1880b772 100644 --- a/docs/codeql/codeql-language-guides/modeling-data-flow-in-go-libraries.rst +++ b/docs/codeql/codeql-language-guides/modeling-data-flow-in-go-libraries.rst @@ -7,8 +7,8 @@ When analyzing a Go program, CodeQL does not examine the source code for external packages. To track the flow of untrusted data through a library, you can create a model of the library. -You can find existing models in the ``ql/src/semmle/go/frameworks/`` folder of the -`CodeQL for Go repository `__. +You can find existing models in the ``go/ql/lib/semmle/go/frameworks/`` folder of the +`CodeQL repository `__. To add a new model, you should make a new file in that folder, named after the library. Sources @@ -102,8 +102,8 @@ Data-flow sinks are specified by queries rather than by library models. However, you can use library models to indicate when functions belong to special categories. Queries can then use these categories when specifying sinks. Classes representing these special categories are contained in -``ql/src/semmle/go/Concepts.qll`` in the `CodeQL for Go repository -`__. +``go/ql/lib/semmle/go/Concepts.qll`` in the `CodeQL repository +`__. ``Concepts.qll`` includes classes for logger mechanisms, HTTP response writers, HTTP redirects, and marshaling and unmarshaling functions. diff --git a/docs/codeql/ql-language-reference/expressions.rst b/docs/codeql/ql-language-reference/expressions.rst index 1bf39dda6ba..eb1907b1a2c 100644 --- a/docs/codeql/ql-language-reference/expressions.rst +++ b/docs/codeql/ql-language-reference/expressions.rst @@ -227,8 +227,9 @@ The following aggregates are available in QL: - ``min`` and ``max``: These aggregates determine the smallest (``min``) or largest (``max``) value of ```` among the possible assignments to the aggregation variables. - In this case, ```` must be of numeric type or of type ``string``. - + ```` must be of numeric type or of type ``string``, or an explicit order must be defined with ``order by``. + When using ``order by``, more than one result may exist in case of ties. + For example, the following aggregation returns the name of the ``.js`` file (or files) with the largest number of lines, using the number of lines of code to break ties: @@ -297,9 +298,10 @@ The following aggregates are available in QL: .. index:: rank - ``rank``: This aggregate takes the possible values of ```` and ranks them. - In this case, ```` must be of numeric type or of type ``string``. The aggregation - returns the value that is ranked in the position specified by the **rank expression**. + ```` must be of numeric type or of type ``string``, or an explicit order must be defined with ``order by``. + The aggregation returns the value that is ranked in the position specified by the **rank expression**. You must include this rank expression in brackets after the keyword ``rank``. + When using ``order by``, more than one result may exist in case of ties. For example, the following aggregation returns the value that is ranked 4th out of all the possible values. In this case, ``8`` is the 4th integer in the range from ``5`` through diff --git a/docs/codeql/ql-language-reference/formulas.rst b/docs/codeql/ql-language-reference/formulas.rst index b92ca96142c..cdc8c297b7d 100644 --- a/docs/codeql/ql-language-reference/formulas.rst +++ b/docs/codeql/ql-language-reference/formulas.rst @@ -100,12 +100,12 @@ As a consequence, ``A != B`` has a very different meaning to the :ref:`negation - ``1 = [1 .. 2]`` holds, because ``1 = 1``. - ``not 1 = [1 .. 2]`` doesn't hold, because there is a common value (``1``). -#. Compare ``1`` and ``none()`` (the "empty set"): - - ``1 != none()`` doesn't hold, because there are no values in ``none()``, so no values +#. Compare ``1`` and ``int empty() { none() }`` (a predicate defining the empty set of integers): + - ``1 != empty()`` doesn't hold, because there are no values in ``empty()``, so no values that are not equal to ``1``. - - ``1 = none()`` also doesn't hold, because there are no values in ``none()``, so no values + - ``1 = empty()`` also doesn't hold, because there are no values in ``empty()``, so no values that are equal to ``1``. - - ``not 1 = none()`` holds, because there are no common values. + - ``not 1 = empty()`` holds, because there are no common values. .. index:: instanceof .. _type-checks: @@ -295,9 +295,48 @@ necessary, since they highlight the default precedence. You usually only add par override the default precedence, but you can also add them to make your code easier to read (even if they aren't required). +QL also has two nullary connectives indicating the always true formula, +``any()``, and the always false formula, ``none()``. + The logical connectives in QL work similarly to Boolean connectives in other programming languages. Here is a brief overview: +.. index:: any, true +.. _true: + +``any()`` +========= + +The built-in predicate ``any()`` is a formula that always holds. + +**Example** + +The following predicate defines the set of all expressions. + +.. code-block:: ql + + Expr allExpressions() { + any() + } + +.. index:: none, false +.. _false: + +``none()`` +========== + +The built-in predicate ``none()`` is a formula that never holds. + +**Example** + +The following predicate defines the empty set of integers. + +.. code-block:: ql + + int emptySet() { + none() + } + .. index:: not, negation .. _negation: diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst index 2ba7887fec0..46d0123d6d4 100644 --- a/docs/codeql/ql-language-reference/ql-language-specification.rst +++ b/docs/codeql/ql-language-reference/ql-language-specification.rst @@ -364,7 +364,7 @@ A *variable declaration list* provides a sequence of variables and a type for ea :: var_decls ::= (var_decl ("," var_decl)*)? - var_decl ::= type simpleId + var_decl ::= type lowerId A valid variable declaration list must not include two declarations with the same variable name. Moreover, if the declaration has a typing environment that applies, it must not use a variable name that is already present in that typing environment. @@ -585,7 +585,7 @@ Identifiers are used in following syntactic constructs: dbasetype ::= atLowerId predicateRef ::= (moduleId "::")? literalId predicateName ::= lowerId - varname ::= simpleId + varname ::= lowerId literalId ::= lowerId | atLowerId Integer literals (int) @@ -948,7 +948,7 @@ The ``select`` keyword is followed by a number of *select expressions*. Select e :: as_exprs ::= as_expr ("," as_expr)* - as_expr ::= expr ("as" simpleId)? + as_expr ::= expr ("as" lowerId)? The keyword ``as`` gives a *label* to the select expression it is part of. No two select expressions may have the same label. No expression label may be the same as one of the variables of the select clause. @@ -957,7 +957,7 @@ The ``order`` keyword, if present, is followed by a number of *ordering directiv :: orderbys ::= orderby ("," orderby)* - orderby ::= simpleId ("asc" | "desc")? + orderby ::= lowerId ("asc" | "desc")? Each identifier in an ordering directive must identify exactly one of the select expressions. It must either be the label of the expression, or it must be a variable expression that is equivalent to exactly one of the select expressions. The type of the designated select expression must be a subtype of a primitive type. @@ -2042,11 +2042,11 @@ The complete grammar for QL is as follows: as_exprs ::= as_expr ("," as_expr)* - as_expr ::= expr ("as" simpleId)? + as_expr ::= expr ("as" lowerId)? orderbys ::= orderby ("," orderby)* - orderby ::= simpleId ("asc" | "desc")? + orderby ::= lowerId ("asc" | "desc")? predicate ::= qldoc? annotations head optbody @@ -2095,7 +2095,7 @@ The complete grammar for QL is as follows: var_decls ::= (var_decl ("," var_decl)*)? - var_decl ::= type simpleId + var_decl ::= type lowerId formula ::= fparen | disjunction @@ -2216,6 +2216,6 @@ The complete grammar for QL is as follows: predicateName ::= lowerId - varname ::= simpleId + varname ::= lowerId literalId ::= lowerId | atLowerId | "any" | "none" diff --git a/docs/codeql/ql-language-reference/types.rst b/docs/codeql/ql-language-reference/types.rst index 7bf0efdbf73..db9a6a4cc52 100644 --- a/docs/codeql/ql-language-reference/types.rst +++ b/docs/codeql/ql-language-reference/types.rst @@ -387,26 +387,26 @@ from ``OneTwoThree`` and ``int``. Non-extending subtypes ====================== -Besides extending base types, classes can also declare `instanceof` relationships with other types. -Declaring a class as `instanceof Foo` is roughly equivalent to saying `this instanceof Foo` in the characteristic predicate. -The main differences are that you can call methods on Bar via `super` and you can get better optimisation. +Besides extending base types, classes can also declare ``instanceof`` relationships with other types. +Declaring a class as ``instanceof Foo`` is roughly equivalent to saying ``this instanceof Foo`` in the characteristic predicate. +The main differences are that you can call methods on ``Bar`` via ``super`` and you can get better optimisation. .. code-block:: ql class Foo extends int { Foo() { this in [1 .. 10] } - string foo_method() { result = "foo" } + string fooMethod() { result = "foo" } } class Bar instanceof Foo { - string toString() { result = super.foo_method() } + string toString() { result = super.fooMethod() } } -In this example, the characteristic predicate from `Foo` also applies to `Bar`. -However, `foo_method` is not exposed in `Bar`, so the query `select any(Bar b).foo_method()` +In this example, the characteristic predicate from ``Foo`` also applies to ``Bar``. +However, ``fooMethod`` is not exposed in ``Bar``, so the query ``select any(Bar b).fooMethod()`` results in a compile time error. Note from the example that it is still possible to access -methods from instanceof supertypes from within the specialising class with the `super` keyword. +methods from instanceof supertypes from within the specialising class with the ``super`` keyword. Crucially, the instanceof **supertypes** are not **base types**. This means that these supertypes do not participate in overriding, and any fields of such @@ -430,10 +430,10 @@ The following example demonstrates this. override string foo() { result = "bar" } } -Here, the method `Bar::foo` does not override `Foo::foo`. -Instead, it overrides only `Interface::foo`. -This means that `select any(Foo f).foo()` yields only `foo`. -Had `Bar` been defined as `extends Foo`, then `select any(Foo b)` would yield `bar`. +Here, the method ``Bar::foo`` does not override ``Foo::foo``. +Instead, it overrides only ``Interface::foo``. +This means that ``select any(Foo f).foo()`` yields ``foo``. +Had ``Bar`` been defined as ``extends Foo``, then ``select any(Foo f).foo()`` would yield ``bar``. .. _character-types: .. _domain-types: diff --git a/docs/codeql/ql-language-reference/variables.rst b/docs/codeql/ql-language-reference/variables.rst index 2b84e125971..5179183ef78 100644 --- a/docs/codeql/ql-language-reference/variables.rst +++ b/docs/codeql/ql-language-reference/variables.rst @@ -24,7 +24,7 @@ Declaring a variable All variable declarations consist of a :ref:`type ` and a name for the variable. The name can be any `identifier `_ -that starts with an uppercase or lowercase letter. +that starts with a lowercase letter. For example, ``int i``, ``SsaDefinitionNode node``, and ``LocalScopeVariable lsv`` declare variables ``i``, ``node``, and ``lsv`` with types ``int``, ``SsaDefinitionNode``, and diff --git a/docs/codeql/query-help/go.rst b/docs/codeql/query-help/go.rst index e81d759f807..9e3050f74d0 100644 --- a/docs/codeql/query-help/go.rst +++ b/docs/codeql/query-help/go.rst @@ -3,6 +3,6 @@ CodeQL query help for Go .. include:: ../reusables/query-help-overview.rst -For shorter queries that you can use as building blocks when writing your own queries, see the `example queries in the CodeQL for Go repository `__. +For shorter queries that you can use as building blocks when writing your own queries, see the `example queries in the CodeQL repository `__. .. include:: toc-go.rst diff --git a/docs/codeql/reusables/go-further-reading.rst b/docs/codeql/reusables/go-further-reading.rst index 275d3c85c3e..cf8ee287b7c 100644 --- a/docs/codeql/reusables/go-further-reading.rst +++ b/docs/codeql/reusables/go-further-reading.rst @@ -1,3 +1,3 @@ -- `CodeQL queries for Go `__ -- `Example queries for Go `__ +- `CodeQL queries for Go `__ +- `Example queries for Go `__ - `CodeQL library reference for Go `__ diff --git a/docs/codeql/support/reusables/frameworks.rst b/docs/codeql/support/reusables/frameworks.rst index 246b03ee85f..12bcd5af8e6 100644 --- a/docs/codeql/support/reusables/frameworks.rst +++ b/docs/codeql/support/reusables/frameworks.rst @@ -173,7 +173,12 @@ Python built-in support starlette, Asynchronous Server Gateway Interface (ASGI) python-ldap, Lightweight Directory Access Protocol (LDAP) ldap3, Lightweight Directory Access Protocol (LDAP) + httpx, HTTP client + pycurl, HTTP client requests, HTTP client + urllib, HTTP client + urllib2, HTTP client + urllib3, HTTP client dill, Serialization PyYAML, Serialization ruamel.yaml, Serialization @@ -206,3 +211,7 @@ Python built-in support pycryptodomex, Cryptography library rsa, Cryptography library MarkupSafe, Escaping Library + libtaxii, TAXII utility library + libxml2, XML processing library + lxml, XML processing library + xmltodict, XML processing library diff --git a/docs/codeql/support/reusables/versions-compilers.rst b/docs/codeql/support/reusables/versions-compilers.rst index edfaaa118b2..a5f68cb64e1 100644 --- a/docs/codeql/support/reusables/versions-compilers.rst +++ b/docs/codeql/support/reusables/versions-compilers.rst @@ -16,21 +16,21 @@ .NET Core up to 3.1 .NET 5, .NET 6","``.sln``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" - Go (aka Golang), "Go up to 1.17", "Go 1.11 or more recent", ``.go`` - Java,"Java 7 to 17 [4]_","javac (OpenJDK and Oracle JDK), + Go (aka Golang), "Go up to 1.18", "Go 1.11 or more recent", ``.go`` + Java,"Java 7 to 18 [4]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [5]_",``.java`` JavaScript,ECMAScript 2021 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [6]_" Python,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10",Not applicable,``.py`` Ruby [7]_,"up to 3.0.2",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" - TypeScript [8]_,"2.6-4.5",Standard TypeScript compiler,"``.ts``, ``.tsx``" + TypeScript [8]_,"2.6-4.6",Standard TypeScript compiler,"``.ts``, ``.tsx``" .. container:: footnote-group .. [1] C++20 support is currently in beta. Supported for GCC on Linux only. Modules are *not* supported. .. [2] Support for the clang-cl compiler is preliminary. .. [3] Support for the Arm Compiler (armcc) is preliminary. - .. [4] Builds that execute on Java 7 to 17 can be analyzed. The analysis understands Java 17 standard language features. + .. [4] Builds that execute on Java 7 to 18 can be analyzed. The analysis understands Java 18 standard language features. .. [5] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. .. [6] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. .. [7] Requires glibc 2.17. diff --git a/docs/codeql/writing-codeql-queries/about-codeql-queries.rst b/docs/codeql/writing-codeql-queries/about-codeql-queries.rst index fc7da3b67bb..be5bca75622 100644 --- a/docs/codeql/writing-codeql-queries/about-codeql-queries.rst +++ b/docs/codeql/writing-codeql-queries/about-codeql-queries.rst @@ -121,7 +121,7 @@ Select clauses for diagnostic queries (``@kind diagnostic``) and summary metric Viewing the standard CodeQL queries *********************************** -One of the easiest ways to get started writing your own queries is to modify an existing query. To view the standard CodeQL queries, or to try out other examples, visit the `CodeQL `__ and `CodeQL for Go `__ repositories on GitHub. +One of the easiest ways to get started writing your own queries is to modify an existing query. To view the standard CodeQL queries, or to try out other examples, visit the `CodeQL `__ repository on GitHub. You can also find examples of queries developed to find security vulnerabilities and bugs in open source software projects on the `GitHub Security Lab website `__ and in the associated `repository `__. diff --git a/docs/codeql/writing-codeql-queries/creating-path-queries.rst b/docs/codeql/writing-codeql-queries/creating-path-queries.rst index 4eec766d488..c41b67d427c 100644 --- a/docs/codeql/writing-codeql-queries/creating-path-queries.rst +++ b/docs/codeql/writing-codeql-queries/creating-path-queries.rst @@ -116,7 +116,7 @@ Declaring sources and sinks You must provide information about the ``source`` and ``sink`` in your path query. These are objects that correspond to the nodes of the paths that you are exploring. The name and the type of the ``source`` and the ``sink`` must be declared in the ``from`` statement of the query, and the types must be compatible with the nodes of the graph computed by the ``edges`` predicate. -If you are querying C/C++, C#, Java, JavaScript, Python, or Ruby code (and you have used ``import DataFlow::PathGraph`` in your query), the definitions of the ``source`` and ``sink`` are accessed via the ``Configuration`` class in the data flow library. You should declare all three of these objects in the ``from`` statement. +If you are querying C/C++, C#, Go, Java, JavaScript, Python, or Ruby code (and you have used ``import DataFlow::PathGraph`` in your query), the definitions of the ``source`` and ``sink`` are accessed via the ``Configuration`` class in the data flow library. You should declare all three of these objects in the ``from`` statement. For example: .. code-block:: ql diff --git a/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst b/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst index 20ebe8133a1..2009277d141 100644 --- a/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst +++ b/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst @@ -78,6 +78,8 @@ To avoid these problems, a data-flow ``Configuration`` comes with a mechanism fo */ final predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { +There is also a ``Configuration.hasPartialFlowRev`` for exploring flow backwards from a sink. + As noted in the documentation for ``hasPartialFlow`` (for example, in the `CodeQL for Java documentation `__) you must first enable this by adding an override of ``explorationLimit``. For example: @@ -87,6 +89,8 @@ As noted in the documentation for ``hasPartialFlow`` (for example, in the This defines the exploration radius within which ``hasPartialFlow`` returns results. +To get good performance when using ``hasPartialFlow`` it is important to ensure the ``isSink`` predicate of the configuration has no results. Likewise, when using ``hasPartialFlowRev`` the ``isSource`` predicate of the configuration should have no results. + It is also useful to focus on a single source at a time as the starting point for the flow exploration. This is most easily done by adding a temporary restriction in the ``isSource`` predicate. To do quick evaluations of partial flow it is often easiest to add a predicate to the query that is solely intended for quick evaluation (right-click the predicate name and choose "CodeQL: Quick Evaluation"). A good starting point is something like: @@ -113,4 +117,4 @@ Further reading ---------------- - :ref:`About data flow analysis ` -- :ref:`Creating path queries ` \ No newline at end of file +- :ref:`Creating path queries ` diff --git a/docs/pre-commit-hook-setup.md b/docs/pre-commit-hook-setup.md index 9927acba85c..762ec1ca9c4 100644 --- a/docs/pre-commit-hook-setup.md +++ b/docs/pre-commit-hook-setup.md @@ -1,6 +1,44 @@ # CodeQL pre-commit-hook setup -As stated in [CONTRIBUTING](../CONTRIBUTING.md) all CodeQL files must be formatted according to our [CodeQL style guide](ql-style-guide.md). You can use our pre-commit hook to avoid committing incorrectly formatted code. To use it, simply copy the [pre-commit](../misc/scripts/pre-commit) script to `.git/hooks/pre-commit` and make sure that: + +As stated in [CONTRIBUTING](../CONTRIBUTING.md) all CodeQL files must be formatted according to our [CodeQL style guide](ql-style-guide.md). You can use a pre-commit hook to avoid committing incorrectly formatted code, as well as prevent some other easily checkable errors. + +## Using the `pre-commit` framework + +Preferably, you can use the [pre-commit framework](https://pre-commit.com/). There are some pre-commit hooks already configured on [`.pre-commit-config.yaml`](../.pre-commit-config.yaml). In order to install them you need to follow pre-commit's [installation instructions](https://pre-commit.com/#installation) and then run `pre-commit install`. Typically (assuming you have [`pip`](https://pip.pypa.io/en/stable/installation/) installed): +``` +python3 -m pip install pre-commit +pre-commit install +``` + +Also, make sure that the CodeQL CLI has been added to your `PATH`. + +By default, pre-commit will check and fix: +* trailing whitespaces; +* absence of or duplicate newlines at end of files; +* QL formatting; +* files out of sync (see [`config/sync-files.py`](../config/sync-files.py)). + +It will additionally check: +* `.qhelp` files for query help generation. + +It will run the checks only on files changed by the commit (except for the file sync check) and it will skip all files under `test` directories unless they are `.ql`, `.qll` or `.qlref` files. + +If you want to change any behaviour (for example, you want to skip the out-of-sync file check, or you want to avoid auto-fixing formatting or file syncing), you can copy the configuration file to a separate location, modify it and use that. For example +``` +cp .pre-commit-config.yaml ~/my-codeql-pre-commit-config.yaml +pre-commit install --config ~/my-codeql-pre-commit-config.yaml +# edit ~/my-codeql-pre-commit-config.yaml to your liking +``` + +You can for example: +* change `--in-place` to `--check-only` in the `codeql-format` hook to have it report formatting problems instead of auto-fixing them; +* remove `--latest` in the `sync-files` hook to do the same; +* remove any hook altogether. + +## Manual approach + +You can have the formatting check in place by copying the [pre-commit](../misc/scripts/pre-commit) script to `.git/hooks/pre-commit` and make sure that: - The script is executable. On Linux and macOS this can be done using `chmod +x`. - The CodeQL CLI has been added to your `PATH`. diff --git a/docs/ql-libraries/dataflow/dataflow.md b/docs/ql-libraries/dataflow/dataflow.md index 31a8e12a5cc..1b6d52ee994 100644 --- a/docs/ql-libraries/dataflow/dataflow.md +++ b/docs/ql-libraries/dataflow/dataflow.md @@ -125,7 +125,7 @@ For further details about `PostUpdateNode` see [Field flow](#field-flow) below. Nodes corresponding to expressions and parameters are the most common for users to interact with so a couple of convenience predicates are generally included: -``` +```ql DataFlowExpr Node::asExpr() Parameter Node::asParameter() ExprNode exprNode(DataFlowExpr n) @@ -266,10 +266,23 @@ as described above. ## Field flow The library supports tracking flow through field stores and reads. In order to -support this, a class `Content` and two predicates -`storeStep(Node node1, Content f, Node node2)` and -`readStep(Node node1, Content f, Node node2)` must be defined. It generally -makes sense for stores to target `PostUpdateNode`s, but this is not a strict +support this, two classes `ContentSet` and `Content`, and two predicates +`storeStep(Node node1, ContentSet f, Node node2)` and +`readStep(Node node1, ContentSet f, Node node2)`, must be defined. The interaction +between `ContentSet` and `Content` is defined through + +```ql +Content ContentSet::getAStoreContent(); +Content ContentSet::getAReadContent(); +``` + +which means that a `storeStep(n1, cs, n2)` will be interpreted as storing into _any_ +of `cs.getAStoreContent()`, and dually that a `readStep(n1, cs, n2)` will be +interpreted as reading from _any_ of `cs.getAReadContent()`. In most cases, there +will be a simple bijection between `ContentSet` and `Content`, but when modelling +for example flow through arrays it can be more involved (see [Example 4](#example-4)). + +It generally makes sense for stores to target `PostUpdateNode`s, but this is not a strict requirement. Besides this, certain nodes must have associated `PostUpdateNode`s. The node associated with a `PostUpdateNode` should be defined by `PostUpdateNode::getPreUpdateNode()`. @@ -294,7 +307,7 @@ through a couple of examples. ### Example 1 Consider the following setter and its call: -``` +```java setFoo(obj, x) { sink1(obj.foo); obj.foo = x; @@ -335,12 +348,12 @@ call sites. In the following two lines we would like flow from `x` to reach the `PostUpdateNode` of `a` through a sequence of two store steps, and this is indeed handled automatically by the shared library. -``` +```java a.b.c = x; a.getB().c = x; ``` The only requirement for this to work is the existence of `PostUpdateNode`s. -For a specified read step (in `readStep(Node n1, Content f, Node n2)`) the +For a specified read step (in `readStep(Node n1, ContentSet c, Node n2)`) the shared library will generate a store step in the reverse direction between the corresponding `PostUpdateNode`s. A similar store-through-reverse-read will be generated for calls that can be summarized by the shared library as getters. @@ -370,26 +383,123 @@ itself as this represents the value of the object after construction, that is after the constructor has run. With this setup of `ArgumentNode`s and `PostUpdateNode`s we will achieve the desired flow from `source` to `sink` +### Example 4 + +Assume we want to track flow through arrays precisely: + +```rb +a[0] = tainted +a[1] = not_tainted +sink(a[0]) # bad +sink(a[1]) # good +sink(a[unknown]) # bad; unknown may be 0 + +b[unknown] = tainted +sink(b[0]) # bad; unknown may be 0 + +c[unknown][0] = tainted +c[unknown][1] = not_tainted +sink(c[0][0]) # bad; unknown may be 0 +sink(c[0][1]) # good +``` + +This can be done by defining + +```ql +newtype TContent = + TKnownArrayElementContent(int i) { i in [0 .. 10] } or + TUnknownArrayElementContent() + +class Content extends TContent { + ... +} + +newtype TContentSet = + TSingletonContent(Content c) or + TAnyArrayElementContent() + +class ContentSet extends TContentSet { + Content getAStoreContent() { + this = TSingletonContent(result) + or + // for reverse stores + this = TAnyArrayElementContent() and + result = TUnknownArrayElementContent() + } + + Content getAReadContent() { + this = TSingletonContent(result) + or + this = TAnyArrayElementContent() and + (result = TUnknownArrayElementContent() or result = TKnownArrayElementContent(_)) + } +} +``` + +and we will have the following store/read steps +```rb +# storeStep(tainted, TSingletonContent(TKnownArrayElementContent(0)), [post update] a) +a[0] = tainted + +# storeStep(not_tainted, TSingletonContent(TKnownArrayElementContent(1)), [post update] a) +a[1] = not_tainted + +# readStep(a, TSingletonContent(TKnownArrayElementContent(0)), a[0]) +# readStep(a, TSingletonContent(TUnknownArrayElementContent()), a[0]) +sink(a[0]) # bad + +# readStep(a, TSingletonContent(TKnownArrayElementContent(1)), a[1]) +# readStep(a, TSingletonContent(TUnknownArrayElementContent()), a[1]) +sink(a[1]) # good + +# readStep(a, TAnyArrayElementContent(), a[unknown]) +sink(a[unknown]) # bad; unknown may be 0 + +# storeStep(tainted, TSingletonContent(TUnknownArrayElementContent()), [post update] b) +b[unknown] = tainted + +# readStep(b, TSingletonContent(TKnownArrayElementContent(0)), b[0]) +# readStep(b, TSingletonContent(TUnknownArrayElementContent()), b[0]) +sink(b[0]) # bad; unknown may be 0 + +# storeStep(tainted, TSingletonContent(TKnownArrayElementContent(0)), [post update] c[unknown]) +# storeStep(not_tainted, TSingletonContent(TKnownArrayElementContent(1)), [post update] c[unknown]) +# readStep(c, TAnyArrayElementContent(), c[unknown]) +# storeStep([post update] c[unknown], TAnyArrayElementContent(), [post update] c) # auto-generated reverse store (see Example 2) +c[unknown][0] = tainted +c[unknown][1] = not_tainted + + +# readStep(c[0], TSingletonContent(TKnownArrayElementContent(0)), c[0][0]) +# readStep(c[0], TSingletonContent(TUnknownArrayElementContent()), c[0][0]) +# readStep(c[0], TSingletonContent(TKnownArrayElementContent(1)), c[0][1]) +# readStep(c[0], TSingletonContent(TUnknownArrayElementContent()), c[0][1]) +# readStep(c, TSingletonContent(TKnownArrayElementContent(0)), c[0]) +# readStep(c, TSingletonContent(TUnknownArrayElementContent()), c[0]) +sink(c[0][0]) # bad; unknown may be 0 +sink(c[0][1]) # good +``` + ### Field flow barriers Consider this field flow example: -``` +```java obj.f = source; obj.f = safeValue; sink(obj.f); ``` or the similar case when field flow is used to model collection content: -``` +```java obj.add(source); obj.clear(); sink(obj.get(key)); ``` Clearing a field or content like this should act as a barrier, and this can be -achieved by marking the relevant `Node, Content` pair as a clear operation in +achieved by marking the relevant `Node, ContentSet` pair as a clear operation in the `clearsContent` predicate. A reasonable default implementation for fields looks like this: ```ql -predicate clearsContent(Node n, Content c) { +predicate clearsContent(Node n, ContentSet c) { n = any(PostUpdateNode pun | storeStep(_, c, pun)).getPreUpdateNode() } ``` @@ -397,6 +507,14 @@ However, this relies on the local step relation using the smallest possible use-use steps. If local flow is implemented using def-use steps, then `clearsContent` might not be easy to use. +Note that `clearsContent(n, cs)` is interpreted using `cs.getAReadContent()`. + +Dually, there exists a predicate +```ql +predicate expectsContent(Node n, ContentSet c); +``` +which acts as a barrier when data is _not_ stored inside one of `c.getAReadContent()`. + ## Type pruning The library supports pruning paths when a sequence of value-preserving steps @@ -415,13 +533,13 @@ as a single entity (this improves performance). As an example, Java uses erased types for this purpose and a single equivalence class for all numeric types. The type of a `Node` is given by the following predicate -``` +```ql DataFlowType getNodeType(Node n) ``` and every `Node` should have a type. One also needs to define the string representation of a `DataFlowType`: -``` +```ql string ppReprType(DataFlowType t) ``` The `ppReprType` predicate is used for printing a type in the labels of @@ -499,7 +617,7 @@ predicate nodeIsHidden(Node n) ### Unreachable nodes Consider: -``` +```java foo(source1, false); foo(source2, true); diff --git a/docs/supported-queries.md b/docs/supported-queries.md index 2d76906e82f..2393ade24f5 100644 --- a/docs/supported-queries.md +++ b/docs/supported-queries.md @@ -27,7 +27,7 @@ The process must begin with the first step and must conclude with the final step Add one or more unit tests for the query (and for any library changes you make) to the `ql//ql/test/experimental` directory. Tests for library changes go into the `library-tests` subdirectory, and tests for queries go into `query-tests` with their relative path mirroring the query's location under `ql//ql/src/experimental`. - - See the section on [Testing custom queries](https://help.semmle.com/codeql/codeql-cli/procedures/test-queries.html) in the [CodeQL documentation](https://codeql.github.com/docs/) for more information. + - See the section on [Testing custom queries](https://codeql.github.com/docs/codeql-cli/testing-custom-queries/) in the [CodeQL documentation](https://codeql.github.com/docs/) for more information. - See [C/C++ CodeQL tests](/cpp/ql/test/README.md) for more information about contributing tests for C/C++ queries in particular. 4. **Test for correctness on real-world code** diff --git a/go/CODE_OF_CONDUCT.md b/go/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..5430dd75637 --- /dev/null +++ b/go/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at opensource@github.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct/ + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq/ diff --git a/go/CONTRIBUTING.md b/go/CONTRIBUTING.md new file mode 100644 index 00000000000..1b4868b9dba --- /dev/null +++ b/go/CONTRIBUTING.md @@ -0,0 +1,66 @@ +## Contributing + +Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. + +Contributions to this project are [released](https://docs.github.com/en/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE). + +Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. + +## Building and testing + +1. Install the CodeQL CLI as described in [Getting started with the CodeQL CLI](https://codeql.github.com/docs/codeql-cli/getting-started-with-the-codeql-cli/). + +2. Ensure that `/codeql` is in your `PATH`. + +3. Clone this repository (`github/codeql`) into `/codeql-repo` and change to the directory `/codeql-repo/go`. + +4. To build, run `make`. + +5. To run the full test suite, run `make test`. This will take approximately one hour. + +6. To run all tests in a directory and its subdirectories, run `codeql test run `, for example `codeql test run ql/test/query-tests/Security`. + +7. To run an individual test, run `codeql test run `, where `` is a `.ql` or `.qlref` file, for example `codeql test run ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/MissingRegexpAnchor.qlref`. + +## Adding a new query + +If you have an idea for a query that you would like to share with other CodeQL users, please open a pull request to add it to this repository. +Follow the steps below to help other users understand what your query does, and to ensure that your query is consistent with the other CodeQL queries. + +1. **Consult the documentation for query writers** + + There is lots of useful documentation to help you write CodeQL queries, ranging from information about query file structure to language-specific tutorials. For more information on the documentation available, see [Writing QL queries](https://codeql.github.com/docs/writing-codeql-queries/) on [codeql.github.com/docs](https://codeql.github.com/docs/). + +2. **Format your code correctly** + + All of the standard CodeQL queries and libraries are uniformly formatted for clarity and consistency, so we strongly recommend that all contributions follow the same formatting guidelines. If you use the CodeQL extension for Visual Studio Code, you can auto-format your query using the [Format Document command](https://codeql.github.com/docs/codeql-for-visual-studio-code/about-codeql-for-visual-studio-code/). For more information, see the [QL style guide](https://github.com/github/codeql/blob/main/docs/ql-style-guide.md). + +3. **Make sure your query has the correct metadata** + + Query metadata is used to identify your query and make sure the query results are displayed properly. + The most important metadata to include are the `@name`, `@description`, and the `@kind`. + Other metadata properties (`@precision`, `@severity`, and `@tags`) are usually added after the query has been reviewed by the maintainers. + For more information on writing query metadata, see the [Query metadata style guide](https://github.com/github/codeql/blob/main/docs/query-metadata-style-guide.md). + +4. **Make sure the `select` statement is compatible with the query type** + + The `select` statement of your query must be compatible with the query type (determined by the `@kind` metadata property) for alert or path results to be displayed correctly in LGTM and Visual Studio Code. + For more information on `select` statement format, see [About CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/about-codeql-queries/#select-clause) on codeql.github.com. + +5. **Write a query help file** + + Query help files explain the purpose of your query to other users. Write your query help in a `.qhelp` file and save it in the same directory as your new query. + For more information on writing query help, see the [Query help style guide](https://github.com/github/codeql/blob/main/docs/query-help-style-guide.md). + +6. **Maintain backwards compatibility** + +The standard CodeQL libraries must evolve in a backwards compatible manner. If any backwards incompatible changes need to be made, the existing API must first be marked as deprecated. This is done by adding a `deprecated` annotation along with a QLDoc reference to the replacement API. Only after at least one full release cycle has elapsed may the old API be removed. + +In addition to contributions to our standard queries and libraries, we also welcome contributions of a more experimental nature, which do not need to fulfill all the requirements listed above. See the guidelines for [experimental queries and libraries](ql/docs/experimental.md) for details. + +## Resources + +- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) +- [Using Pull Requests](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) +- [GitHub Help](https://docs.github.com/en) +- [A Note About Git Commit Messages](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) diff --git a/go/LICENSE b/go/LICENSE new file mode 100644 index 00000000000..a8952d86b02 --- /dev/null +++ b/go/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019-2020 GitHub + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/go/Makefile b/go/Makefile new file mode 100644 index 00000000000..b7da089c48a --- /dev/null +++ b/go/Makefile @@ -0,0 +1,142 @@ +all: extractor ql/lib/go.dbscheme install-deps + +ifeq ($(OS),Windows_NT) +EXE = .exe +CODEQL_PLATFORM = win64 +else +EXE = +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) +CODEQL_PLATFORM = linux64 +endif +ifeq ($(UNAME_S),Darwin) +CODEQL_PLATFORM = osx64 +endif +endif + +CODEQL_TOOLS = $(addprefix codeql-tools/,autobuild.cmd autobuild.sh pre-finalize.cmd pre-finalize.sh index.cmd index.sh linux64 osx64 win64 tracing-config.lua) + +EXTRACTOR_PACK_OUT = build/codeql-extractor-go + +BINARIES = go-extractor go-tokenizer go-autobuilder go-build-runner go-bootstrap go-gen-dbscheme + +.PHONY: tools tools-codeql tools-codeql-full clean autoformat \ + tools-linux64 tools-osx64 tools-win64 check-formatting + +clean: + rm -rf tools/bin tools/linux64 tools/osx64 tools/win64 tools/net tools/opencsv + rm -rf $(EXTRACTOR_PACK_OUT) build/stats build/testdb + +DATAFLOW_BRANCH=main + +autoformat: + find ql -iregex '.*\.qll?' -print0 | xargs -0 codeql query format -qq -i + find . -path '**/vendor' -prune -or -type f -iname '*.go' ! -empty -print0 | xargs -0 grep -L "//\s*autoformat-ignore" | xargs gofmt -w + +check-formatting: + find ql -iregex '.*\.qll?' -print0 | xargs -0 codeql query format --check-only + test -z "$$(find . -path '**/vendor' -prune -or -type f -iname '*.go' ! -empty -print0 | xargs -0 grep -L "//\s*autoformat-ignore" | xargs gofmt -l)" + +install-deps: + bash scripts/install-deps.sh $(CODEQL_LOCK_MODE) + +ifeq ($(QHELP_OUT_DIR),) +# If not otherwise specified, compile qhelp to markdown in place +QHELP_OUT_DIR := ql/src +endif + +qhelp-to-markdown: + scripts/qhelp-to-markdown.sh ql/src "$(QHELP_OUT_DIR)" + +tools: $(addsuffix $(EXE),$(addprefix tools/bin/,$(BINARIES))) tools/tokenizer.jar + +.PHONY: $(addsuffix $(EXE),$(addprefix tools/bin/,$(BINARIES))) +$(addsuffix $(EXE),$(addprefix tools/bin/,$(BINARIES))): + go build -mod=vendor -o $@ ./extractor/cli/$(basename $(@F)) + +tools-codeql: tools-$(CODEQL_PLATFORM) + +tools-codeql-full: tools-linux64 tools-osx64 tools-win64 + +tools-linux64: $(addprefix tools/linux64/,$(BINARIES)) + +.PHONY: $(addprefix tools/linux64/,$(BINARIES)) +$(addprefix tools/linux64/,$(BINARIES)): + GOOS=linux GOARCH=amd64 go build -mod=vendor -o $@ ./extractor/cli/$(@F) + +tools-osx64: $(addprefix tools/osx64/,$(BINARIES)) + +.PHONY: $(addprefix tools/osx64/,$(BINARIES)) +$(addprefix tools/osx64/,$(BINARIES)): + GOOS=darwin GOARCH=amd64 go build -mod=vendor -o $@ ./extractor/cli/$(@F) + +tools-win64: $(addsuffix .exe,$(addprefix tools/win64/,$(BINARIES))) + +.PHONY: $(addsuffix .exe,$(addprefix tools/win64/,$(BINARIES))) +$(addsuffix .exe,$(addprefix tools/win64/,$(BINARIES))): + env GOOS=windows GOARCH=amd64 go build -mod=vendor -o $@ ./extractor/cli/$(basename $(@F)) + +.PHONY: extractor-common extractor extractor-full install-deps +extractor-common: codeql-extractor.yml LICENSE ql/lib/go.dbscheme \ + tools/tokenizer.jar $(CODEQL_TOOLS) + rm -rf $(EXTRACTOR_PACK_OUT) + mkdir -p $(EXTRACTOR_PACK_OUT) + cp codeql-extractor.yml LICENSE ql/lib/go.dbscheme ql/lib/go.dbscheme.stats $(EXTRACTOR_PACK_OUT) + mkdir $(EXTRACTOR_PACK_OUT)/tools + cp -r tools/tokenizer.jar $(CODEQL_TOOLS) $(EXTRACTOR_PACK_OUT)/tools + +extractor: extractor-common tools-codeql + cp -r tools/$(CODEQL_PLATFORM) $(EXTRACTOR_PACK_OUT)/tools + +extractor-full: extractor-common tools-codeql-full + cp -r $(addprefix tools/,linux64 osx64 win64) $(EXTRACTOR_PACK_OUT)/tools + +tools/tokenizer.jar: tools/net/sourceforge/pmd/cpd/GoLanguage.class + jar cf $@ -C tools net + jar uf $@ -C tools opencsv + +tools/net/sourceforge/pmd/cpd/GoLanguage.class: extractor/net/sourceforge/pmd/cpd/GoLanguage.java + javac -cp extractor -d tools $< + rm tools/net/sourceforge/pmd/cpd/AbstractLanguage.class + rm tools/net/sourceforge/pmd/cpd/SourceCode.class + rm tools/net/sourceforge/pmd/cpd/TokenEntry.class + rm tools/net/sourceforge/pmd/cpd/Tokenizer.class + +ql/lib/go.dbscheme: tools/$(CODEQL_PLATFORM)/go-gen-dbscheme$(EXE) + $< $@ + +build/stats/src.stamp: + mkdir -p $(@D)/src + git clone 'https://github.com/golang/tools' $(@D)/src + git -C $(@D)/src checkout 9b52d559c609 -q + touch $@ + +ql/lib/go.dbscheme.stats: ql/lib/go.dbscheme build/stats/src.stamp extractor + rm -rf build/stats/database + codeql database create -l go -s build/stats/src -j4 --search-path . build/stats/database + codeql dataset measure -o $@ build/stats/database/db-go + +test: all build/testdb/check-upgrade-path + codeql test run ql/test --search-path build/codeql-extractor-go --consistency-queries ql/test/consistency + # use GOOS=linux because GOOS=darwin GOARCH=386 is no longer supported + env GOOS=linux GOARCH=386 codeql$(EXE) test run ql/test/query-tests/Security/CWE-681 --search-path build/codeql-extractor-go --consistency-queries ql/test/consistency + cd extractor; go test -mod=vendor ./... | grep -vF "[no test files]" + bash extractor-smoke-test/test.sh || (echo "Extractor smoke test FAILED"; exit 1) + +.PHONY: build/testdb/check-upgrade-path +build/testdb/check-upgrade-path : build/testdb/go.dbscheme ql/lib/go.dbscheme + codeql dataset upgrade build/testdb --search-path ql/lib + diff -q build/testdb/go.dbscheme ql/lib/go.dbscheme + +.PHONY: build/testdb/go.dbscheme +build/testdb/go.dbscheme: ql/lib/upgrades/initial/go.dbscheme + rm -rf build/testdb + echo >build/empty.trap + codeql dataset import -S ql/lib/upgrades/initial/go.dbscheme build/testdb build/empty.trap + +.PHONY: sync-dataflow-libraries +sync-dataflow-libraries: + for f in DataFlowImpl.qll DataFlowImpl2.qll DataFlowImplCommon.qll DataFlowImplConsistency.qll tainttracking1/TaintTrackingImpl.qll tainttracking2/TaintTrackingImpl.qll FlowSummaryImpl.qll AccessPathSyntax.qll;\ + do\ + curl -s -o ./ql/lib/semmle/go/dataflow/internal/$$f https://raw.githubusercontent.com/github/codeql/$(DATAFLOW_BRANCH)/java/ql/lib/semmle/code/java/dataflow/internal/$$f;\ + done diff --git a/go/README.md b/go/README.md new file mode 100644 index 00000000000..6569eec3da9 --- /dev/null +++ b/go/README.md @@ -0,0 +1,54 @@ +# Go analysis support for CodeQL + +This open-source repository contains the extractor, CodeQL libraries, and queries that power Go +support in [LGTM](https://lgtm.com) and the other CodeQL products that [GitHub](https://github.com) +makes available to its customers worldwide. + +It contains two major components: + - an extractor, itself written in Go, that parses Go source code and converts it into a database + that can be queried using CodeQL. + - static analysis libraries and queries written in [CodeQL](https://codeql.github.com/docs/) that can be + used to analyze such a database to find coding mistakes or security vulnerabilities. + +The goal of this project is to provide comprehensive static analysis support for Go in CodeQL. + +For the queries and libraries that power CodeQL support for other languages, visit [the CodeQL +repository](https://github.com/github/codeql). + +## Installation + +Clone this repository. + +Run `scripts/install-deps.sh`. This will ensure that the necessary external CodeQL packs are +downloaded to your machine. You will need to re-run this script whenever you pull new commits from +the repo. + +If you want to use the CodeQL extension for Visual Studio Code, import this repository into your VS +Code workspace. + +## Usage + +To analyze a Go codebase, either use the [CodeQL command-line +interface](https://codeql.github.com/docs/codeql-cli/) to create a database yourself, or +download a pre-built database from [LGTM.com](https://lgtm.com/). You can then run any of the +queries contained in this repository either on the command line or using the VS Code extension. + +Note that the [lgtm.com](https://github.com/github/codeql/tree/lgtm.com) branch of this +repository corresponds to the version of the queries that is currently deployed on LGTM.com. +The [main](https://github.com/github/codeql/tree/main) branch may contain changes that +have not been deployed yet, so you may need to upgrade databases downloaded from LGTM.com before +running queries on them. + +## Contributions + +Contributions are welcome! Please see our [contribution guidelines](CONTRIBUTING.md) and our +[code of conduct](CODE_OF_CONDUCT.md) for details on how to participate in our community. + +## Licensing + +The code in this repository is licensed under the [MIT license](LICENSE). + +## Resources + +- [Writing CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/codeql-queries/) +- [Learning CodeQL](https://codeql.github.com/docs/writing-codeql-queries/ql-tutorials/) diff --git a/go/SECURITY.md b/go/SECURITY.md new file mode 100644 index 00000000000..58767720f29 --- /dev/null +++ b/go/SECURITY.md @@ -0,0 +1,3 @@ +If you discover a security issue in this repo, please submit it through the [GitHub Security Bug Bounty](https://hackerone.com/github). + +Thanks for helping make CodeQL safe for everyone. \ No newline at end of file diff --git a/go/alert_weighting.properties b/go/alert_weighting.properties new file mode 100644 index 00000000000..0b7b5d90ac5 --- /dev/null +++ b/go/alert_weighting.properties @@ -0,0 +1,3 @@ +precision = ("veryhigh", "high", "medium", "low") +severity = ("error", "warning", "recommendation") +security = ("true", "false") diff --git a/go/build/.gitkeep b/go/build/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/go/codeql-extractor.yml b/go/codeql-extractor.yml new file mode 100644 index 00000000000..b258b193f56 --- /dev/null +++ b/go/codeql-extractor.yml @@ -0,0 +1,14 @@ +name: "go" +display_name: "Go" +version: 0.1.0 +pull_request_triggers: + - "**/go.mod" + - "**/glide.yaml" + - "**/Gopkg.toml" +column_kind: "utf8" +file_types: + - name: go + display_name: Go + extensions: + - .go +legacy_qltest_extraction: true diff --git a/go/codeql-tools/autobuild.cmd b/go/codeql-tools/autobuild.cmd new file mode 100644 index 00000000000..aed999876e4 --- /dev/null +++ b/go/codeql-tools/autobuild.cmd @@ -0,0 +1,15 @@ +@echo off +SETLOCAL EnableDelayedExpansion + +rem Some legacy environment variables for the autobuilder. +set LGTM_SRC=%CD% + +if "%CODEQL_EXTRACTOR_GO_BUILD_TRACING%"=="on" ( + echo "Tracing enabled" + type NUL && "%CODEQL_EXTRACTOR_GO_ROOT%/tools/%CODEQL_PLATFORM%/go-build-runner.exe" +) else ( + type NUL && "%CODEQL_EXTRACTOR_GO_ROOT%/tools/%CODEQL_PLATFORM%/go-autobuilder.exe" +) +exit /b %ERRORLEVEL% + +ENDLOCAL diff --git a/go/codeql-tools/autobuild.sh b/go/codeql-tools/autobuild.sh new file mode 100755 index 00000000000..585152e676e --- /dev/null +++ b/go/codeql-tools/autobuild.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +set -eu + +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then + echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." + exit 1 +fi + +# Some legacy environment variables used by the autobuilder. +LGTM_SRC="$(pwd)" +export LGTM_SRC + +if [ "${CODEQL_EXTRACTOR_GO_BUILD_TRACING:-}" = "on" ]; then + echo "Tracing enabled" + "$CODEQL_EXTRACTOR_GO_ROOT/tools/$CODEQL_PLATFORM/go-build-runner" +else + "$CODEQL_EXTRACTOR_GO_ROOT/tools/$CODEQL_PLATFORM/go-autobuilder" +fi diff --git a/go/codeql-tools/index.cmd b/go/codeql-tools/index.cmd new file mode 100644 index 00000000000..21c8f64df92 --- /dev/null +++ b/go/codeql-tools/index.cmd @@ -0,0 +1,8 @@ +@echo off +SETLOCAL EnableDelayedExpansion + +type NUL && "%CODEQL_EXTRACTOR_GO_ROOT%/tools/%CODEQL_PLATFORM%/go-extractor.exe" -mod=vendor ./... +type NUL && "%CODEQL_EXTRACTOR_GO_ROOT%/tools/pre-finalize.cmd" +exit /b %ERRORLEVEL% + +ENDLOCAL diff --git a/go/codeql-tools/index.sh b/go/codeql-tools/index.sh new file mode 100755 index 00000000000..877400d37f2 --- /dev/null +++ b/go/codeql-tools/index.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -eu + +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then + echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." + exit 1 +fi + +"$CODEQL_EXTRACTOR_GO_ROOT/tools/$CODEQL_PLATFORM/go-extractor" -mod=vendor ./... +"$CODEQL_EXTRACTOR_GO_ROOT/tools/pre-finalize.sh" diff --git a/go/codeql-tools/linux64/compiler-tracing.spec b/go/codeql-tools/linux64/compiler-tracing.spec new file mode 100644 index 00000000000..2055555c21a --- /dev/null +++ b/go/codeql-tools/linux64/compiler-tracing.spec @@ -0,0 +1,7 @@ +**/go-autobuilder: + order compiler + trace no +**/go: + invoke ${config_dir}/go-extractor + prepend --mimic + prepend "${compiler}" diff --git a/go/codeql-tools/osx64/compiler-tracing.spec b/go/codeql-tools/osx64/compiler-tracing.spec new file mode 100644 index 00000000000..2055555c21a --- /dev/null +++ b/go/codeql-tools/osx64/compiler-tracing.spec @@ -0,0 +1,7 @@ +**/go-autobuilder: + order compiler + trace no +**/go: + invoke ${config_dir}/go-extractor + prepend --mimic + prepend "${compiler}" diff --git a/go/codeql-tools/pre-finalize.cmd b/go/codeql-tools/pre-finalize.cmd new file mode 100644 index 00000000000..4abac249933 --- /dev/null +++ b/go/codeql-tools/pre-finalize.cmd @@ -0,0 +1,19 @@ +@echo off +SETLOCAL EnableDelayedExpansion + +if NOT "%CODEQL_EXTRACTOR_GO_EXTRACT_HTML%"=="no" ( + type NUL && "%CODEQL_DIST%/codeql.exe" database index-files ^ + --working-dir=. ^ + --include-extension=.htm ^ + --include-extension=.html ^ + --include-extension=.xhtm ^ + --include-extension=.xhtml ^ + --include-extension=.vue ^ + --size-limit 10m ^ + --language html ^ + -- ^ + "%CODEQL_EXTRACTOR_GO_WIP_DATABASE%" ^ + || echo "HTML extraction failed; continuing" + + exit /b %ERRORLEVEL% +) diff --git a/go/codeql-tools/pre-finalize.sh b/go/codeql-tools/pre-finalize.sh new file mode 100755 index 00000000000..3a8b31c70a0 --- /dev/null +++ b/go/codeql-tools/pre-finalize.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +set -eu + +if [ "${CODEQL_EXTRACTOR_GO_EXTRACT_HTML:-yes}" != "no" ]; then + "$CODEQL_DIST/codeql" database index-files \ + --working-dir=. \ + --include-extension=.htm \ + --include-extension=.html \ + --include-extension=.xhtm \ + --include-extension=.xhtml \ + --include-extension=.vue \ + --size-limit 10m \ + --language html \ + -- \ + "$CODEQL_EXTRACTOR_GO_WIP_DATABASE" \ + || echo "HTML extraction failed; continuing." +fi diff --git a/go/codeql-tools/tracing-config.lua b/go/codeql-tools/tracing-config.lua new file mode 100644 index 00000000000..8554d545ce0 --- /dev/null +++ b/go/codeql-tools/tracing-config.lua @@ -0,0 +1,29 @@ +function RegisterExtractorPack() + local goExtractor = GetPlatformToolsDirectory() .. 'go-extractor' + local patterns = { + CreatePatternMatcher({'^go-autobuilder$'}, MatchCompilerName, nil, + {trace = false}), + CreatePatternMatcher({'^go$'}, MatchCompilerName, goExtractor, { + prepend = {'--mimic', '${compiler}'}, + order = ORDER_BEFORE + }) + + } + if OperatingSystem == 'windows' then + goExtractor = goExtractor .. 'go-extractor.exe' + patterns = { + CreatePatternMatcher({'^go-autobuilder%.exe$'}, MatchCompilerName, + nil, {trace = false}), + CreatePatternMatcher({'^go%.exe$'}, MatchCompilerName, goExtractor, + { + prepend = {'--mimic', '"${compiler}"'}, + order = ORDER_BEFORE + }) + } + end + return patterns +end + +-- Return a list of minimum supported versions of the configuration file format +-- return one entry per supported major version. +function GetCompatibleVersions() return {'1.0.0'} end diff --git a/go/codeql-tools/win64/compiler-tracing.spec b/go/codeql-tools/win64/compiler-tracing.spec new file mode 100644 index 00000000000..76a6b011405 --- /dev/null +++ b/go/codeql-tools/win64/compiler-tracing.spec @@ -0,0 +1,7 @@ +**/go-autobuilder.exe: + order compiler + trace no +**/go.exe: + invoke ${config_dir}/go-extractor.exe + prepend --mimic + prepend "${compiler}" diff --git a/go/docs/language/learn-ql/go/ast-class-reference.rst b/go/docs/language/learn-ql/go/ast-class-reference.rst new file mode 100644 index 00000000000..d874652a894 --- /dev/null +++ b/go/docs/language/learn-ql/go/ast-class-reference.rst @@ -0,0 +1,490 @@ +Abstract syntax tree classes for working with Go programs +========================================================= + +CodeQL has a large selection of classes for representing the abstract syntax tree of Go programs. + +.. include:: ../../reusables/abstract-syntax-tree.rst + +Statement classes +----------------- + +This table lists all subclasses of `Stmt `__. + ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Statement syntax | CodeQL class | Superclasses | Remarks | ++===================================================================================================================+===================================================================================================================+===============================================================================================================+===================================================================================================================+ +| ``;`` | EmptyStmt_ | | | +| | | | | +| | .. _EmptyStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$EmptyStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ | ExprStmt_ | | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _ExprStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ExprStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``{`` Stmt_ ``...`` ``}`` | BlockStmt_ | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``if`` Expr_ BlockStmt_ | IfStmt_ | | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _IfStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$IfStmt.html | | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``if`` Expr_ BlockStmt_ ``else`` Stmt_ | | | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``if`` Stmt_\ ``;`` Expr_ BlockStmt_ | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``for`` Expr_ BlockStmt_ | ForStmt_ | LoopStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _ForStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ForStmt.html | .. _LoopStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$LoopStmt.html | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``for`` Stmt_\ ``;`` Expr_\ ``;`` Stmt_ BlockStmt_ | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``for`` Expr_ ``...`` ``=`` ``range`` Expr_ BlockStmt_ | RangeStmt_ | LoopStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _RangeStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$RangeStmt.html | .. _LoopStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$LoopStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _BlockStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BlockStmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``switch`` Expr_ ``{`` CaseClause_ ``...`` ``}`` | ExpressionSwitchStmt_ | SwitchStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _ExpressionSwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ExpressionSwitchStmt.html | .. _SwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SwitchStmt.html | | +| .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``switch`` Stmt_\ ``;`` Expr_ ``{`` CaseClause_ ``...`` ``}`` | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``switch`` Expr_\ ``.(type)`` ``{`` CaseClause_ ``...`` ``}`` | TypeSwitchStmt_ | SwitchStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _TypeSwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$TypeSwitchStmt.html | .. _SwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SwitchStmt.html | | +| .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``switch`` SimpleAssignStmt_\ ``.(type)`` ``{`` CaseClause_ ``...`` ``}`` | | | | +| | | | | +| .. _SimpleAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SimpleAssignStmt.html | | | | +| .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``switch`` Stmt_\ ``;`` Expr_\ ``.(type)`` ``{`` CaseClause_ ``...`` ``}`` | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | +| .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``select`` ``{`` CommClause_ ``...`` ``}`` | SelectStmt_ | | | +| | | | | +| .. _CommClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CommClause.html | .. _SelectStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SelectStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``return`` | ReturnStmt_ | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``return`` Expr_ ``...`` | .. _ReturnStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ReturnStmt.html | | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``break`` | BreakStmt_ | BranchStmt_ | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``break`` LabelName_ | .. _BreakStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BreakStmt.html | .. _BranchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BranchStmt.html | | +| | | | | +| .. _LabelName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$LabelName.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``continue`` | ContinueStmt_ | BranchStmt_ | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``continue`` LabelName_ | .. _ContinueStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ContinueStmt.html | .. _BranchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BranchStmt.html | | +| | | | | +| .. _LabelName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$LabelName.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``goto`` LabelName_ | GotoStmt_ | BranchStmt_ | | +| | | | | +| .. _LabelName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$LabelName.html | .. _GotoStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$GotoStmt.html | .. _BranchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BranchStmt.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``fallthrough`` | FallthroughStmt_ | BranchStmt_ | can only occur as final non-empty child of a CaseClause_ in an ExpressionSwitchStmt_ | +| | | | | +| | .. _FallthroughStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$FallthroughStmt.html | .. _BranchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BranchStmt.html | .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | +| | | | .. _ExpressionSwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ExpressionSwitchStmt.html | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| LabelName_\ ``:`` Stmt_ | LabeledStmt_ | | | +| | | | | +| .. _LabelName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$LabelName.html | .. _LabeledStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$LabeledStmt.html | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``var`` VariableName_ TypeName_ | DeclStmt_ | | | +| | | | | +| .. _VariableName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$VariableName.html | .. _DeclStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$DeclStmt.html | | | +| .. _TypeName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeName.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``const`` VariableName_ ``=`` Expr_ | | | | +| | | | | +| .. _VariableName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$VariableName.html | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``type`` TypeName_ TypeExpr_ | | | | +| | | | | +| .. _TypeName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeName.html | | | | +| .. _TypeExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeExpr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``type`` TypeName_ ``=`` TypeExpr_ | | | | +| | | | | +| .. _TypeName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeName.html | | | | +| .. _TypeExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeExpr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``...`` ``=`` Expr_ ``...`` | AssignStmt_ | SimpleAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _AssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$AssignStmt.html | .. _SimpleAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SimpleAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| VariableName_ ``...`` ``:=`` Expr_ ``...`` | DefineStmt_ | SimpleAssignStmt_, Assignment_ | | +| | | | | +| .. _VariableName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$VariableName.html | .. _DefineStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$DefineStmt.html | .. _SimpleAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SimpleAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``+=`` Expr_ | AddAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _AddAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$AddAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``-=`` Expr_ | SubAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _SubAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SubAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``*=`` Expr_ | MulAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _MulAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$MulAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``/=`` Expr_ | QuoAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _QuoAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$QuoAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``%=`` Expr_ | RemAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _RemAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$RemAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``*=`` Expr_ | MulAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _MulAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$MulAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``&=`` Expr_ | AndAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _AndAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$AndAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``|=`` Expr_ | OrAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _OrAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$OrAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``^=`` Expr_ | XorAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _XorAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$XorAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``<<=`` Expr_ | ShlAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _ShlAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ShlAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``>>=`` Expr_ | ShrAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _ShrAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$ShrAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``&^=`` Expr_ | AndNotAssignStmt_ | CompoundAssignStmt_, Assignment_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _AndNotAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$AndNotAssignStmt.html | .. _CompoundAssignStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CompoundAssignStmt.html | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | .. _Assignment: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Assignment.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``++`` | IncStmt_ | IncDecStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _IncStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$IncStmt.html | .. _IncDecStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$IncDecStmt.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``--`` | DecStmt_ | IncDecStmt_ | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _DecStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$DecStmt.html | .. _IncDecStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$IncDecStmt.html | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``go`` CallExpr_ | GoStmt_ | | | +| | | | | +| .. _CallExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$CallExpr.html | .. _GoStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$GoStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``defer`` CallExpr_ | DeferStmt_ | | | +| | | | | +| .. _CallExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$CallExpr.html | .. _DeferStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$DeferStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``<-`` Expr_ | SendStmt_ | | | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _SendStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SendStmt.html | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``case`` Expr_ ``...``\ ``:`` Stmt_ ``...`` | CaseClause_ | | can only occur as child of a SwitchStmt_ | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _CaseClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CaseClause.html | | .. _SwitchStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SwitchStmt.html | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``case`` TypeExpr_ ``...``\ ``:`` Stmt_ ``...`` | | | | +| | | | | +| .. _TypeExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$TypeExpr.html | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``default:`` Stmt_ ``...`` | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| ``case`` SendStmt_\ ``:`` Stmt_ ``...`` | CommClause_ | | can only occur as child of a SelectStmt_ | +| | | | | +| .. _SendStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SendStmt.html | .. _CommClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CommClause.html | | .. _SelectStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$SelectStmt.html | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``case`` RecvStmt_\ ``:`` Stmt_ ``...`` | | | | +| | | | | +| .. _RecvStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$RecvStmt.html | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| ``default:`` Stmt_ ``...`` | | | | +| | | | | +| .. _Stmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$Stmt.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| Expr_ ``...`` ``=`` RecvExpr_ | RecvStmt_ | | can only occur as child of a CommClause_ | +| | | | | +| .. _Expr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$Expr.html | .. _RecvStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$RecvStmt.html | | .. _CommClause: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$CommClause.html | +| .. _RecvExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$RecvExpr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+ | | | +| VariableName_ ``...`` ``:=`` RecvExpr_ | | | | +| | | | | +| .. _VariableName: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$VariableName.html | | | | +| .. _RecvExpr: https://help.semmle.com/qldoc/go/semmle/go/Expr.qll/type.Expr$RecvExpr.html | | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ +| (anything unparseable) | BadStmt_ | | | +| | | | | +| | .. _BadStmt: https://help.semmle.com/qldoc/go/semmle/go/Stmt.qll/type.Stmt$BadStmt.html | | | ++-------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+ + +Expression classes +------------------ + +There are many expression classes, so we present them by category. +All classes in this section are subclasses of +`Expr `__. + +Literals +~~~~~~~~ + +All classes in this subsection are subclasses of +`Literal `__. + ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Expression syntax example | CodeQL class | Superclass | ++=========================================+==============================================================================================+==============================================================================================================================================================================================================+ +| ``23`` | `IntLit `__ | `BasicLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``4.2`` | `FloatLit `__ | `BasicLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``4.2 + 2.7i`` | `ImagLit `__ | `BasicLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``'a'`` | `CharLit `__ | `BasicLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``"Hello"`` | `StringLit `__ | `BasicLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``func(x, y int) int { return x + y }`` | `FuncLit `__ | `FuncDef `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``[6]int{1, 2, 3, 5}`` | `ArrayLit `__ | `ArrayOrSliceLit `__, `CompositeLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``[]int{1, 2, 3, 5}`` | `SliceLit `__ | `ArrayOrSliceLit `__, `CompositeLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``map[string]int{"A": 1, "B": 2}`` | `MapLit `__ | `CompositeLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``Point3D{0.5, -0.5, 0.5}`` | `StructLit `__ | `CompositeLit `__ | ++-----------------------------------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Unary expressions +~~~~~~~~~~~~~~~~~ + +All classes in this subsection are subclasses of +`UnaryExpr `__. + ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| Expression syntax | CodeQL class | Superclasses | ++============================================================================================+========================================================================================================+==================================================================================================================+ +| ``+``\ `Expr `__ | `PlusExpr `__ | `ArithmeticUnaryExpr `__ | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| ``-``\ `Expr `__ | `MinusExpr `__ | `ArithmeticUnaryExpr `__ | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| ``!``\ `Expr `__ | `NotExpr `__ | `LogicalUnaryExpr `__ | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| ``^``\ `Expr `__ | `ComplementExpr `__ | `BitwiseUnaryExpr `__ | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| ``&``\ `Expr `__ | `AddressExpr `__ | | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ +| ``<-``\ `Expr `__ | `RecvExpr `__ | | ++--------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------+ + +Binary expressions +~~~~~~~~~~~~~~~~~~ + +All classes in this subsection are subclasses of +`BinaryExpr `__. + ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| Expression syntax | CodeQL class | Superclasses | ++==============================================================================================================================================================================+================================================================================================+============================================================================================================================+ +| `Expr `__ ``*`` `Expr `__ | `MulExpr `__ | `ArithmeticBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``/`` `Expr `__ | `QuoExpr `__ | `ArithmeticBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``%`` `Expr `__ | `RemExpr `__ | `ArithmeticBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``+`` `Expr `__ | `AddExpr `__ | `ArithmeticBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``-`` `Expr `__ | `SubExpr `__ | `ArithmeticBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``<<`` `Expr `__ | `ShlExpr `__ | `ShiftExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``>>`` `Expr `__ | `ShrExpr `__ | `ShiftExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``&&`` `Expr `__ | `LandExpr `__ | `LogicalBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``||`` `Expr `__ | `LorExpr `__ | `LogicalBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``<`` `Expr `__ | `LssExpr `__ | `RelationalComparisonExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``>`` `Expr `__ | `GtrExpr `__ | `RelationalComparisonExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``<=`` `Expr `__ | `LeqExpr `__ | `RelationalComparisonExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``>=`` `Expr `__ | `GeqExpr `__ | `RelationalComparisonExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``==`` `Expr `__ | `EqlExpr `__ | `EqualityTestExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``!=`` `Expr `__ | `NeqExpr `__ | `EqualityTestExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``&`` `Expr `__ | `AndExpr `__ | `BitwiseBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``|`` `Expr `__ | `OrExpr `__ | `BitwiseBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``^`` `Expr `__ | `XorExpr `__ | `BitwiseBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__ ``&^`` `Expr `__ | `AndNotExpr `__ | `BitwiseBinaryExpr `__ | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+ + +Type expressions +~~~~~~~~~~~~~~~~ + +All classes in this subsection are subclasses of +`TypeExpr `__. + ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| Expression syntax | CodeQL class | Superclasses | ++=========================================================================================================================================================================================================+====================================================================================================================+====================================================================================================+ +| ``[``\ `Expr `__\ ``]`` `TypeExpr `__ | `ArrayTypeExpr `__ | | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``struct { ... }`` | `StructTypeExpr `__ | | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``func`` `FunctionName `__\ ``(...) (...)`` | `FuncTypeExpr `__ | | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``interface { ... }`` | `InterfaceTypeExpr `__ | | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``map[``\ `TypeExpr `__\ ``]``\ `TypeExpr `__ | `MapTypeExpr `__ | | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``chan<-`` `TypeExpr `__ | `SendChanTypeExpr `__ | `ChanTypeExpr `__ | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``<-chan`` `TypeExpr `__ | `RecvChanTypeExpr `__ | `ChanTypeExpr `__ | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| ``chan`` `TypeExpr `__ | `SendRecvChanTypeExpr `__ | `ChanTypeExpr `__ | ++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ + +Name expressions +~~~~~~~~~~~~~~~~ + +All classes in this subsection are subclasses of +`Name `__. + +The following classes relate to the structure of the name. + ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| Expression syntax | CodeQL class | Superclasses | ++===================================================================================================================================================================================+======================================================================================================+====================================================================================================+ +| `Ident `__ | `SimpleName `__ | `Ident `__ | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| `Ident `__\ ``.``\ `Ident `__ | `QualifiedName `__ | `SelectorExpr `__ | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ + +The following classes relate to what sort of entity the name refers to. + + +- `PackageName `__ +- `TypeName `__ +- `LabelName `__ +- `ValueName `__ + + - `ConstantName `__ + - `VariableName `__ + - `FunctionName `__ + +Miscellaneous +~~~~~~~~~~~~~ + ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Expression syntax | CodeQL class | Superclasses | Remarks | ++============================================================================================================================================================================================================================================================================================================================================================================+========================================================================================================+====================================================================================================================+==========================================================================================================================================================================================================================+ +| ``foo`` | `Ident `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``_`` | `BlankIdent `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``...`` | `Ellipsis `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``(``\ `Expr `__\ ``)`` | `ParenExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Ident `__\ ``.``\ `Ident `__ | `SelectorExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__\ ``[``\ `Expr `__\ ``]`` | `IndexExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__\ ``[``\ `Expr `__\ ``:``\ `Expr `__\ ``:``\ `Expr `__\ ``]`` | `SliceExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__\ ``.(``\ `TypeExpr `__\ ``)`` | `TypeAssertExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ``*``\ `Expr `__ | `StarExpr `__ | | can be a `ValueExpr `__ or `TypeExpr `__ depending on context | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__\ ``:`` `Expr `__ | `KeyValueExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `TypeExpr `__\ ``(``\ `Expr `__\ ``)`` | `ConversionExpr `__ | `CallOrConversionExpr `__ | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `Expr `__\ ``(...)`` | `CallExpr `__ | `CallOrConversionExpr `__ | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| (anything unparseable) | `BadExpr `__ | | | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +The following classes organize expressions by the kind of entity they refer to. + ++------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| CodeQL class | Explanation | ++======================================================================================================+=========================================================================================================================================================================================================================================================+ +| `TypeExpr `__ | an expression that denotes a type | ++------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `ReferenceExpr `__ | an expression that refers to a variable, a constant, a function, a field, or an element of an array or a slice | ++------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `ValueExpr `__ | an expression that can be evaluated to a value (as opposed to expressions that refer to a package, a type, or a statement label). This generalizes `ReferenceExpr `__ | ++------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Further reading +--------------- + +.. include:: ../../reusables/go-further-reading.rst +.. include:: ../../reusables/codeql-ref-tools-further-reading.rst \ No newline at end of file diff --git a/go/docs/language/learn-ql/go/library-modeling-go.rst b/go/docs/language/learn-ql/go/library-modeling-go.rst new file mode 100644 index 00000000000..ef7f50bf7cb --- /dev/null +++ b/go/docs/language/learn-ql/go/library-modeling-go.rst @@ -0,0 +1,122 @@ +Modeling data flow in Go libraries +================================== + +When analyzing a Go program, CodeQL does not examine the source code for +external packages. To track the flow of untrusted data through a library, you +can create a model of the library. + +You can find existing models in the ``go/ql/lib/semmle/go/frameworks/`` folder of the +`CodeQL repository `__. +To add a new model, you should make a new file in that folder, named after the library. + +Sources +------- + +To mark a source of data that is controlled by an untrusted user, we +create a class extending ``UntrustedFlowSource::Range``. Inheritance and +the characteristic predicate of the class should be used to specify +exactly the dataflow node that introduces the data. Here is a short +example from ``Mux.qll``. + +.. code-block:: ql + + class RequestVars extends DataFlow::UntrustedFlowSource::Range, DataFlow::CallNode { + RequestVars() { this.getTarget().hasQualifiedName("github.com/gorilla/mux", "Vars") } + } + +This has the effect that all calls to `the function Vars from the +package mux `__ are +treated as sources of untrusted data. + +Flow propagation +---------------- + +By default, we assume that all functions in libraries do not have +any data flow. To indicate that a particular function does have data flow, +create a class extending ``TaintTracking::FunctionModel`` (or +``DataFlow::FunctionModel`` if the untrusted user data is passed on +without being modified). + +Inheritance and the characteristic predicate of the class should specify +the function. The class should also have a member predicate with the signature +``override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp)`` +(or +``override predicate hasDataFlow(FunctionInput inp, FunctionOutput outp)`` +if extending ``DataFlow::FunctionModel``). The body should constrain +``inp`` and ``outp``. + +``FunctionInput`` is an abstract representation of the inputs to a +function. The options are: + +* the receiver (``inp.isReceiver()``) +* one of the parameters (``inp.isParameter(i)``) +* one of the results (``inp.isResult(i)``, or ``inp.isResult`` if there is only one result) + +Note that it may seem strange that the result of a function could be +considered as a function input, but it is needed in some cases. For +instance, the function ``bufio.NewWriter`` returns a writer ``bw`` that +buffers write operations to an underlying writer ``w``. If tainted data +is written to ``bw``, then it makes sense to propagate that taint back +to the underlying writer ``w``, which can be modeled by saying that +``bufio.NewWriter`` propagates taint from its result to its first +argument. + +Similarly, ``FunctionOutput`` is an abstract representation of the +outputs to a function. The options are: + +* the receiver (``outp.isReceiver()``) +* one of the parameters (``outp.isParameter(i)``) +* one of the results (``outp.isResult(i)``, or ``outp.isResult`` if there is only one result) + +Here is an example from ``Gin.qll``, which has been slightly simplified. + +.. code-block:: ql + + private class ParamsGet extends TaintTracking::FunctionModel, Method { + ParamsGet() { this.hasQualifiedName("github.com/gin-gonic/gin", "Params", "Get") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult(0) + } + } + +This has the effect that calls to the ``Get`` method with receiver type +``Params`` from the ``gin-gonic/gin`` package allow taint to flow from +the receiver to the first result. In other words, if ``p`` has type +``Params`` and taint can flow to it, then after the line +``x := p.Get("foo")`` taint can also flow to ``x``. + +Sanitizers +---------- + +It is not necessary to indicate that library functions are sanitizers. +Their bodies are not analyzed, so it is assumed that data does not +flow through them. + +Sinks +----- + +Data-flow sinks are specified by queries rather than by library models. +However, you can use library models to indicate when functions belong to +special categories. Queries can then use these categories when specifying +sinks. Classes representing these special categories are contained in +``go/ql/lib/semmle/go/Concepts.qll`` in the `CodeQL for Go repository +`__. +``Concepts.qll`` includes classes for logger mechanisms, +HTTP response writers, HTTP redirects, and marshaling and unmarshaling +functions. + +Here is a short example from ``Stdlib.qll``, which has been slightly simplified. + +.. code-block:: ql + + private class PrintfCall extends LoggerCall::Range, DataFlow::CallNode { + PrintfCall() { this.getTarget().hasQualifiedName("fmt", ["Print", "Printf", "Println"]) } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + +This has the effect that any call to ``Print``, ``Printf``, or +``Println`` in the package ``fmt`` is recognized as a logger call. +Any query that uses logger calls as a sink will then identify when tainted data +has been passed as an argument to ``Print``, ``Printf``, or ``Println``. \ No newline at end of file diff --git a/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/exprs.ql b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/exprs.ql new file mode 100644 index 00000000000..b4b7498e27c --- /dev/null +++ b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/exprs.ql @@ -0,0 +1,41 @@ +class Expr_ extends @expr { + string toString() { result = "Expr" } +} + +class ExprParent_ extends @exprparent { + string toString() { result = "ExprParent" } +} + +/** + * Two new kinds have been inserted such that `@sliceexpr` which used to have + * index 13 now has index 15. Another new kind has been inserted such that + * `@plusexpr` which used to have index 23 now has index 26. Entries with + * indices lower than 13 are unchanged. + */ +bindingset[new_index] +int old_index(int new_index) { + if new_index < 13 + then result = new_index + else + if new_index = [13, 14] + then result = 0 // badexpr + else + if new_index < 23 + then result + (15 - 13) = new_index + else + if new_index = 23 + then result = 0 // badexpr + else result + (26 - 23) = new_index +} + +// The schema for exprs is: +// +// exprs(unique int id: @expr, +// int kind: int ref, +// int parent: @exprparent ref, +// int idx: int ref); +from Expr_ expr, int new_kind, ExprParent_ parent, int idx, int old_kind +where + exprs(expr, new_kind, parent, idx) and + old_kind = old_index(new_kind) +select expr, old_kind, parent, idx diff --git a/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/go.dbscheme b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/go.dbscheme new file mode 100644 index 00000000000..8f168c8af3f --- /dev/null +++ b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/go.dbscheme @@ -0,0 +1,531 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * 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; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +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); + +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); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @scopenode + | @comment_group | @comment; + +@documentable = @file | @field | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @sliceexpr +| 14 = @typeassertexpr +| 15 = @callorconversionexpr +| 16 = @starexpr +| 17 = @keyvalueexpr +| 18 = @arraytypeexpr +| 19 = @structtypeexpr +| 20 = @functypeexpr +| 21 = @interfacetypeexpr +| 22 = @maptypeexpr +| 23 = @plusexpr +| 24 = @minusexpr +| 25 = @notexpr +| 26 = @complementexpr +| 27 = @derefexpr +| 28 = @addressexpr +| 29 = @arrowexpr +| 30 = @lorexpr +| 31 = @landexpr +| 32 = @eqlexpr +| 33 = @neqexpr +| 34 = @lssexpr +| 35 = @leqexpr +| 36 = @gtrexpr +| 37 = @geqexpr +| 38 = @addexpr +| 39 = @subexpr +| 40 = @orexpr +| 41 = @xorexpr +| 42 = @mulexpr +| 43 = @quoexpr +| 44 = @remexpr +| 45 = @shlexpr +| 46 = @shrexpr +| 47 = @andexpr +| 48 = @andnotexpr +| 49 = @sendchantypeexpr +| 50 = @recvchantypeexpr +| 51 = @sendrcvchantypeexpr +| 52 = @errorexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @arraytype +| 27 = @slicetype +| 28 = @structtype +| 29 = @pointertype +| 30 = @interfacetype +| 31 = @tupletype +| 32 = @signaturetype +| 33 = @maptype +| 34 = @sendchantype +| 35 = @recvchantype +| 36 = @sendrcvchantype +| 37 = @namedtype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @containertype | @structtype | @pointertype | @interfacetype | @tupletype | @signaturetype | @namedtype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/old.dbscheme b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/old.dbscheme new file mode 100644 index 00000000000..90fa7836e0a --- /dev/null +++ b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/old.dbscheme @@ -0,0 +1,547 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * 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; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +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); + +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); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @errorexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @namedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @namedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/types.ql b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/types.ql new file mode 100644 index 00000000000..0b02cc68085 --- /dev/null +++ b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/types.ql @@ -0,0 +1,31 @@ +class Type_ extends @type { + string toString() { result = "Type" } +} + +/** + * A new kind has been inserted such that `@arraytype` which used to have index + * 26 now has index 27. Another new kind has been inserted at 39, which is the + * end of the list. Entries with lower indices are unchanged. + */ +bindingset[new_index] +int old_index(int new_index) { + if new_index < 26 + then result = new_index + else + if new_index = 26 + then result = 0 // invalidtype + else + if new_index < 39 + then result + (27 - 26) = new_index + else result = 0 // invalidtype +} + +// The schema for types is: +// +// types(unique int id: @type, +// int kind: int ref); +from Type_ type, int new_kind, int old_kind +where + types(type, new_kind) and + old_kind = old_index(new_kind) +select type, old_kind diff --git a/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/upgrade.properties b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/upgrade.properties new file mode 100644 index 00000000000..a233cc281c8 --- /dev/null +++ b/go/downgrades/90fa7836e0a239f69bbebffcf342e92c240d54bc/upgrade.properties @@ -0,0 +1,6 @@ +description: Add generic instantiation expressions and type parameter types +compatibility: full +exprs.rel: run exprs.qlo +types.rel: run types.qlo +typeparamdecls.rel: delete +typeparam.rel: delete \ No newline at end of file diff --git a/go/downgrades/initial/go.dbscheme b/go/downgrades/initial/go.dbscheme new file mode 100644 index 00000000000..8f168c8af3f --- /dev/null +++ b/go/downgrades/initial/go.dbscheme @@ -0,0 +1,531 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * 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; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +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); + +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); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @scopenode + | @comment_group | @comment; + +@documentable = @file | @field | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @sliceexpr +| 14 = @typeassertexpr +| 15 = @callorconversionexpr +| 16 = @starexpr +| 17 = @keyvalueexpr +| 18 = @arraytypeexpr +| 19 = @structtypeexpr +| 20 = @functypeexpr +| 21 = @interfacetypeexpr +| 22 = @maptypeexpr +| 23 = @plusexpr +| 24 = @minusexpr +| 25 = @notexpr +| 26 = @complementexpr +| 27 = @derefexpr +| 28 = @addressexpr +| 29 = @arrowexpr +| 30 = @lorexpr +| 31 = @landexpr +| 32 = @eqlexpr +| 33 = @neqexpr +| 34 = @lssexpr +| 35 = @leqexpr +| 36 = @gtrexpr +| 37 = @geqexpr +| 38 = @addexpr +| 39 = @subexpr +| 40 = @orexpr +| 41 = @xorexpr +| 42 = @mulexpr +| 43 = @quoexpr +| 44 = @remexpr +| 45 = @shlexpr +| 46 = @shrexpr +| 47 = @andexpr +| 48 = @andnotexpr +| 49 = @sendchantypeexpr +| 50 = @recvchantypeexpr +| 51 = @sendrcvchantypeexpr +| 52 = @errorexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @arraytype +| 27 = @slicetype +| 28 = @structtype +| 29 = @pointertype +| 30 = @interfacetype +| 31 = @tupletype +| 32 = @signaturetype +| 33 = @maptype +| 34 = @sendchantype +| 35 = @recvchantype +| 36 = @sendrcvchantype +| 37 = @namedtype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @containertype | @structtype | @pointertype | @interfacetype | @tupletype | @signaturetype | @namedtype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/qlpack.yml b/go/downgrades/qlpack.yml new file mode 100644 index 00000000000..d3e056bea64 --- /dev/null +++ b/go/downgrades/qlpack.yml @@ -0,0 +1,4 @@ +name: codeql/go-downgrades +groups: go +downgrades: . +library: true diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/code-scanning-selectors.yml b/go/external-packs/codeql/suite-helpers/0.0.2/code-scanning-selectors.yml new file mode 100644 index 00000000000..116d7288ddf --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/code-scanning-selectors.yml @@ -0,0 +1,27 @@ +- description: Selectors for selecting the Code-Scanning-relevant queries for a language +- include: + kind: + - problem + - path-problem + - alert + - path-alert + precision: + - high + - very-high + problem.severity: + - error + - warning + tags contain: + - security +- include: + kind: + - diagnostic +- include: + kind: + - metric + tags contain: + - summary +- exclude: + deprecated: // +- exclude: + query path: /^experimental\/.*/ diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-displayed-only.yml b/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-displayed-only.yml new file mode 100644 index 00000000000..1b7237495e2 --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-displayed-only.yml @@ -0,0 +1,12 @@ +- description: Selectors for excluding queries that LGTM doesn't display by default +- exclude: + kind: + - problem + - path-problem + precision: medium +- exclude: + kind: + - problem + - path-problem + precision: high + problem.severity: recommendation diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-selectors.yml b/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-selectors.yml new file mode 100644 index 00000000000..c83484cb1a4 --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/lgtm-selectors.yml @@ -0,0 +1,25 @@ +- description: Selectors for selecting the LGTM-relevant queries for a language +- include: + kind: + - problem + - path-problem + precision: + - high + - very-high +- include: + kind: + - problem + - path-problem + precision: medium + problem.severity: + - error + - warning +- include: + kind: + - definitions + - alert-suppression + - file-classifier +- exclude: + deprecated: // +- exclude: + query path: /^experimental\/.*/ diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/qlpack.yml b/go/external-packs/codeql/suite-helpers/0.0.2/qlpack.yml new file mode 100644 index 00000000000..ca0a6732f5a --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/qlpack.yml @@ -0,0 +1,3 @@ +name: codeql/suite-helpers +version: 0.0.2 +library: true diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/security-and-quality-selectors.yml b/go/external-packs/codeql/suite-helpers/0.0.2/security-and-quality-selectors.yml new file mode 100644 index 00000000000..61466f53886 --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/security-and-quality-selectors.yml @@ -0,0 +1,29 @@ +- description: Selectors for selecting the security-and-quality queries for a language +- include: + kind: + - problem + - path-problem + precision: + - high + - very-high +- include: + kind: + - problem + - path-problem + precision: medium + problem.severity: + - error + - warning +- include: + kind: + - diagnostic +- include: + kind: + - metric + tags contain: + - summary +- exclude: + deprecated: // +- exclude: + query path: /^experimental\/.*/ + diff --git a/go/external-packs/codeql/suite-helpers/0.0.2/security-extended-selectors.yml b/go/external-packs/codeql/suite-helpers/0.0.2/security-extended-selectors.yml new file mode 100644 index 00000000000..c3a82de14f2 --- /dev/null +++ b/go/external-packs/codeql/suite-helpers/0.0.2/security-extended-selectors.yml @@ -0,0 +1,34 @@ +- description: Selectors for selecting the security-extended queries for a language +- include: + kind: + - problem + - path-problem + precision: + - high + - very-high + tags contain: + - security +- include: + kind: + - problem + - path-problem + precision: + - medium + problem.severity: + - error + - warning + tags contain: + - security +- include: + kind: + - diagnostic +- include: + kind: + - metric + tags contain: + - summary +- exclude: + deprecated: // +- exclude: + query path: /^experimental\/.*/ + diff --git a/go/extractor-smoke-test/.gitignore b/go/extractor-smoke-test/.gitignore new file mode 100644 index 00000000000..e32b11d7ee1 --- /dev/null +++ b/go/extractor-smoke-test/.gitignore @@ -0,0 +1,4 @@ +*.bqrs +tracing-out.csv +notracing-out.csv +testdb diff --git a/go/extractor-smoke-test/expected.csv b/go/extractor-smoke-test/expected.csv new file mode 100644 index 00000000000..cb0eb08f8f4 --- /dev/null +++ b/go/extractor-smoke-test/expected.csv @@ -0,0 +1,12 @@ +"1","assignment to i" +"assignment to i","selection of Println" +"call to Println","exit" +"entry","skip" +"entry","skip" +"function declaration","exit" +"i","call to Println" +"nd","col1" +"selection of Println","i" +"skip","1" +"skip","function declaration" +"skip","skip" diff --git a/go/extractor-smoke-test/go.mod b/go/extractor-smoke-test/go.mod new file mode 100644 index 00000000000..0659b4eaec8 --- /dev/null +++ b/go/extractor-smoke-test/go.mod @@ -0,0 +1,3 @@ +module github.com/codeql-go-extractor-smoke-test + +go 1.14 diff --git a/go/extractor-smoke-test/main.go b/go/extractor-smoke-test/main.go new file mode 100644 index 00000000000..2f7b1325daa --- /dev/null +++ b/go/extractor-smoke-test/main.go @@ -0,0 +1,8 @@ +package main + +import "fmt" + +func main() { + var i int = 1 + fmt.Println(i) +} diff --git a/go/extractor-smoke-test/test.sh b/go/extractor-smoke-test/test.sh new file mode 100755 index 00000000000..46a7f8a5956 --- /dev/null +++ b/go/extractor-smoke-test/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +cd $DIR + +rm -rf testdb + +codeql database create --language=go testdb --search-path ../build/codeql-extractor-go +codeql dataset check testdb/db-go +codeql query run ../ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.ql --database=testdb --output=notracing-out.bqrs --search-path .. +codeql bqrs decode notracing-out.bqrs --format=csv --output=notracing-out.csv +diff -w -u <(sort notracing-out.csv) expected.csv + +# Now do it again with tracing enabled + +export CODEQL_EXTRACTOR_GO_BUILD_TRACING=on + +rm -rf testdb + +codeql database create --language=go testdb --search-path ../build/codeql-extractor-go +codeql dataset check testdb/db-go +codeql query run ../ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.ql --database=testdb --output=tracing-out.bqrs --search-path .. +codeql bqrs decode tracing-out.bqrs --format=csv --output=tracing-out.csv +diff -w -u <(sort tracing-out.csv) expected.csv diff --git a/go/extractor/autobuilder/autobuilder.go b/go/extractor/autobuilder/autobuilder.go new file mode 100644 index 00000000000..11c49735eaa --- /dev/null +++ b/go/extractor/autobuilder/autobuilder.go @@ -0,0 +1,81 @@ +// Package autobuilder implements a simple system that attempts to run build commands for common +// build frameworks, if the relevant files exist. +package autobuilder + +import ( + "log" + "os" + "os/exec" + + "github.com/github/codeql-go/extractor/util" +) + +// CheckExtracted sets whether the autobuilder should check whether source files have been extracted +// to the CodeQL source directory as well as whether the build command executed successfully. +var CheckExtracted = false + +// checkEmpty checks whether a directory either doesn't exist or is empty. +func checkEmpty(dir string) (bool, error) { + if !util.DirExists(dir) { + return true, nil + } + + d, err := os.Open(dir) + if err != nil { + return false, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return false, err + } + return len(names) == 0, nil +} + +// checkExtractorRun checks whether the CodeQL Go extractor has run, by checking if the source +// archive directory is empty or not. +func checkExtractorRun() bool { + srcDir := os.Getenv("CODEQL_EXTRACTOR_GO_SOURCE_ARCHIVE_DIR") + if srcDir != "" { + empty, err := checkEmpty(srcDir) + if err != nil { + log.Fatalf("Unable to read source archive directory %s.", srcDir) + } + if empty { + log.Printf("No Go code seen; continuing to try other builds.") + return false + } + return true + } else { + log.Fatalf("No source directory set.\nThis binary should not be run manually; instead, use the CodeQL CLI or VSCode extension. See https://securitylab.github.com/tools/codeql.") + return false + } +} + +// tryBuildIfExists tries to run the command `cmd args...` if the file `buildFile` exists and is not +// a directory. Returns true if the command was successful and false if not. +func tryBuildIfExists(buildFile, cmd string, args ...string) bool { + if util.FileExists(buildFile) { + log.Printf("%s found.\n", buildFile) + return tryBuild(cmd, args...) + } + return false +} + +// tryBuild tries to run `cmd args...`, returning true if successful and false if not. +func tryBuild(cmd string, args ...string) bool { + log.Printf("Trying build command %s %v", cmd, args) + res := util.RunCmd(exec.Command(cmd, args...)) + return res && (!CheckExtracted || checkExtractorRun()) +} + +// Autobuild attempts to detect build system and run the corresponding command. +func Autobuild() bool { + return tryBuildIfExists("Makefile", "make") || + tryBuildIfExists("makefile", "make") || + tryBuildIfExists("GNUmakefile", "make") || + tryBuildIfExists("build.ninja", "ninja") || + tryBuildIfExists("build", "./build") || + tryBuildIfExists("build.sh", "./build.sh") +} diff --git a/go/extractor/cli/go-autobuilder/go-autobuilder.go b/go/extractor/cli/go-autobuilder/go-autobuilder.go new file mode 100644 index 00000000000..07b8a6cb478 --- /dev/null +++ b/go/extractor/cli/go-autobuilder/go-autobuilder.go @@ -0,0 +1,588 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/url" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strings" + + "golang.org/x/mod/semver" + + "github.com/github/codeql-go/extractor/autobuilder" + "github.com/github/codeql-go/extractor/util" +) + +func usage() { + fmt.Fprintf(os.Stderr, + `%s is a wrapper script that installs dependencies and calls the extractor. + +When LGTM_SRC is not set, the script installs dependencies as described below, and then invokes the +extractor in the working directory. + +If LGTM_SRC is set, it checks for the presence of the files 'go.mod', 'Gopkg.toml', and +'glide.yaml' to determine how to install dependencies: if a 'Gopkg.toml' file is present, it uses +'dep ensure', if there is a 'glide.yaml' it uses 'glide install', and otherwise 'go get'. +Additionally, unless a 'go.mod' file is detected, it sets up a temporary GOPATH and moves all +source files into a folder corresponding to the package's import path before installing +dependencies. + +This behavior can be further customized using environment variables: setting LGTM_INDEX_NEED_GOPATH +to 'false' disables the GOPATH set-up, CODEQL_EXTRACTOR_GO_BUILD_COMMAND (or alternatively +LGTM_INDEX_BUILD_COMMAND), can be set to a newline-separated list of commands to run in order to +install dependencies, and LGTM_INDEX_IMPORT_PATH can be used to override the package import path, +which is otherwise inferred from the SEMMLE_REPO_URL or GITHUB_REPOSITORY environment variables. + +In resource-constrained environments, the environment variable CODEQL_EXTRACTOR_GO_MAX_GOROUTINES +(or its legacy alias SEMMLE_MAX_GOROUTINES) can be used to limit the number of parallel goroutines +started by the extractor, which reduces CPU and memory requirements. The default value for this +variable is 32. +`, + os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage:\n\n %s\n", os.Args[0]) +} + +var goVersion = "" + +// Returns the current Go version as returned by 'go version', e.g. go1.14.4 +func getEnvGoVersion() string { + if goVersion == "" { + gover, err := exec.Command("go", "version").CombinedOutput() + if err != nil { + log.Fatalf("Unable to run the go command, is it installed?\nError: %s", err.Error()) + } + goVersion = strings.Fields(string(gover))[2] + } + return goVersion +} + +// Returns the current Go version in semver format, e.g. v1.14.4 +func getEnvGoSemVer() string { + goVersion := getEnvGoVersion() + if !strings.HasPrefix(goVersion, "go") { + log.Fatalf("Expected 'go version' output of the form 'go1.2.3'; got '%s'", goVersion) + } + return "v" + goVersion[2:] +} + +func tryBuild(buildFile, cmd string, args ...string) bool { + if util.FileExists(buildFile) { + log.Printf("%s found, running %s\n", buildFile, cmd) + return util.RunCmd(exec.Command(cmd, args...)) + } + return false +} + +func getImportPath() (importpath string) { + importpath = os.Getenv("LGTM_INDEX_IMPORT_PATH") + if importpath == "" { + repourl := os.Getenv("SEMMLE_REPO_URL") + if repourl == "" { + githubrepo := os.Getenv("GITHUB_REPOSITORY") + if githubrepo == "" { + log.Printf("Unable to determine import path, as neither LGTM_INDEX_IMPORT_PATH nor GITHUB_REPOSITORY is set\n") + return "" + } else { + importpath = "github.com/" + githubrepo + } + } else { + importpath = getImportPathFromRepoURL(repourl) + if importpath == "" { + log.Printf("Failed to determine import path from SEMMLE_REPO_URL '%s'\n", repourl) + return + } + } + } + log.Printf("Import path is '%s'\n", importpath) + return +} + +func getImportPathFromRepoURL(repourl string) string { + // check for scp-like URL as in "git@github.com:github/codeql-go.git" + shorturl := regexp.MustCompile("^([^@]+@)?([^:]+):([^/].*?)(\\.git)?$") + m := shorturl.FindStringSubmatch(repourl) + if m != nil { + return m[2] + "/" + m[3] + } + + // otherwise parse as proper URL + u, err := url.Parse(repourl) + if err != nil { + log.Fatalf("Malformed repository URL '%s'\n", repourl) + } + + if u.Scheme == "file" { + // we can't determine import paths from file paths + return "" + } + + if u.Hostname() == "" || u.Path == "" { + return "" + } + + host := u.Hostname() + path := u.Path + // strip off leading slashes and trailing `.git` if present + path = regexp.MustCompile("^/+|\\.git$").ReplaceAllString(path, "") + return host + "/" + path +} + +func restoreRepoLayout(fromDir string, dirEntries []string, scratchDirName string, toDir string) { + for _, dirEntry := range dirEntries { + if dirEntry != scratchDirName { + log.Printf("Restoring %s/%s to %s/%s.\n", fromDir, dirEntry, toDir, dirEntry) + err := os.Rename(filepath.Join(fromDir, dirEntry), filepath.Join(toDir, dirEntry)) + if err != nil { + log.Printf("Failed to move file/directory %s from directory %s to directory %s: %s\n", dirEntry, fromDir, toDir, err.Error()) + } + } + } +} + +// DependencyInstallerMode is an enum describing how dependencies should be installed +type DependencyInstallerMode int + +const ( + // GoGetNoModules represents dependency installation using `go get` without modules + GoGetNoModules DependencyInstallerMode = iota + // GoGetWithModules represents dependency installation using `go get` with modules + GoGetWithModules + // Dep represent dependency installation using `dep ensure` + Dep + // Glide represents dependency installation using `glide install` + Glide +) + +// ModMode corresponds to the possible values of the -mod flag for the Go compiler +type ModMode int + +const ( + ModUnset ModMode = iota + ModReadonly + ModMod + ModVendor +) + +func (m ModMode) argsForGoVersion(version string) []string { + switch m { + case ModUnset: + return []string{} + case ModReadonly: + return []string{"-mod=readonly"} + case ModMod: + if !semver.IsValid(version) { + log.Fatalf("Invalid Go semver: '%s'", version) + } + if semver.Compare(version, "v1.14") < 0 { + return []string{} // -mod=mod is the default behaviour for go <= 1.13, and is not accepted as an argument + } else { + return []string{"-mod=mod"} + } + case ModVendor: + return []string{"-mod=vendor"} + } + return nil +} + +// addVersionToMod add a go version directive, e.g. `go 1.14` to a `go.mod` file. +func addVersionToMod(goMod []byte, version string) bool { + cmd := exec.Command("go", "mod", "edit", "-go="+version) + return util.RunCmd(cmd) +} + +// checkVendor tests to see whether a vendor directory is inconsistent according to the go frontend +func checkVendor() bool { + vendorCheckCmd := exec.Command("go", "list", "-mod=vendor", "./...") + outp, err := vendorCheckCmd.CombinedOutput() + if err != nil { + badVendorRe := regexp.MustCompile(`(?m)^go: inconsistent vendoring in .*:$`) + return !badVendorRe.Match(outp) + } + + return true +} + +func main() { + if len(os.Args) > 1 { + usage() + os.Exit(2) + } + + log.Printf("Autobuilder was built with %s, environment has %s\n", runtime.Version(), getEnvGoVersion()) + + srcdir := os.Getenv("LGTM_SRC") + inLGTM := srcdir != "" + if inLGTM { + log.Printf("LGTM_SRC is %s\n", srcdir) + } else { + cwd, err := os.Getwd() + if err != nil { + log.Fatalln("Failed to get current working directory.") + } + log.Printf("LGTM_SRC is not set; defaulting to current working directory %s\n", cwd) + srcdir = cwd + } + + // we set `SEMMLE_PATH_TRANSFORMER` ourselves in some cases, so blank it out first for consistency + os.Setenv("SEMMLE_PATH_TRANSFORMER", "") + + // determine how to install dependencies and whether a GOPATH needs to be set up before + // extraction + depMode := GoGetNoModules + modMode := ModUnset + needGopath := true + if _, present := os.LookupEnv("GO111MODULE"); !present { + os.Setenv("GO111MODULE", "auto") + } + if util.FileExists("go.mod") { + depMode = GoGetWithModules + needGopath = false + log.Println("Found go.mod, enabling go modules") + } else if util.FileExists("Gopkg.toml") { + depMode = Dep + log.Println("Found Gopkg.toml, using dep instead of go get") + } else if util.FileExists("glide.yaml") { + depMode = Glide + log.Println("Found glide.yaml, enabling go modules") + } + + if depMode == GoGetWithModules { + // if a vendor/modules.txt file exists, we assume that there are vendored Go dependencies, and + // skip the dependency installation step and run the extractor with `-mod=vendor` + if util.FileExists("vendor/modules.txt") { + modMode = ModVendor + } else if util.DirExists("vendor") { + modMode = ModMod + } + } + + if modMode == ModVendor { + // fix go vendor issues with go versions >= 1.14 when no go version is specified in the go.mod + // if this is the case, and dependencies were vendored with an old go version (and therefore + // do not contain a '## explicit' annotation, the go command will fail and refuse to do any + // work + // + // we work around this by adding an explicit go version of 1.13, which is the last version + // where this is not an issue + if depMode == GoGetWithModules { + goMod, err := ioutil.ReadFile("go.mod") + if err != nil { + log.Println("Failed to read go.mod to check for missing Go version") + } else if versionRe := regexp.MustCompile(`(?m)^go[ \t\r]+[0-9]+\.[0-9]+$`); !versionRe.Match(goMod) { + // if the go.mod does not contain a version line + modulesTxt, err := ioutil.ReadFile("vendor/modules.txt") + if err != nil { + log.Println("Failed to read vendor/modules.txt to check for mismatched Go version") + } else if explicitRe := regexp.MustCompile("(?m)^## explicit$"); !explicitRe.Match(modulesTxt) { + // and the modules.txt does not contain an explicit annotation + log.Println("Adding a version directive to the go.mod file as the modules.txt does not have explicit annotations") + if !addVersionToMod(goMod, "1.13") { + log.Println("Failed to add a version to the go.mod file to fix explicitly required package bug; not using vendored dependencies") + modMode = ModMod + } + } + } + } + } + + // Go 1.16 and later won't automatically attempt to update go.mod / go.sum during package loading, so try to update them here: + if depMode == GoGetWithModules && semver.Compare(getEnvGoSemVer(), "1.16") >= 0 { + // stat go.mod and go.sum + beforeGoModFileInfo, beforeGoModErr := os.Stat("go.mod") + if beforeGoModErr != nil { + log.Println("Failed to stat go.mod before running `go mod tidy -e`") + } + + beforeGoSumFileInfo, beforeGoSumErr := os.Stat("go.sum") + + // run `go mod tidy -e` + res := util.RunCmd(exec.Command("go", "mod", "tidy", "-e")) + + if !res { + log.Println("Failed to run `go mod tidy -e`") + } else { + if beforeGoModFileInfo != nil { + afterGoModFileInfo, afterGoModErr := os.Stat("go.mod") + if afterGoModErr != nil { + log.Println("Failed to stat go.mod after running `go mod tidy -e`") + } else if afterGoModFileInfo.ModTime().After(beforeGoModFileInfo.ModTime()) { + // if go.mod has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.mod. You may wish to check these changes into version control. ") + } + } + + afterGoSumFileInfo, afterGoSumErr := os.Stat("go.sum") + if afterGoSumErr != nil { + log.Println("Failed to stat go.sum after running `go mod tidy -e`") + } else { + if beforeGoSumErr != nil || afterGoSumFileInfo.ModTime().After(beforeGoSumFileInfo.ModTime()) { + // if go.sum has been changed then notify the user + log.Println("We have run `go mod tidy -e` and it altered go.sum. You may wish to check these changes into version control. ") + } + } + } + } + + // if `LGTM_INDEX_NEED_GOPATH` is set, it overrides the value for `needGopath` inferred above + if needGopathOverride := os.Getenv("LGTM_INDEX_NEED_GOPATH"); needGopathOverride != "" { + inLGTM = true + if needGopathOverride == "true" { + needGopath = true + } else if needGopathOverride == "false" { + needGopath = false + } else { + log.Fatalf("Unexpected value for Boolean environment variable LGTM_NEED_GOPATH: %v.\n", needGopathOverride) + } + } + + importpath := getImportPath() + if needGopath && importpath == "" { + log.Printf("Failed to determine import path, not setting up GOPATH") + needGopath = false + } + + if inLGTM && needGopath { + // a temporary directory where everything is moved while the correct + // directory structure is created. + scratch, err := ioutil.TempDir(srcdir, "scratch") + if err != nil { + log.Fatalf("Failed to create temporary directory %s in directory %s: %s\n", + scratch, srcdir, err.Error()) + } + log.Printf("Temporary directory is %s.\n", scratch) + + // move all files in `srcdir` to `scratch` + dir, err := os.Open(srcdir) + if err != nil { + log.Fatalf("Failed to open source directory %s for reading: %s\n", srcdir, err.Error()) + } + files, err := dir.Readdirnames(-1) + if err != nil { + log.Fatalf("Failed to read source directory %s: %s\n", srcdir, err.Error()) + } + for _, file := range files { + if file != filepath.Base(scratch) { + log.Printf("Moving %s/%s to %s/%s.\n", srcdir, file, scratch, file) + err := os.Rename(filepath.Join(srcdir, file), filepath.Join(scratch, file)) + if err != nil { + log.Fatalf("Failed to move file %s to the temporary directory: %s\n", file, err.Error()) + } + } + } + + // create a new folder which we will add to GOPATH below + // Note we evaluate all symlinks here for consistency: otherwise os.Chdir below + // will follow links but other references to the path may not, which can lead to + // disagreements between GOPATH and the working directory. + realSrc, err := filepath.EvalSymlinks(srcdir) + if err != nil { + log.Fatalf("Failed to evaluate symlinks in %s: %s\n", srcdir, err.Error()) + } + + root := filepath.Join(realSrc, "root") + + // move source files to where Go expects them to be + newdir := filepath.Join(root, "src", importpath) + err = os.MkdirAll(filepath.Dir(newdir), 0755) + if err != nil { + log.Fatalf("Failed to create directory %s: %s\n", newdir, err.Error()) + } + log.Printf("Moving %s to %s.\n", scratch, newdir) + err = os.Rename(scratch, newdir) + if err != nil { + log.Fatalf("Failed to rename %s to %s: %s\n", scratch, newdir, err.Error()) + } + + // schedule restoring the contents of newdir to their original location after this function completes: + defer restoreRepoLayout(newdir, files, filepath.Base(scratch), srcdir) + + err = os.Chdir(newdir) + if err != nil { + log.Fatalf("Failed to chdir into %s: %s\n", newdir, err.Error()) + } + + // set up SEMMLE_PATH_TRANSFORMER to ensure paths in the source archive and the snapshot + // match the original source location, not the location we moved it to + pt, err := ioutil.TempFile("", "path-transformer") + if err != nil { + log.Fatalf("Unable to create path transformer file: %s.", err.Error()) + } + defer os.Remove(pt.Name()) + _, err = pt.WriteString("#" + realSrc + "\n" + newdir + "//\n") + if err != nil { + log.Fatalf("Unable to write path transformer file: %s.", err.Error()) + } + err = pt.Close() + if err != nil { + log.Fatalf("Unable to close path transformer file: %s.", err.Error()) + } + err = os.Setenv("SEMMLE_PATH_TRANSFORMER", pt.Name()) + if err != nil { + log.Fatalf("Unable to set SEMMLE_PATH_TRANSFORMER environment variable: %s.\n", err.Error()) + } + + // set/extend GOPATH + oldGopath := os.Getenv("GOPATH") + var newGopath string + if oldGopath != "" { + newGopath = strings.Join( + []string{root, oldGopath}, + string(os.PathListSeparator), + ) + } else { + newGopath = root + } + err = os.Setenv("GOPATH", newGopath) + if err != nil { + log.Fatalf("Unable to set GOPATH to %s: %s\n", newGopath, err.Error()) + } + log.Printf("GOPATH set to %s.\n", newGopath) + } + + // check whether an explicit dependency installation command was provided + inst := util.Getenv("CODEQL_EXTRACTOR_GO_BUILD_COMMAND", "LGTM_INDEX_BUILD_COMMAND") + shouldInstallDependencies := false + if inst == "" { + // try to build the project + buildSucceeded := autobuilder.Autobuild() + + // Build failed or there are still dependency errors; we'll try to install dependencies + // ourselves + if !buildSucceeded { + log.Println("Build failed, continuing to install dependencies.") + + shouldInstallDependencies = true + } else if util.DepErrors("./...", modMode.argsForGoVersion(getEnvGoSemVer())...) { + log.Println("Dependencies are still not resolving after the build, continuing to install dependencies.") + + shouldInstallDependencies = true + } + } else { + // write custom build commands into a script, then run it + var ( + ext = "" + header = "" + footer = "" + ) + if runtime.GOOS == "windows" { + ext = ".cmd" + header = "@echo on\n@prompt +$S\n" + footer = "\nIF %ERRORLEVEL% NEQ 0 EXIT" + } else { + ext = ".sh" + header = "#! /bin/bash\nset -xe +u\n" + } + script, err := ioutil.TempFile("", "go-build-command-*"+ext) + if err != nil { + log.Fatalf("Unable to create temporary script holding custom build commands: %s\n", err.Error()) + } + defer os.Remove(script.Name()) + _, err = script.WriteString(header + inst + footer) + if err != nil { + log.Fatalf("Unable to write to temporary script holding custom build commands: %s\n", err.Error()) + } + err = script.Close() + if err != nil { + log.Fatalf("Unable to close temporary script holding custom build commands: %s\n", err.Error()) + } + os.Chmod(script.Name(), 0700) + log.Println("Installing dependencies using custom build command.") + util.RunCmd(exec.Command(script.Name())) + } + + if modMode == ModVendor { + // test if running `go` with -mod=vendor works, and if it doesn't, try to fallback to -mod=mod + // or not set if the go version < 1.14. Note we check this post-build in case the build brings + // the vendor directory up to date. + if !checkVendor() { + modMode = ModMod + log.Println("The vendor directory is not consistent with the go.mod; not using vendored dependencies.") + } + } + + if shouldInstallDependencies { + if modMode == ModVendor { + log.Printf("Skipping dependency installation because a Go vendor directory was found.") + } else { + // automatically determine command to install dependencies + var install *exec.Cmd + if depMode == Dep { + // set up the dep cache if SEMMLE_CACHE is set + cacheDir := os.Getenv("SEMMLE_CACHE") + if cacheDir != "" { + depCacheDir := filepath.Join(cacheDir, "go", "dep") + log.Printf("Attempting to create dep cache dir %s\n", depCacheDir) + err := os.MkdirAll(depCacheDir, 0755) + if err != nil { + log.Printf("Failed to create dep cache directory: %s\n", err.Error()) + } else { + log.Printf("Setting dep cache directory to %s\n", depCacheDir) + err = os.Setenv("DEPCACHEDIR", depCacheDir) + if err != nil { + log.Println("Failed to set dep cache directory") + } else { + err = os.Setenv("DEPCACHEAGE", "720h") // 30 days + if err != nil { + log.Println("Failed to set dep cache age") + } + } + } + } + + if util.FileExists("Gopkg.lock") { + // if Gopkg.lock exists, don't update it and only vendor dependencies + install = exec.Command("dep", "ensure", "-v", "-vendor-only") + } else { + install = exec.Command("dep", "ensure", "-v") + } + log.Println("Installing dependencies using `dep ensure`.") + } else if depMode == Glide { + install = exec.Command("glide", "install") + log.Println("Installing dependencies using `glide install`") + } else { + // explicitly set go module support + if depMode == GoGetWithModules { + os.Setenv("GO111MODULE", "on") + } else if depMode == GoGetNoModules { + os.Setenv("GO111MODULE", "off") + } + + // get dependencies + install = exec.Command("go", "get", "-v", "./...") + log.Println("Installing dependencies using `go get -v ./...`.") + } + util.RunCmd(install) + } + } + + // extract + extractor, err := util.GetExtractorPath() + if err != nil { + log.Fatalf("Could not determine path of extractor: %v.\n", err) + } + + cwd, err := os.Getwd() + if err != nil { + log.Fatalf("Unable to determine current directory: %s\n", err.Error()) + } + + extractorArgs := []string{} + if depMode == GoGetWithModules { + extractorArgs = append(extractorArgs, modMode.argsForGoVersion(getEnvGoSemVer())...) + } + extractorArgs = append(extractorArgs, "./...") + + log.Printf("Running extractor command '%s %v' from directory '%s'.\n", extractor, extractorArgs, cwd) + cmd := exec.Command(extractor, extractorArgs...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + log.Fatalf("Extraction failed: %s\n", err.Error()) + } +} diff --git a/go/extractor/cli/go-autobuilder/go-autobuilder_test.go b/go/extractor/cli/go-autobuilder/go-autobuilder_test.go new file mode 100644 index 00000000000..f4e8405fe36 --- /dev/null +++ b/go/extractor/cli/go-autobuilder/go-autobuilder_test.go @@ -0,0 +1,22 @@ +package main + +import "testing" + +func TestGetImportPathFromRepoURL(t *testing.T) { + tests := map[string]string{ + "git@github.com:github/codeql-go.git": "github.com/github/codeql-go", + "git@github.com:github/codeql-go": "github.com/github/codeql-go", + "https://github.com/github/codeql-go.git": "github.com/github/codeql-go", + "https://github.com:12345/github/codeql-go": "github.com/github/codeql-go", + "gitolite@some.url:some/repo": "some.url/some/repo", + "file:///C:/some/path": "", + "https:///no/hostname": "", + "https://hostnameonly": "", + } + for input, expected := range tests { + actual := getImportPathFromRepoURL(input) + if actual != expected { + t.Errorf("Expected getImportPathFromRepoURL(\"%s\") to be \"%s\", but got \"%s\".", input, expected, actual) + } + } +} diff --git a/go/extractor/cli/go-bootstrap/go-bootstrap.go b/go/extractor/cli/go-bootstrap/go-bootstrap.go new file mode 100644 index 00000000000..603da2b8027 --- /dev/null +++ b/go/extractor/cli/go-bootstrap/go-bootstrap.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "regexp" +) + +// A utility program for generating `project` and `variable` files for SemmleCore Go projects +// +// This program should not normally be run directly; it is usually executed as part of +// `odasa bootstrap`, and expects two files as arguments: a (partial) `variables` file and +// an empty file to be filled in with an `` element containing build steps. +// +// The `variables` file is extended with a definition of `LGTM_SRC` and, if it defines the +// `repository` variable, `SEMMLE_REPO_URL`. The only build step is an invocation of the +// Go autobuilder. +func main() { + vars := os.Args[1] + buildSteps := os.Args[2] + + haveRepo := false + content, err := ioutil.ReadFile(vars) + if err != nil { + log.Fatal(err) + } + re := regexp.MustCompile(`(^|\n)repository=`) + haveRepo = re.Find(content) != nil + + additionalVars := "LGTM_SRC=${src}\n" + if haveRepo { + additionalVars += "SEMMLE_REPO_URL=${repository}\n" + } + content = append(content, []byte(additionalVars)...) + err = ioutil.WriteFile(vars, content, 0644) + if err != nil { + log.Fatal(err) + } + + export := "LGTM_SRC" + if haveRepo { + export += ",SEMMLE_REPO_URL" + } + content = []byte(fmt.Sprintf(` + ${semmle_dist}/language-packs/go/tools/platform/${semmle_platform}/bin/go-autobuilder + +`, export)) + err = ioutil.WriteFile(buildSteps, content, 0644) + if err != nil { + log.Fatal(err) + } +} diff --git a/go/extractor/cli/go-build-runner/go-build-runner.go b/go/extractor/cli/go-build-runner/go-build-runner.go new file mode 100644 index 00000000000..118de5caf2e --- /dev/null +++ b/go/extractor/cli/go-build-runner/go-build-runner.go @@ -0,0 +1,36 @@ +package main + +import ( + "github.com/github/codeql-go/extractor/util" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + + "github.com/github/codeql-go/extractor/autobuilder" +) + +func main() { + // check if a build command has successfully extracted something + autobuilder.CheckExtracted = true + if autobuilder.Autobuild() { + return + } + + // if the autobuilder fails, invoke the extractor manually + // we cannot simply call `go build` here, because the tracer is not able to trace calls made by + // this binary + log.Printf("No build commands succeeded, falling back to go build ./...") + + mypath, err := os.Executable() + if err != nil { + log.Fatalf("Could not determine path of extractor: %v.\n", err) + } + extractor := filepath.Join(filepath.Dir(mypath), "go-extractor") + if runtime.GOOS == "windows" { + extractor = extractor + ".exe" + } + + util.RunCmd(exec.Command(extractor, "./...")) +} diff --git a/go/extractor/cli/go-extractor/go-extractor.go b/go/extractor/cli/go-extractor/go-extractor.go new file mode 100644 index 00000000000..59ab35da4a9 --- /dev/null +++ b/go/extractor/cli/go-extractor/go-extractor.go @@ -0,0 +1,132 @@ +package main + +import ( + "fmt" + "log" + "os" + "runtime" + "runtime/pprof" + "strings" + + "github.com/github/codeql-go/extractor" +) + +var cpuprofile, memprofile string + +func usage() { + fmt.Fprintf(os.Stderr, "%s is a program for building a snapshot of a Go code base.\n\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage:\n\n %s [...] [...] [--] ...\n\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Flags:\n\n") + fmt.Fprintf(os.Stderr, "--help Print this help.\n") +} + +func parseFlags(args []string, mimic bool) ([]string, []string) { + i := 0 + buildFlags := []string{} + for ; i < len(args) && strings.HasPrefix(args[i], "-"); i++ { + if args[i] == "--" { + i++ + break + } + + if !mimic { + // we're not in mimic mode, try to parse our arguments + switch args[i] { + case "--help": + usage() + os.Exit(0) + case "--mimic": + if i+1 < len(args) { + i++ + compiler := args[i] + log.Printf("Compiler: %s", compiler) + if i+1 < len(args) { + i++ + command := args[i] + if command == "build" || command == "install" || command == "run" { + log.Printf("Intercepting build") + return parseFlags(args[i+1:], true) + } else { + log.Printf("Non-build command '%s'; skipping", strings.Join(args[1:], " ")) + os.Exit(0) + } + } else { + log.Printf("Non-build command '%s'; skipping", strings.Join(args[1:], " ")) + os.Exit(0) + } + } else { + log.Fatalf("--mimic requires an argument, e.g. --mimic go") + } + } + } + + // parse go build flags + switch args[i] { + // skip `-o output` and `-i`, if applicable + case "-o": + if i+1 < len(args) { + i++ + } + case "-i": + case "-p", "-asmflags", "-buildmode", "-compiler", "-gccgoflags", "-gcflags", "-installsuffix", + "-ldflags", "-mod", "-modfile", "-pkgdir", "-tags", "-toolexec", "-overlay": + if i+1 < len(args) { + buildFlags = append(buildFlags, args[i], args[i+1]) + i++ + } else { + buildFlags = append(buildFlags, args[i]) + } + default: + if strings.HasPrefix(args[i], "-") { + buildFlags = append(buildFlags, args[i]) + } else { + // stop parsing if the argument is not a flag (and so is positional) + break + } + } + } + + cpuprofile = os.Getenv("CODEQL_EXTRACTOR_GO_CPU_PROFILE") + memprofile = os.Getenv("CODEQL_EXTRACTOR_GO_MEM_PROFILE") + + return buildFlags, args[i:] +} + +func main() { + buildFlags, patterns := parseFlags(os.Args[1:], false) + + if cpuprofile != "" { + f, err := os.Create(cpuprofile) + if err != nil { + log.Fatalf("Unable to create CPU profile: %v.", err) + } + defer f.Close() + if err := pprof.StartCPUProfile(f); err != nil { + log.Fatalf("Unable to start CPU profile: %v.", err) + } + defer pprof.StopCPUProfile() + } + + if len(patterns) == 0 { + log.Println("No packages explicitly provided, adding '.'") + patterns = []string{"."} + } + + log.Printf("Build flags: '%s'; patterns: '%s'\n", strings.Join(buildFlags, " "), strings.Join(patterns, " ")) + err := extractor.ExtractWithFlags(buildFlags, patterns) + if err != nil { + log.Fatalf("Error running go tooling: %s\n", err.Error()) + } + + if memprofile != "" { + f, err := os.Create(memprofile) + if err != nil { + log.Fatalf("Unable to create memory profile: %v", err) + } + defer f.Close() + runtime.GC() // get up-to-date statistics + if err := pprof.WriteHeapProfile(f); err != nil { + log.Fatal("Unable to write memory profile: ", err) + } + } +} diff --git a/go/extractor/cli/go-gen-dbscheme/go-gen-dbscheme.go b/go/extractor/cli/go-gen-dbscheme/go-gen-dbscheme.go new file mode 100644 index 00000000000..94831c2b451 --- /dev/null +++ b/go/extractor/cli/go-gen-dbscheme/go-gen-dbscheme.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "os" + + "github.com/github/codeql-go/extractor/dbscheme" +) + +func usage() { + fmt.Fprintf(os.Stderr, "%s is a program for generating the dbscheme for CodeQL Go databases.\n\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage:\n\n %s \n\n", os.Args[0]) +} + +func main() { + if len(os.Args) != 2 { + usage() + os.Exit(2) + } + + out := os.Args[1] + + f, err := os.Create(out) + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to open file %s for writing.\n", out) + os.Exit(1) + } + dbscheme.PrintDbScheme(f) + f.Close() + fmt.Printf("Dbscheme written to file %s.\n", out) +} diff --git a/go/extractor/cli/go-tokenizer/go-tokenizer.go b/go/extractor/cli/go-tokenizer/go-tokenizer.go new file mode 100644 index 00000000000..ec4a4057173 --- /dev/null +++ b/go/extractor/cli/go-tokenizer/go-tokenizer.go @@ -0,0 +1,57 @@ +package main + +import ( + "encoding/csv" + "flag" + "fmt" + "go/scanner" + "go/token" + "io/ioutil" + "log" + "os" + "strings" +) + +func main() { + flag.Parse() + + fs := token.NewFileSet() + csv := csv.NewWriter(os.Stdout) + defer csv.Flush() + + for _, fileName := range flag.Args() { + src, err := ioutil.ReadFile(fileName) + if err != nil { + log.Fatalf("Unable to read file %s.", fileName) + } + f := fs.AddFile(fileName, -1, len(src)) + + var s scanner.Scanner + s.Init(f, src, nil, 0) + for { + beginPos, tok, text := s.Scan() + + if strings.TrimSpace(text) != "" { + var fuzzyText string + if tok.IsLiteral() { + fuzzyText = tok.String() + } else { + fuzzyText = text + } + + endPos := f.Pos(f.Offset(beginPos) + len(text)) + beginLine := fmt.Sprintf("%d", f.Position(beginPos).Line) + beginColumn := fmt.Sprintf("%d", f.Position(beginPos).Column) + endLine := fmt.Sprintf("%d", f.Position(endPos).Line) + endColumn := fmt.Sprintf("%d", f.Position(endPos).Column) + err = csv.Write([]string{text, fuzzyText, beginLine, beginColumn, endLine, endColumn}) + if err != nil { + log.Fatalf("Unable to write CSV data: %v", err) + } + } + if tok == token.EOF { + break + } + } + } +} diff --git a/go/extractor/dbscheme/dbscheme.go b/go/extractor/dbscheme/dbscheme.go new file mode 100644 index 00000000000..923fda859db --- /dev/null +++ b/go/extractor/dbscheme/dbscheme.go @@ -0,0 +1,426 @@ +package dbscheme + +import ( + "fmt" + "io" + "log" + "reflect" + "strings" + + "github.com/github/codeql-go/extractor/trap" +) + +// A Type represents a database type +type Type interface { + def() string + ref() string + repr() string + valid(val interface{}) bool +} + +// A PrimitiveType represents a primitive dataase type +type PrimitiveType int + +const ( + // INT represents the primitive database type `int` + INT PrimitiveType = iota + // FLOAT represents the primitive database type `float` + FLOAT + // BOOLEAN represents the primitive database type `boolean` + BOOLEAN + // DATE represents the primitive database type `date` + DATE + // STRING represents the primitive database type `string` + STRING +) + +// A PrimaryKeyType represents a database type defined by a primary key column +type PrimaryKeyType struct { + name string +} + +// A UnionType represents a database type defined as the union of other database types +type UnionType struct { + name string + components []Type +} + +// An AliasType represents a database type which is an alias of another database type +type AliasType struct { + name string + underlying Type +} + +// A CaseType represents a database type defined by a primary key column with a supplementary kind column +type CaseType struct { + base Type + column string + branches []*BranchType +} + +// A BranchType represents one branch of a case type +type BranchType struct { + idx int + name string +} + +func (pt PrimitiveType) def() string { + return "" +} + +func (pt PrimitiveType) ref() string { + switch pt { + case INT: + return "int" + case FLOAT: + return "float" + case BOOLEAN: + return "boolean" + case DATE: + return "date" + case STRING: + return "string" + default: + panic(fmt.Sprintf("Unexpected primitive type %d", pt)) + } +} + +func (pt PrimitiveType) repr() string { + switch pt { + case INT: + return "int" + case FLOAT: + return "float" + case BOOLEAN: + return "boolean" + case DATE: + return "date" + case STRING: + return "string" + default: + panic(fmt.Sprintf("Unexpected primitive type %d", pt)) + } +} + +func (pt PrimitiveType) valid(value interface{}) bool { + switch value.(type) { + case int: + return pt == INT + case float64: + return pt == FLOAT + case bool: + return pt == BOOLEAN + case string: + return pt == STRING + } + return false +} + +func (pkt PrimaryKeyType) def() string { + return "" +} + +func (pkt PrimaryKeyType) ref() string { + return pkt.name +} + +func (pkt PrimaryKeyType) repr() string { + return "int" +} + +func (pkt PrimaryKeyType) valid(value interface{}) bool { + _, ok := value.(trap.Label) + return ok +} + +func (ut UnionType) def() string { + var b strings.Builder + nl := 0 + fmt.Fprintf(&b, "%s = ", ut.name) + for i, comp := range ut.components { + if i > 0 { + if i < len(ut.components)-1 && b.Len()-nl > 100 { + fmt.Fprintf(&b, "\n%s", strings.Repeat(" ", len(ut.name))) + nl = b.Len() + } + fmt.Fprint(&b, " | ") + } + fmt.Fprint(&b, comp.ref()) + } + fmt.Fprint(&b, ";") + return b.String() +} + +func (ut UnionType) ref() string { + return ut.name +} + +func (ut UnionType) repr() string { + return "int" +} + +func (ut UnionType) valid(value interface{}) bool { + _, ok := value.(trap.Label) + return ok +} + +func (at AliasType) def() string { + return at.name + " = " + at.underlying.ref() + ";" +} + +func (at AliasType) ref() string { + return at.name +} + +func (at AliasType) repr() string { + return at.underlying.repr() +} + +func (at AliasType) valid(value interface{}) bool { + return at.underlying.valid(value) +} + +func (ct CaseType) def() string { + var b strings.Builder + fmt.Fprintf(&b, "case %s.%s of", ct.base.ref(), ct.column) + sep := " " + for _, branch := range ct.branches { + fmt.Fprintf(&b, "\n%s%s", sep, branch.def()) + sep = "| " + } + fmt.Fprint(&b, ";") + return b.String() +} + +func (ct CaseType) ref() string { + panic("case types do not have a name") +} + +func (ct CaseType) repr() string { + return "int" +} + +func (ct CaseType) valid(value interface{}) bool { + _, ok := value.(trap.Label) + return ok +} + +func (bt BranchType) def() string { + return fmt.Sprintf("%d = %s", bt.idx, bt.name) +} + +func (bt BranchType) ref() string { + return bt.name +} + +func (bt BranchType) repr() string { + return "int" +} + +func (bt BranchType) valid(value interface{}) bool { + _, ok := value.(trap.Label) + return ok +} + +// Index returns the numeric index of this branch type +func (bt BranchType) Index() int { + return bt.idx +} + +// A Column represents a column in a database table +type Column struct { + columnName string + columnType Type + unique bool + ref bool +} + +func (col Column) String() string { + var b strings.Builder + if col.unique { + fmt.Fprint(&b, "unique ") + } + fmt.Fprintf(&b, "%s %s: %s", col.columnType.repr(), col.columnName, col.columnType.ref()) + if col.ref { + fmt.Fprint(&b, " ref") + } + return b.String() +} + +// Key returns a new column that is the same as this column, but has the `key` flag set to `true` +func (col Column) Key() Column { + return Column{col.columnName, col.columnType, true, false} +} + +// Unique returns a new column that is the same as this column, but has the `unique` flag set to `true` +func (col Column) Unique() Column { + return Column{col.columnName, col.columnType, true, col.ref} +} + +// EntityColumn constructs a column with name `columnName` holding entities of type `columnType` +func EntityColumn(columnType Type, columnName string) Column { + return Column{columnName, columnType, false, true} +} + +// StringColumn constructs a column with name `columnName` holding string values +func StringColumn(columnName string) Column { + return Column{columnName, STRING, false, true} +} + +// IntColumn constructs a column with name `columnName` holding integer values +func IntColumn(columnName string) Column { + return Column{columnName, INT, false, true} +} + +// FloatColumn constructs a column with name `columnName` holding floating point number values +func FloatColumn(columnName string) Column { + return Column{columnName, FLOAT, false, true} +} + +// A Table represents a database table +type Table struct { + name string + schema []Column + keysets [][]string +} + +// KeySet adds `keys` as a keyset to this table +func (tbl *Table) KeySet(keys ...string) *Table { + tbl.keysets = append(tbl.keysets, keys) + return tbl +} + +func (tbl Table) String() string { + var b strings.Builder + for _, keyset := range tbl.keysets { + fmt.Fprint(&b, "#keyset[") + sep := "" + for _, key := range keyset { + fmt.Fprintf(&b, "%s%s", sep, key) + sep = ", " + } + fmt.Fprint(&b, "]\n") + } + fmt.Fprint(&b, tbl.name) + fmt.Fprint(&b, "(") + nl := 0 + for i, column := range tbl.schema { + if i > 0 { + // wrap >100 char lines + if i < len(tbl.schema)-1 && b.Len()-nl > 100 { + fmt.Fprintf(&b, ",\n%s", strings.Repeat(" ", len(tbl.name)+1)) + nl = b.Len() + } else { + fmt.Fprint(&b, ", ") + } + } + fmt.Fprint(&b, column.String()) + } + fmt.Fprint(&b, ");") + return b.String() +} + +// Emit outputs a tuple of `values` for this table using trap writer `tw` +// and panicks if the tuple does not have the right schema +func (tbl Table) Emit(tw *trap.Writer, values ...interface{}) { + if ncol, nval := len(tbl.schema), len(values); ncol != nval { + log.Fatalf("wrong number of values for table %s; expected %d, but got %d", tbl.name, ncol, nval) + } + for i, col := range tbl.schema { + if !col.columnType.valid(values[i]) { + panic(fmt.Sprintf("Invalid value for column %d of table %s; expected a %s, but got %s which is a %s", i, tbl.name, col.columnType.ref(), values[i], reflect.TypeOf(values[i]))) + } + } + tw.Emit(tbl.name, values) +} + +var tables = []*Table{} +var types = []Type{} +var defaultSnippets = []string{} + +// NewTable constructs a new table with the given `name` and `columns` +func NewTable(name string, columns ...Column) *Table { + tbl := &Table{name, columns, [][]string{}} + tables = append(tables, tbl) + return tbl +} + +// NewPrimaryKeyType constructs a new primary key type with the given `name`, +// and adds it to the union types `parents` (if any) +func NewPrimaryKeyType(name string, parents ...*UnionType) *PrimaryKeyType { + tp := &PrimaryKeyType{name} + types = append(types, tp) + for _, parent := range parents { + parent.components = append(parent.components, tp) + } + return tp +} + +// NewUnionType constructs a new union type with the given `name`, +// and adds it to the union types `parents` (if any) +func NewUnionType(name string, parents ...*UnionType) *UnionType { + tp := &UnionType{name, []Type{}} + types = append(types, tp) + for _, parent := range parents { + parent.components = append(parent.components, tp) + } + return tp +} + +// AddChild adds the type with given `name` to the union type. +// This is useful if a type defined in a snippet should be a child of a type defined in Go. +func (parent *UnionType) AddChild(name string) bool { + tp := &PrimaryKeyType{name} + // don't add tp to types; it's expected that it's already in the db somehow. + parent.components = append(parent.components, tp) + return true +} + +// NewAliasType constructs a new alias type with the given `name` that aliases `underlying` +func NewAliasType(name string, underlying Type) *AliasType { + tp := &AliasType{name, underlying} + types = append(types, tp) + return tp +} + +// NewCaseType constructs a new case type on the given `base` type whose discriminator values +// come from `column` +func NewCaseType(base Type, column string) *CaseType { + tp := &CaseType{base, column, []*BranchType{}} + types = append(types, tp) + return tp +} + +// NewBranch adds a new branch with the given `name` to this case type +// and adds it to the union types `parents` (if any) +func (ct *CaseType) NewBranch(name string, parents ...*UnionType) *BranchType { + tp := &BranchType{len(ct.branches), name} + ct.branches = append(ct.branches, tp) + for _, parent := range parents { + parent.components = append(parent.components, tp) + } + return tp +} + +// AddDefaultSnippet adds the given text `snippet` to the schema of this database +func AddDefaultSnippet(snippet string) bool { + defaultSnippets = append(defaultSnippets, snippet) + return true +} + +// PrintDbScheme prints the schema of this database to the writer `w` +func PrintDbScheme(w io.Writer) { + fmt.Fprintf(w, "/** Auto-generated dbscheme; do not edit. */\n\n") + for _, snippet := range defaultSnippets { + fmt.Fprintf(w, "%s\n", snippet) + } + for _, table := range tables { + fmt.Fprintf(w, "%s\n\n", table.String()) + } + for _, tp := range types { + def := tp.def() + if def != "" { + fmt.Fprintf(w, "%s\n\n", def) + } + } +} diff --git a/go/extractor/dbscheme/tables.go b/go/extractor/dbscheme/tables.go new file mode 100644 index 00000000000..63332aa3b59 --- /dev/null +++ b/go/extractor/dbscheme/tables.go @@ -0,0 +1,1222 @@ +package dbscheme + +import ( + "go/ast" + "go/token" + gotypes "go/types" + + "golang.org/x/tools/go/packages" +) + +var defaultSnippet = AddDefaultSnippet(` +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); +`) + +// Copied directly from the XML dbscheme +var xmlSnippet = AddDefaultSnippet(` +/* + * 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; +`) + +// Compiler diagnostic tables +var CompilationType = NewPrimaryKeyType("@compilation") + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * go build a.go b.go c.go + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +var CompilationsTable = NewTable("compilations", + EntityColumn(CompilationType, "id").Key(), + StringColumn("cwd"), +) + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * go build a.go b.go c.go + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--` + * 2 | a.go + * 3 | b.go + * 4 | c.go + */ +var CompilationArgsTable = NewTable("compilation_args", + EntityColumn(CompilationType, "id"), + IntColumn("num"), + StringColumn("arg"), +).KeySet("id", "num") + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * go build a.go b.go c.go + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | a.go + * 1 | b.go + * 2 | c.go + */ +var CompilationCompilingFilesTable = NewTable("compilation_compiling_files", + EntityColumn(CompilationType, "id"), + IntColumn("num"), + EntityColumn(FileType, "file"), +).KeySet("id", "num") + +type CompilationTypeKind int + +const ( + FRONTEND_CPU_SECONDS = iota + FRONTEND_ELAPSED_SECONDS + EXTRACTOR_CPU_SECONDS + EXTRACTOR_ELAPSED_SECONDS +) + +/** + * 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 + */ +var CompilationTimeTable = NewTable("compilation_time", + EntityColumn(CompilationType, "id"), + IntColumn("num"), + IntColumn("kind"), + FloatColumn("secs"), +).KeySet("id", "num", "kind") + +var DiagnosticType = NewPrimaryKeyType("@diagnostic") + +/** + * 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. + */ +var DiagnosticForTable = NewTable("diagnostic_for", + EntityColumn(DiagnosticType, "diagnostic").Unique(), + EntityColumn(CompilationType, "compilation"), + IntColumn("file_number"), + IntColumn("file_number_diagnostic_number"), +) + +/** + * 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`. + */ +var CompilationFinishedTable = NewTable("compilation_finished", + EntityColumn(CompilationType, "id").Unique(), + FloatColumn("cpu_seconds"), + FloatColumn("elapsed_seconds"), +) + +var DiagnosticsTable = NewTable("diagnostics", + EntityColumn(DiagnosticType, "id").Key(), + IntColumn("severity"), + StringColumn("error_tag"), + StringColumn("error_message"), + StringColumn("full_error_message"), + EntityColumn(LocationType, "location"), +) + +// ContainerType is the type of files and folders +var ContainerType = NewUnionType("@container") + +// LocatableType is the type of program entities that have locations +var LocatableType = NewUnionType("@locatable") + +// Adds xmllocatable as a locatable +var XmlLocatableAsLocatable = LocatableType.AddChild("@xmllocatable") + +// NodeType is the type of AST nodes +var NodeType = NewUnionType("@node", LocatableType) + +// DocumentableType is the type of AST nodes to which documentation can be attached +var DocumentableType = NewUnionType("@documentable", NodeType) + +// ExprParentType is the type of AST nodes that can have expressions as children +var ExprParentType = NewUnionType("@exprparent", NodeType) + +// ModExprParentType is the type of go.mod nodes that can have go.mod expressions as children +var ModExprParentType = NewUnionType("@modexprparent", NodeType) + +// FieldParentType is the type of AST nodes that can have fields as children +var FieldParentType = NewUnionType("@fieldparent", NodeType) + +// StmtParentType is the type of AST nodes that can have statements as children +var StmtParentType = NewUnionType("@stmtparent", NodeType) + +// DeclParentType is the type of AST nodes that can have declarations as children +var DeclParentType = NewUnionType("@declparent", NodeType) + +// TypeParamDeclParentType is the type of AST nodes that can have type parameter declarations as children +var TypeParamDeclParentType = NewUnionType("@typeparamdeclparent", NodeType) + +// FuncDefType is the type of AST nodes that define functions, that is, function +// declarations and function literals +var FuncDefType = NewUnionType("@funcdef", StmtParentType, ExprParentType) + +// ScopeNodeType is the type of AST nodes that may have a scope attached to them +var ScopeNodeType = NewUnionType("@scopenode", NodeType) + +// LocationDefaultType is the type of source locations +var LocationDefaultType = NewPrimaryKeyType("@location_default") + +// FileType is the type of file AST nodes +var FileType = NewPrimaryKeyType("@file", ContainerType, DocumentableType, ExprParentType, ModExprParentType, DeclParentType, ScopeNodeType) + +// FolderType is the type of folders +var FolderType = NewPrimaryKeyType("@folder", ContainerType) + +// CommentGroupType is the type of comment groups +var CommentGroupType = NewPrimaryKeyType("@comment_group", NodeType) + +// CommentType is the type of comments +var CommentType = NewPrimaryKeyType("@comment", NodeType) + +// ExprType is the type of expression AST nodes +var ExprType = NewPrimaryKeyType("@expr", ExprParentType) + +// FieldType is the type of field AST nodes +var FieldType = NewPrimaryKeyType("@field", DocumentableType, ExprParentType) + +// StmtType is the type of statement AST nodes +var StmtType = NewPrimaryKeyType("@stmt", ExprParentType, StmtParentType) + +// DeclType is the type of declaration AST nodes +var DeclType = NewPrimaryKeyType("@decl", ExprParentType, StmtParentType, FieldParentType) + +// TypeParamDeclType is the type of type parameter declaration AST nodes +var TypeParamDeclType = NewPrimaryKeyType("@typeparamdecl", DocumentableType, ExprParentType) + +// SpecType is the type of spec AST nodes +var SpecType = NewPrimaryKeyType("@spec", ExprParentType, DocumentableType) + +// TypeType is the type of types +var TypeType = NewPrimaryKeyType("@type") + +// LocationType is an alias for LocationDefaultType +var LocationType = NewAliasType("@location", LocationDefaultType) + +// SourceLineType is an alias for LocatableType +var SourceLineType = NewAliasType("@sourceline", LocatableType) + +// CommentKind is a case type for distinguishing different kinds of comments +var CommentKind = NewCaseType(CommentType, "kind") + +// SlashSlashComment is the type of single-line comments starting with a double slash +var SlashSlashComment = CommentKind.NewBranch("@slashslashcomment") + +// SlashStarComment is the type of block comments delimited by stars and slashes +var SlashStarComment = CommentKind.NewBranch("@slashstarcomment") + +// ExprKind is a case type for distinguishing different kinds of expression AST nodes +var ExprKind = NewCaseType(ExprType, "kind") + +// BadExpr is type of bad (that is, unparseable) expression AST nodes +var BadExpr = ExprKind.NewBranch("@badexpr") + +// IdentExpr is the type of identifier expression AST nodes +var IdentExpr = ExprKind.NewBranch("@ident") + +// EllipsisExpr is the type of ellipsis expression AST nodes +var EllipsisExpr = ExprKind.NewBranch("@ellipsis") + +// BasicLitExpr is the type of basic (that is, primitive) literal expression AST nodes +var BasicLitExpr = NewUnionType("@basiclit") + +// IntLitExpr is a case type for dishinguishing different kinds of literal expression AST nodes +var IntLitExpr = ExprKind.NewBranch("@intlit", BasicLitExpr) + +// FloatLitExpr is the type of floating-point literal expression AST nodes +var FloatLitExpr = ExprKind.NewBranch("@floatlit", BasicLitExpr) + +// ImagLitExpr is the type of imaginary literal expression AST nodes +var ImagLitExpr = ExprKind.NewBranch("@imaglit", BasicLitExpr) + +// CharLitExpr is the type of character literal expression AST nodes +var CharLitExpr = ExprKind.NewBranch("@charlit", BasicLitExpr) + +// StringLitExpr is the type of string literal expression AST nodes +var StringLitExpr = ExprKind.NewBranch("@stringlit", BasicLitExpr) + +// FuncLitExpr is the type of function literal expression AST nodes +var FuncLitExpr = ExprKind.NewBranch("@funclit", FuncDefType) + +// CompositeLitExpr is the type of composite literal expression AST nodes +var CompositeLitExpr = ExprKind.NewBranch("@compositelit") + +// ParenExpr is the type of parenthesis expression AST nodes +var ParenExpr = ExprKind.NewBranch("@parenexpr") + +// SelectorExpr is the type of selector expression AST nodes +var SelectorExpr = ExprKind.NewBranch("@selectorexpr") + +// IndexExpr is the type of AST nodes for index expressions and generic type +// instantiation expressions with one type argument. Note that syntactically +// unambiguous generic instantiations will be extracted as +// `GenericTypeInstantiationExpr`. +var IndexExpr = ExprKind.NewBranch("@indexexpr") + +// GenericFunctionInstantiationExpr is the type of AST nodes that represent an instantiation +// of a generic type. These correspond to some index expression AST nodes and all index +// list expression AST nodes. +var GenericFunctionInstantiationExpr = ExprKind.NewBranch("@genericfunctioninstantiationexpr") + +// GenericTypeInstantiationExpr is the type of AST nodes that represent an instantiation +// of a generic type. These correspond to some index expression AST nodes and all index +// list expression AST nodes. Note some syntactically ambiguous instantations are +// extracted as an `IndexExpr` to be disambiguated in QL later. +var GenericTypeInstantiationExpr = ExprKind.NewBranch("@generictypeinstantiationexpr") + +// SliceExpr is the type of slice expression AST nodes +var SliceExpr = ExprKind.NewBranch("@sliceexpr") + +// TypeAssertExpr is the type of type assertion expression AST nodes +var TypeAssertExpr = ExprKind.NewBranch("@typeassertexpr") + +// CallOrConversionExpr is the type of call and conversion expression AST nodes +// (which cannot be distinguished by purely syntactic criteria) +var CallOrConversionExpr = ExprKind.NewBranch("@callorconversionexpr") + +// StarExpr is the type of star expression AST nodes +var StarExpr = ExprKind.NewBranch("@starexpr") + +// OperatorExpr is the type of operator expression AST nodes +var OperatorExpr = NewUnionType("@operatorexpr") + +// LogicalExpr is the type of logical operator expression AST nodes +var LogicalExpr = NewUnionType("@logicalexpr", OperatorExpr) + +// ArithmeticExpr is the type of arithmetic operator expression AST nodes +var ArithmeticExpr = NewUnionType("@arithmeticexpr", OperatorExpr) + +// BitwiseExpr is the type of bitwise operator expression AST nodes +var BitwiseExpr = NewUnionType("@bitwiseexpr", OperatorExpr) + +// UnaryExpr is the type of unary operator expression AST nodes +var UnaryExpr = NewUnionType("@unaryexpr", OperatorExpr) + +// LogicalUnaryExpr is the type of logical unary operator expression AST nodes +var LogicalUnaryExpr = NewUnionType("@logicalunaryexpr", UnaryExpr, LogicalExpr) + +// BitwiseUnaryExpr is the type of bitwise unary operator expression AST nodes +var BitwiseUnaryExpr = NewUnionType("@bitwiseunaryexpr", UnaryExpr, BitwiseExpr) + +// ArithmeticUnaryExpr is the type of arithmetic unary operator expression AST nodes +var ArithmeticUnaryExpr = NewUnionType("@arithmeticunaryexpr", UnaryExpr, ArithmeticExpr) + +// BinaryExpr is the type of binary operator expression AST nodes +var BinaryExpr = NewUnionType("@binaryexpr", OperatorExpr) + +// LogicalBinaryExpr is the type of logical binary operator expression AST nodes +var LogicalBinaryExpr = NewUnionType("@logicalbinaryexpr", BinaryExpr, LogicalExpr) + +// BitwiseBinaryExpr is the type of bitwise binary operator expression AST nodes +var BitwiseBinaryExpr = NewUnionType("@bitwisebinaryexpr", BinaryExpr, BitwiseExpr) + +// ArithmeticBinaryExpr is the type of arithmetic binary operator expression AST nodes +var ArithmeticBinaryExpr = NewUnionType("@arithmeticbinaryexpr", BinaryExpr, ArithmeticExpr) + +// ShiftExpr is the type of shift operator expression AST nodes +var ShiftExpr = NewUnionType("@shiftexpr", BitwiseBinaryExpr) + +// Comparison is the type of comparison operator expression AST nodes +var Comparison = NewUnionType("@comparison", BinaryExpr) + +// EqualityTest is the type of equality operator expression AST nodes +var EqualityTest = NewUnionType("@equalitytest", Comparison) + +// RelationalComparison is the type of relational operator expression AST nodes +var RelationalComparison = NewUnionType("@relationalcomparison", Comparison) + +// KeyValueExpr is the type of key-value expression AST nodes +var KeyValueExpr = ExprKind.NewBranch("@keyvalueexpr") + +// ArrayTypeExpr is the type of array type AST nodes +var ArrayTypeExpr = ExprKind.NewBranch("@arraytypeexpr") + +// StructTypeExpr is the type of struct type AST nodes +var StructTypeExpr = ExprKind.NewBranch("@structtypeexpr", FieldParentType) + +// FuncTypeExpr is the type of function type AST nodes +var FuncTypeExpr = ExprKind.NewBranch("@functypeexpr", FieldParentType, ScopeNodeType) + +// InterfaceTypeExpr is the type of interface type AST nodes +var InterfaceTypeExpr = ExprKind.NewBranch("@interfacetypeexpr", FieldParentType) + +// MapTypeExpr is the type of map type AST nodes +var MapTypeExpr = ExprKind.NewBranch("@maptypeexpr") + +// TypeSetLiteralExpr is the type of type set literal type AST nodes +var TypeSetLiteralExpr = ExprKind.NewBranch("@typesetliteralexpr") + +// ChanTypeExpr is the type of channel type AST nodes +var ChanTypeExpr = NewUnionType("@chantypeexpr") + +// UnaryExprs is a map from unary operator tokens to the corresponding AST node type +var UnaryExprs = map[token.Token]*BranchType{ + token.ADD: ExprKind.NewBranch("@plusexpr", ArithmeticUnaryExpr), + token.SUB: ExprKind.NewBranch("@minusexpr", ArithmeticUnaryExpr), + token.NOT: ExprKind.NewBranch("@notexpr", LogicalUnaryExpr), + token.XOR: ExprKind.NewBranch("@complementexpr", BitwiseUnaryExpr), + token.MUL: ExprKind.NewBranch("@derefexpr", UnaryExpr), + token.AND: ExprKind.NewBranch("@addressexpr", UnaryExpr), + token.ARROW: ExprKind.NewBranch("@arrowexpr", UnaryExpr), +} + +// BinaryExprs is a map from binary operator tokens to the corresponding AST node type +var BinaryExprs = map[token.Token]*BranchType{ + token.LOR: ExprKind.NewBranch("@lorexpr", LogicalBinaryExpr), + token.LAND: ExprKind.NewBranch("@landexpr", LogicalBinaryExpr), + token.EQL: ExprKind.NewBranch("@eqlexpr", EqualityTest), + token.NEQ: ExprKind.NewBranch("@neqexpr", EqualityTest), + token.LSS: ExprKind.NewBranch("@lssexpr", RelationalComparison), + token.LEQ: ExprKind.NewBranch("@leqexpr", RelationalComparison), + token.GTR: ExprKind.NewBranch("@gtrexpr", RelationalComparison), + token.GEQ: ExprKind.NewBranch("@geqexpr", RelationalComparison), + token.ADD: ExprKind.NewBranch("@addexpr", ArithmeticBinaryExpr), + token.SUB: ExprKind.NewBranch("@subexpr", ArithmeticBinaryExpr), + token.OR: ExprKind.NewBranch("@orexpr", BitwiseBinaryExpr), + token.XOR: ExprKind.NewBranch("@xorexpr", BitwiseBinaryExpr), + token.MUL: ExprKind.NewBranch("@mulexpr", ArithmeticBinaryExpr), + token.QUO: ExprKind.NewBranch("@quoexpr", ArithmeticBinaryExpr), + token.REM: ExprKind.NewBranch("@remexpr", ArithmeticBinaryExpr), + token.SHL: ExprKind.NewBranch("@shlexpr", ShiftExpr), + token.SHR: ExprKind.NewBranch("@shrexpr", ShiftExpr), + token.AND: ExprKind.NewBranch("@andexpr", BitwiseBinaryExpr), + token.AND_NOT: ExprKind.NewBranch("@andnotexpr", BitwiseBinaryExpr), +} + +// ChanTypeExprs is a map from channel type expressions to the corresponding AST node type +var ChanTypeExprs = map[ast.ChanDir]*BranchType{ + ast.SEND: ExprKind.NewBranch("@sendchantypeexpr", ChanTypeExpr), + ast.RECV: ExprKind.NewBranch("@recvchantypeexpr", ChanTypeExpr), + ast.SEND | ast.RECV: ExprKind.NewBranch("@sendrcvchantypeexpr", ChanTypeExpr), +} + +// ErrorExpr is an AST node type that is not used anywhere +var ErrorExpr = ExprKind.NewBranch("@errorexpr") + +// StmtKind is a case type for distinguishing different kinds of statement AST nodes +var StmtKind = NewCaseType(StmtType, "kind") + +// BadStmtType is the type of bad (that is, unparseable) statement AST nodes +var BadStmtType = StmtKind.NewBranch("@badstmt") + +// DeclStmtType is the type of declaration statement AST nodes +var DeclStmtType = StmtKind.NewBranch("@declstmt", DeclParentType) + +// EmptyStmtType is the type of empty statement AST nodes +var EmptyStmtType = StmtKind.NewBranch("@emptystmt") + +// LabeledStmtType is the type of labeled statement AST nodes +var LabeledStmtType = StmtKind.NewBranch("@labeledstmt") + +// ExprStmtType is the type of expressio statemement AST nodes +var ExprStmtType = StmtKind.NewBranch("@exprstmt") + +// SendStmtType is the type of send statement AST nodes +var SendStmtType = StmtKind.NewBranch("@sendstmt") + +// IncDecStmtType is the type of increment/decrement statement AST nodes +var IncDecStmtType = NewUnionType("@incdecstmt") + +// IncStmtType is the type of increment statement AST nodes +var IncStmtType = StmtKind.NewBranch("@incstmt", IncDecStmtType) + +// DecStmtType is the type of decrement statement AST nodes +var DecStmtType = StmtKind.NewBranch("@decstmt", IncDecStmtType) + +// AssignmentType is the type of assignment statement AST nodes +var AssignmentType = NewUnionType("@assignment") + +// SimpleAssignStmtType is the type of simple (i.e., non-compound) assignment statement AST nodes +var SimpleAssignStmtType = NewUnionType("@simpleassignstmt", AssignmentType) + +// CompoundAssignStmtType is the type of compound assignment statement AST nodes +var CompoundAssignStmtType = NewUnionType("@compoundassignstmt", AssignmentType) + +// GoStmtType is the type of go statement AST nodes +var GoStmtType = StmtKind.NewBranch("@gostmt") + +// DeferStmtType is the type of defer statement AST nodes +var DeferStmtType = StmtKind.NewBranch("@deferstmt") + +// ReturnStmtType is the type of return statement AST nodes +var ReturnStmtType = StmtKind.NewBranch("@returnstmt") + +// BranchStmtType is the type of branch statement AST nodes +var BranchStmtType = NewUnionType("@branchstmt") + +// BreakStmtType is the type of break statement AST nodes +var BreakStmtType = StmtKind.NewBranch("@breakstmt", BranchStmtType) + +// ContinueStmtType is the type of continue statement AST nodes +var ContinueStmtType = StmtKind.NewBranch("@continuestmt", BranchStmtType) + +// GotoStmtType is the type of goto statement AST nodes +var GotoStmtType = StmtKind.NewBranch("@gotostmt", BranchStmtType) + +// FallthroughStmtType is the type of fallthrough statement AST nodes +var FallthroughStmtType = StmtKind.NewBranch("@fallthroughstmt", BranchStmtType) + +// BlockStmtType is the type of block statement AST nodes +var BlockStmtType = StmtKind.NewBranch("@blockstmt", ScopeNodeType) + +// IfStmtType is the type of if statement AST nodes +var IfStmtType = StmtKind.NewBranch("@ifstmt", ScopeNodeType) + +// CaseClauseType is the type of case clause AST nodes +var CaseClauseType = StmtKind.NewBranch("@caseclause", ScopeNodeType) + +// SwitchStmtType is the type of switch statement AST nodes, covering both expression switch and type switch +var SwitchStmtType = NewUnionType("@switchstmt", ScopeNodeType) + +// ExprSwitchStmtType is the type of expression-switch statement AST nodes +var ExprSwitchStmtType = StmtKind.NewBranch("@exprswitchstmt", SwitchStmtType) + +// TypeSwitchStmtType is the type of type-switch statement AST nodes +var TypeSwitchStmtType = StmtKind.NewBranch("@typeswitchstmt", SwitchStmtType) + +// CommClauseType is the type of comm clause AST ndoes +var CommClauseType = StmtKind.NewBranch("@commclause", ScopeNodeType) + +// SelectStmtType is the type of select statement AST nodes +var SelectStmtType = StmtKind.NewBranch("@selectstmt") + +// LoopStmtType is the type of loop statement AST nodes (including for statements and range statements) +var LoopStmtType = NewUnionType("@loopstmt", ScopeNodeType) + +// ForStmtType is the type of for statement AST nodes +var ForStmtType = StmtKind.NewBranch("@forstmt", LoopStmtType) + +// RangeStmtType is the type of range statement AST nodes +var RangeStmtType = StmtKind.NewBranch("@rangestmt", LoopStmtType) + +// AssignStmtTypes is a map from assignmnt operator tokens to corresponding AST node types +var AssignStmtTypes = map[token.Token]*BranchType{ + token.ASSIGN: StmtKind.NewBranch("@assignstmt", SimpleAssignStmtType), + token.DEFINE: StmtKind.NewBranch("@definestmt", SimpleAssignStmtType), + token.ADD_ASSIGN: StmtKind.NewBranch("@addassignstmt", CompoundAssignStmtType), + token.SUB_ASSIGN: StmtKind.NewBranch("@subassignstmt", CompoundAssignStmtType), + token.MUL_ASSIGN: StmtKind.NewBranch("@mulassignstmt", CompoundAssignStmtType), + token.QUO_ASSIGN: StmtKind.NewBranch("@quoassignstmt", CompoundAssignStmtType), + token.REM_ASSIGN: StmtKind.NewBranch("@remassignstmt", CompoundAssignStmtType), + token.AND_ASSIGN: StmtKind.NewBranch("@andassignstmt", CompoundAssignStmtType), + token.OR_ASSIGN: StmtKind.NewBranch("@orassignstmt", CompoundAssignStmtType), + token.XOR_ASSIGN: StmtKind.NewBranch("@xorassignstmt", CompoundAssignStmtType), + token.SHL_ASSIGN: StmtKind.NewBranch("@shlassignstmt", CompoundAssignStmtType), + token.SHR_ASSIGN: StmtKind.NewBranch("@shrassignstmt", CompoundAssignStmtType), + token.AND_NOT_ASSIGN: StmtKind.NewBranch("@andnotassignstmt", CompoundAssignStmtType), +} + +// DeclKind is a case type for distinguishing different kinds of declaration AST nodes +var DeclKind = NewCaseType(DeclType, "kind") + +// BadDeclType is the type of bad (that is, unparseable) declaration AST nodes +var BadDeclType = DeclKind.NewBranch("@baddecl") + +// GenDeclType is the type of generic declaration AST nodes +var GenDeclType = NewUnionType("@gendecl", DocumentableType) + +// ImportDeclType is the type of import declaration AST nodes +var ImportDeclType = DeclKind.NewBranch("@importdecl", GenDeclType) + +// ConstDeclType is the type of constant declaration AST nodes +var ConstDeclType = DeclKind.NewBranch("@constdecl", GenDeclType) + +// TypeDeclType is the type of type declaration AST nodes +var TypeDeclType = DeclKind.NewBranch("@typedecl", GenDeclType) + +// VarDeclType is the type of variable declaration AST nodes +var VarDeclType = DeclKind.NewBranch("@vardecl", GenDeclType) + +// FuncDeclType is the type of function declaration AST nodes +var FuncDeclType = DeclKind.NewBranch("@funcdecl", DocumentableType, FuncDefType, TypeParamDeclParentType) + +// SpecKind is a case type for distinguishing different kinds of declaration specification nodes +var SpecKind = NewCaseType(SpecType, "kind") + +// ImportSpecType is the type of import declaration specification nodes +var ImportSpecType = SpecKind.NewBranch("@importspec") + +// ValueSpecType is the type of value declaration specification nodes +var ValueSpecType = SpecKind.NewBranch("@valuespec") + +// TypeSpecType is the type of type declaration specification nodes +var TypeSpecType = NewUnionType("@typespec", TypeParamDeclParentType) + +// TypeDefSpecType is the type of type declaration specification nodes corresponding to type definitions +var TypeDefSpecType = SpecKind.NewBranch("@typedefspec", TypeSpecType) + +// AliasSpecType is the type of type declaration specification nodes corresponding to alias declarations +var AliasSpecType = SpecKind.NewBranch("@aliasspec", TypeSpecType) + +// ObjectType is the type of objects (that is, declared entities) +var ObjectType = NewPrimaryKeyType("@object") + +// ObjectKind is a case type for distinguishing different kinds of built-in and declared objects +var ObjectKind = NewCaseType(ObjectType, "kind") + +// TypeParamParentObjectType is the type of objects that can have type parameters as children +var TypeParamParentObjectType = NewUnionType("@typeparamparentobject") + +// DeclObjectType is the type of declared objects +var DeclObjectType = NewUnionType("@declobject") + +// BuiltinObjectType is the type of built-in objects +var BuiltinObjectType = NewUnionType("@builtinobject") + +// PkgObjectType is the type of imported packages +var PkgObjectType = ObjectKind.NewBranch("@pkgobject") + +// TypeObjectType is the type of declared or built-in named types +var TypeObjectType = NewUnionType("@typeobject") + +// DeclTypeObjectType is the type of declared named types +var DeclTypeObjectType = ObjectKind.NewBranch("@decltypeobject", TypeObjectType, DeclObjectType, TypeParamParentObjectType) + +// BuiltinTypeObjectType is the type of built-in named types +var BuiltinTypeObjectType = ObjectKind.NewBranch("@builtintypeobject", TypeObjectType, BuiltinObjectType) + +// ValueObjectType is the type of declared or built-in variables or constants +var ValueObjectType = NewUnionType("@valueobject") + +// ConstObjectType is the type of declared or built-in constants +var ConstObjectType = NewUnionType("@constobject", ValueObjectType) + +// DeclConstObjectType is the type of declared constants +var DeclConstObjectType = ObjectKind.NewBranch("@declconstobject", ConstObjectType, DeclObjectType) + +// BuiltinConstObjectType is the type of built-in constants +var BuiltinConstObjectType = ObjectKind.NewBranch("@builtinconstobject", ConstObjectType, BuiltinObjectType) + +// VarObjectType is the type of declared or built-in variables (the latter do not currently exist) +var VarObjectType = NewUnionType("@varobject", ValueObjectType) + +// DeclVarObjectType is the type of declared variables including function parameters, results and struct fields +var DeclVarObjectType = ObjectKind.NewBranch("@declvarobject", VarObjectType, DeclObjectType) + +// FunctionObjectType is the type of declared or built-in functions +var FunctionObjectType = NewUnionType("@functionobject", ValueObjectType) + +// DeclFuncObjectType is the type of declared functions, including (abstract and concrete) methods +var DeclFuncObjectType = ObjectKind.NewBranch("@declfunctionobject", FunctionObjectType, DeclObjectType, TypeParamParentObjectType) + +// BuiltinFuncObjectType is the type of built-in functions +var BuiltinFuncObjectType = ObjectKind.NewBranch("@builtinfunctionobject", FunctionObjectType, BuiltinObjectType) + +// LabelObjectType is the type of statement labels +var LabelObjectType = ObjectKind.NewBranch("@labelobject") + +// ScopeType is the type of scopes +var ScopeType = NewPrimaryKeyType("@scope") + +// ScopeKind is a case type for distinguishing different kinds of scopes +var ScopeKind = NewCaseType(ScopeType, "kind") + +// UniverseScopeType is the type of the universe scope +var UniverseScopeType = ScopeKind.NewBranch("@universescope") + +// PackageScopeType is the type of package scopes +var PackageScopeType = ScopeKind.NewBranch("@packagescope") + +// LocalScopeType is the type of local (that is, non-universe, non-package) scopes +var LocalScopeType = ScopeKind.NewBranch("@localscope", LocatableType) + +// TypeKind is a case type for distinguishing different kinds of types +var TypeKind = NewCaseType(TypeType, "kind") + +// BasicType is the union of all basic types +var BasicType = NewUnionType("@basictype") + +// BoolType is the union of the normal and literal bool types +var BoolType = NewUnionType("@booltype", BasicType) + +// NumericType is the union of numeric types +var NumericType = NewUnionType("@numerictype", BasicType) + +// IntegerType is the union of integer types +var IntegerType = NewUnionType("@integertype", NumericType) + +// SignedIntegerType is the union of signed integer types +var SignedIntegerType = NewUnionType("@signedintegertype", IntegerType) + +// UnsignedIntegerType is the union of unsigned integer types +var UnsignedIntegerType = NewUnionType("@unsignedintegertype", IntegerType) + +// FloatType is the union of floating-point types +var FloatType = NewUnionType("@floattype", NumericType) + +// ComplexType is the union of complex types +var ComplexType = NewUnionType("@complextype", NumericType) + +// StringType is the union of the normal and literal string types +var StringType = NewUnionType("@stringtype", BasicType) + +// LiteralType is the union of literal types +var LiteralType = NewUnionType("@literaltype", BasicType) + +// BasicTypes is a map from basic type kinds to the corresponding entity types +var BasicTypes = map[gotypes.BasicKind]*BranchType{ + gotypes.Invalid: TypeKind.NewBranch("@invalidtype", BasicType), + gotypes.Bool: TypeKind.NewBranch("@boolexprtype", BoolType), + gotypes.Int: TypeKind.NewBranch("@inttype", SignedIntegerType), + gotypes.Int8: TypeKind.NewBranch("@int8type", SignedIntegerType), + gotypes.Int16: TypeKind.NewBranch("@int16type", SignedIntegerType), + gotypes.Int32: TypeKind.NewBranch("@int32type", SignedIntegerType), + gotypes.Int64: TypeKind.NewBranch("@int64type", SignedIntegerType), + gotypes.Uint: TypeKind.NewBranch("@uinttype", UnsignedIntegerType), + gotypes.Uint8: TypeKind.NewBranch("@uint8type", UnsignedIntegerType), + gotypes.Uint16: TypeKind.NewBranch("@uint16type", UnsignedIntegerType), + gotypes.Uint32: TypeKind.NewBranch("@uint32type", UnsignedIntegerType), + gotypes.Uint64: TypeKind.NewBranch("@uint64type", UnsignedIntegerType), + gotypes.Uintptr: TypeKind.NewBranch("@uintptrtype", UnsignedIntegerType), + gotypes.Float32: TypeKind.NewBranch("@float32type", FloatType), + gotypes.Float64: TypeKind.NewBranch("@float64type", FloatType), + gotypes.Complex64: TypeKind.NewBranch("@complex64type", ComplexType), + gotypes.Complex128: TypeKind.NewBranch("@complex128type", ComplexType), + gotypes.String: TypeKind.NewBranch("@stringexprtype", StringType), + gotypes.UnsafePointer: TypeKind.NewBranch("@unsafepointertype", BasicType), + gotypes.UntypedBool: TypeKind.NewBranch("@boolliteraltype", LiteralType, BoolType), + gotypes.UntypedInt: TypeKind.NewBranch("@intliteraltype", LiteralType, SignedIntegerType), + gotypes.UntypedRune: TypeKind.NewBranch("@runeliteraltype", LiteralType, SignedIntegerType), + gotypes.UntypedFloat: TypeKind.NewBranch("@floatliteraltype", LiteralType, FloatType), + gotypes.UntypedComplex: TypeKind.NewBranch("@complexliteraltype", LiteralType, ComplexType), + gotypes.UntypedString: TypeKind.NewBranch("@stringliteraltype", LiteralType, StringType), + gotypes.UntypedNil: TypeKind.NewBranch("@nilliteraltype", LiteralType), +} + +// CompositeType is the type of all composite (that is, non-basic) types +var CompositeType = NewUnionType("@compositetype") + +// TypeParamType is the type of type parameter types +var TypeParamType = TypeKind.NewBranch("@typeparamtype", CompositeType) + +// ElementContainerType is the type of types that have elements, such as arrays +// and channels +var ElementContainerType = NewUnionType("@containertype", CompositeType) + +// ArrayType is the type of array types +var ArrayType = TypeKind.NewBranch("@arraytype", ElementContainerType) + +// SliceType is the type of slice types +var SliceType = TypeKind.NewBranch("@slicetype", ElementContainerType) + +// StructType is the type of struct types +var StructType = TypeKind.NewBranch("@structtype", CompositeType) + +// PointerType is the type of pointer types +var PointerType = TypeKind.NewBranch("@pointertype", CompositeType) + +// InterfaceType is the type of interface types +var InterfaceType = TypeKind.NewBranch("@interfacetype", CompositeType) + +// TupleType is the type of tuple types +var TupleType = TypeKind.NewBranch("@tupletype", CompositeType) + +// SignatureType is the type of signature types +var SignatureType = TypeKind.NewBranch("@signaturetype", CompositeType) + +// MapType is the type of map types +var MapType = TypeKind.NewBranch("@maptype", ElementContainerType) + +// ChanType is the type of channel types +var ChanType = NewUnionType("@chantype", ElementContainerType) + +// ChanTypes is a map from channel type directions to the corresponding type +var ChanTypes = map[gotypes.ChanDir]*BranchType{ + gotypes.SendOnly: TypeKind.NewBranch("@sendchantype", ChanType), + gotypes.RecvOnly: TypeKind.NewBranch("@recvchantype", ChanType), + gotypes.SendRecv: TypeKind.NewBranch("@sendrcvchantype", ChanType), +} + +// NamedType is the type of named types +var NamedType = TypeKind.NewBranch("@namedtype", CompositeType) + +// TypeSetLiteral is the type of type set literals +var TypeSetLiteral = TypeKind.NewBranch("@typesetliteraltype", CompositeType) + +// PackageType is the type of packages +var PackageType = NewPrimaryKeyType("@package") + +// ModExprType is the type of go.mod expression nodes +var ModExprType = NewPrimaryKeyType("@modexpr", ModExprParentType, DocumentableType) + +// ModExprKind is a case type for distinguishing different kinds of go.mod expression nodes +var ModExprKind = NewCaseType(ModExprType, "kind") + +// ModCommentBlockType is the type of go.mod comment block AST nodes +var ModCommentBlockType = ModExprKind.NewBranch("@modcommentblock") + +// ModLineType is the type of go.mod line AST nodes +var ModLineType = ModExprKind.NewBranch("@modline") + +// ModLineBlockType is the type of go.mod line block AST nodes +var ModLineBlockType = ModExprKind.NewBranch("@modlineblock") + +// ModLParenType is the type of go.mod line block start AST nodes +var ModLParenType = ModExprKind.NewBranch("@modlparen") + +// ModRParenType is the type of go.mod line block end AST nodes +var ModRParenType = ModExprKind.NewBranch("@modrparen") + +// ErrorType is the type of frontend errors +var ErrorType = NewPrimaryKeyType("@error") + +// ErrorKind is a case type for distinguishing different kinds of frontend errors +var ErrorKind = NewCaseType(ErrorType, "kind") + +// ErrorTypes is a map from error kinds to the corresponding type +var ErrorTypes = map[packages.ErrorKind]*BranchType{ + packages.UnknownError: ErrorKind.NewBranch("@unknownerror"), + packages.ListError: ErrorKind.NewBranch("@listerror"), + packages.ParseError: ErrorKind.NewBranch("@parseerror"), + packages.TypeError: ErrorKind.NewBranch("@typeerror"), +} + +// ErrorTypes is a map from error kinds to the corresponding tag +var ErrorTags = map[packages.ErrorKind]string{ + packages.UnknownError: "@unknownerror", + packages.ListError: "@listerror", + packages.ParseError: "@parseerror", + packages.TypeError: "@typeerror", +} + +// LocationsDefaultTable is the table defining location objects +var LocationsDefaultTable = NewTable("locations_default", + EntityColumn(LocationDefaultType, "id").Key(), + EntityColumn(FileType, "file"), + IntColumn("beginLine"), + IntColumn("beginColumn"), + IntColumn("endLine"), + IntColumn("endColumn"), +) + +// NumlinesTable is the table containing LoC information +var NumlinesTable = NewTable("numlines", + EntityColumn(SourceLineType, "element_id"), + IntColumn("num_lines"), + IntColumn("num_code"), + IntColumn("num_comment"), +) + +// FilesTable is the table defining file nodes +var FilesTable = NewTable("files", + EntityColumn(FileType, "id").Key(), + StringColumn("name"), +) + +// FoldersTable is the table defining folder entities +var FoldersTable = NewTable("folders", + EntityColumn(FolderType, "id").Key(), + StringColumn("name"), +) + +// ContainerParentTable is the table defining the parent-child relation among container entities +var ContainerParentTable = NewTable("containerparent", + EntityColumn(ContainerType, "parent"), + EntityColumn(ContainerType, "child").Unique(), +) + +// HasLocationTable is the table associating entities with their locations +var HasLocationTable = NewTable("has_location", + EntityColumn(LocatableType, "locatable").Unique(), + EntityColumn(LocationType, "location"), +) + +// CommentGroupsTable is the table defining comment group entities +var CommentGroupsTable = NewTable("comment_groups", + EntityColumn(CommentGroupType, "id").Key(), + EntityColumn(FileType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// CommentsTable is the table defining comment entities +var CommentsTable = NewTable("comments", + EntityColumn(CommentType, "id").Key(), + IntColumn("kind"), + EntityColumn(CommentGroupType, "parent"), + IntColumn("idx"), + StringColumn("text"), +) + +// DocCommentsTable is the table associating doc comments with the nodes they document +var DocCommentsTable = NewTable("doc_comments", + EntityColumn(DocumentableType, "node").Unique(), + EntityColumn(CommentGroupType, "comment"), +) + +// ExprsTable is the table defining expression AST nodes +var ExprsTable = NewTable("exprs", + EntityColumn(ExprType, "id").Key(), + IntColumn("kind"), + EntityColumn(ExprParentType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// LiteralsTable is the table associating literal expression AST nodes with their values +var LiteralsTable = NewTable("literals", + EntityColumn(ExprType, "expr").Unique(), + StringColumn("value"), + StringColumn("raw"), +) + +// ConstValuesTable is the table associating constant expressions with their values +var ConstValuesTable = NewTable("constvalues", + EntityColumn(ExprType, "expr").Unique(), + StringColumn("value"), + StringColumn("exact"), +) + +// FieldsTable is the table defining field AST nodes +var FieldsTable = NewTable("fields", + EntityColumn(FieldType, "id").Key(), + EntityColumn(FieldParentType, "parent"), + IntColumn("idx"), +) + +// TypeParamDeclsTable is the table defining type param declaration AST nodes +var TypeParamDeclsTable = NewTable("typeparamdecls", + EntityColumn(TypeParamDeclType, "id").Key(), + EntityColumn(TypeParamDeclParentType, "parent"), + IntColumn("idx"), +) + +// StmtsTable is the table defining statement AST nodes +var StmtsTable = NewTable("stmts", + EntityColumn(StmtType, "id").Key(), + IntColumn("kind"), + EntityColumn(StmtParentType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// DeclsTable is the table defining declaration AST nodes +var DeclsTable = NewTable("decls", + EntityColumn(DeclType, "id").Key(), + IntColumn("kind"), + EntityColumn(DeclParentType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// SpecsTable is the table defining declaration specification AST nodes +var SpecsTable = NewTable("specs", + EntityColumn(SpecType, "id").Key(), + IntColumn("kind"), + EntityColumn(GenDeclType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// ScopesTable is the table defining scopes +var ScopesTable = NewTable("scopes", + EntityColumn(ScopeType, "id").Key(), + IntColumn("kind"), +) + +// ScopeNestingTable is the table describing scope nesting +var ScopeNestingTable = NewTable("scopenesting", + EntityColumn(ScopeType, "inner").Unique(), + EntityColumn(ScopeType, "outer"), +) + +// ScopeNodesTable is the table associating local scopes with the AST nodes that induce them +var ScopeNodesTable = NewTable("scopenodes", + EntityColumn(ScopeNodeType, "node").Unique(), + EntityColumn(LocalScopeType, "scope"), +) + +// ObjectsTable is the table describing objects (that is, declared entities) +var ObjectsTable = NewTable("objects", + EntityColumn(ObjectType, "id").Key(), + IntColumn("kind"), + StringColumn("name"), +) + +// ObjectScopesTable is the table describing the scope to which an object belongs (if any) +var ObjectScopesTable = NewTable("objectscopes", + EntityColumn(ObjectType, "object").Unique(), + EntityColumn(ScopeType, "scope"), +) + +// ObjectTypesTable is the table describing the type of an object (if any) +var ObjectTypesTable = NewTable("objecttypes", + EntityColumn(ObjectType, "object").Unique(), + EntityColumn(TypeType, "tp"), +) + +// MethodReceiversTable maps methods to their receiver +var MethodReceiversTable = NewTable("methodreceivers", + EntityColumn(ObjectType, "method").Unique(), + EntityColumn(ObjectType, "receiver"), +) + +// FieldStructsTable maps fields to the structs they are in +var FieldStructsTable = NewTable("fieldstructs", + EntityColumn(ObjectType, "field").Unique(), + EntityColumn(StructType, "struct"), +) + +// MethodHostsTable maps interface methods to the named type they belong to +var MethodHostsTable = NewTable("methodhosts", + EntityColumn(ObjectType, "method"), + EntityColumn(NamedType, "host"), +) + +// DefsTable maps identifiers to the objects they define +var DefsTable = NewTable("defs", + EntityColumn(IdentExpr, "ident"), + EntityColumn(ObjectType, "object"), +) + +// UsesTable maps identifiers to the objects they denote +var UsesTable = NewTable("uses", + EntityColumn(IdentExpr, "ident"), + EntityColumn(ObjectType, "object"), +) + +// TypesTable is the table describing types +var TypesTable = NewTable("types", + EntityColumn(TypeType, "id").Key(), + IntColumn("kind"), +) + +// TypeOfTable is the table associating expressions with their types (if known) +var TypeOfTable = NewTable("type_of", + EntityColumn(ExprType, "expr").Unique(), + EntityColumn(TypeType, "tp"), +) + +// TypeNameTable is the table associating named types with their names +var TypeNameTable = NewTable("typename", + EntityColumn(TypeType, "tp").Unique(), + StringColumn("name"), +) + +// KeyTypeTable is the table associating maps with their key type +var KeyTypeTable = NewTable("key_type", + EntityColumn(MapType, "map").Unique(), + EntityColumn(TypeType, "tp"), +) + +// ElementTypeTable is the table associating container types with their element +// type +var ElementTypeTable = NewTable("element_type", + EntityColumn(ElementContainerType, "container").Unique(), + EntityColumn(TypeType, "tp"), +) + +// BaseTypeTable is the table associating pointer types with their base type +var BaseTypeTable = NewTable("base_type", + EntityColumn(PointerType, "ptr").Unique(), + EntityColumn(TypeType, "tp"), +) + +// UnderlyingTypeTable is the table associating named types with their +// underlying type +var UnderlyingTypeTable = NewTable("underlying_type", + EntityColumn(NamedType, "named").Unique(), + EntityColumn(TypeType, "tp"), +) + +// ComponentTypesTable is the table associating composite types with their component types +var ComponentTypesTable = NewTable("component_types", + EntityColumn(CompositeType, "parent"), + IntColumn("index"), + StringColumn("name"), + EntityColumn(TypeType, "tp"), +).KeySet("parent", "index") + +// ArrayLengthTable is the table associating array types with their length (represented as a string +// since Go array lengths are 64-bit and hence do not always fit into a QL integer) +var ArrayLengthTable = NewTable("array_length", + EntityColumn(ArrayType, "tp").Unique(), + StringColumn("len"), +) + +// TypeObjectTable maps types to their corresponding objects, if any +var TypeObjectTable = NewTable("type_objects", + EntityColumn(TypeType, "tp").Unique(), + EntityColumn(ObjectType, "object"), +) + +// PackagesTable is the table describing packages +var PackagesTable = NewTable("packages", + EntityColumn(PackageType, "id").Key(), + StringColumn("name"), + StringColumn("path"), + EntityColumn(PackageScopeType, "scope"), +) + +// ModExprsTable is the table defining expression AST nodes for go.mod files +var ModExprsTable = NewTable("modexprs", + EntityColumn(ModExprType, "id").Key(), + IntColumn("kind"), + EntityColumn(ModExprParentType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// ModTokensTable is the table associating go.mod tokens with their Line or LineBlock +var ModTokensTable = NewTable("modtokens", + StringColumn("token"), + EntityColumn(ModExprType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") + +// ErrorsTable is the table describing frontend errors +var ErrorsTable = NewTable("errors", + EntityColumn(ErrorType, "id").Key(), + IntColumn("kind"), + StringColumn("msg"), + StringColumn("rawpos"), + StringColumn("file"), + IntColumn("line"), + IntColumn("col"), + EntityColumn(PackageType, "package"), + IntColumn("idx"), +).KeySet("package", "idx") + +// HasEllipsisTable is the table containing all call expressions that have ellipses +var HasEllipsisTable = NewTable("has_ellipsis", + EntityColumn(CallOrConversionExpr, "id"), +) + +// VariadicTable is the table describing which functions are variadic +var VariadicTable = NewTable("variadic", + EntityColumn(SignatureType, "id"), +) + +// TypeParamTable is the table describing type parameter types +var TypeParamTable = NewTable("typeparam", + EntityColumn(TypeParamType, "tp").Unique(), + StringColumn("name"), + EntityColumn(CompositeType, "bound"), + EntityColumn(TypeParamParentObjectType, "parent"), + IntColumn("idx"), +).KeySet("parent", "idx") diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go new file mode 100644 index 00000000000..1be2bfef224 --- /dev/null +++ b/go/extractor/extractor.go @@ -0,0 +1,2021 @@ +package extractor + +import ( + "crypto/md5" + "encoding/hex" + "fmt" + "go/ast" + "go/constant" + "go/scanner" + "go/token" + "go/types" + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + "regexp" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "github.com/github/codeql-go/extractor/dbscheme" + "github.com/github/codeql-go/extractor/srcarchive" + "github.com/github/codeql-go/extractor/trap" + "github.com/github/codeql-go/extractor/util" + "golang.org/x/tools/go/packages" +) + +var MaxGoRoutines int +var typeParamParent map[*types.TypeParam]types.Object = make(map[*types.TypeParam]types.Object) + +func init() { + // this sets the number of threads that the Go runtime will spawn; this is separate + // from the number of goroutines that the program spawns, which are scheduled into + // the system threads by the Go runtime scheduler + threads := os.Getenv("LGTM_THREADS") + if maxprocs, err := strconv.Atoi(threads); err == nil && maxprocs > 0 { + log.Printf("Max threads set to %d", maxprocs) + runtime.GOMAXPROCS(maxprocs) + } else if threads != "" { + log.Printf("Warning: LGTM_THREADS value %s is not valid, defaulting to using all available threads.", threads) + } + // if the value is empty or not set, use the Go default, which is the number of cores + // available since Go 1.5, but is subject to change + + var err error + if MaxGoRoutines, err = strconv.Atoi(util.Getenv( + "CODEQL_EXTRACTOR_GO_MAX_GOROUTINES", + "SEMMLE_MAX_GOROUTINES", + )); err != nil { + MaxGoRoutines = 32 + } else { + log.Printf("Max goroutines set to %d", MaxGoRoutines) + } +} + +// Extract extracts the packages specified by the given patterns +func Extract(patterns []string) error { + return ExtractWithFlags(nil, patterns) +} + +// ExtractWithFlags extracts the packages specified by the given patterns and build flags +func ExtractWithFlags(buildFlags []string, patterns []string) error { + startTime := time.Now() + + extraction := NewExtraction(buildFlags, patterns) + defer extraction.StatWriter.Close() + + modEnabled := os.Getenv("GO111MODULE") != "off" + if !modEnabled { + log.Println("Go module mode disabled.") + } + + modFlags := make([]string, 0, 1) + for _, flag := range buildFlags { + if strings.HasPrefix(flag, "-mod=") { + modFlags = append(modFlags, flag) + } + } + + log.Println("Running packages.Load.") + cfg := &packages.Config{ + Mode: packages.NeedName | packages.NeedFiles | + packages.NeedCompiledGoFiles | + packages.NeedImports | packages.NeedDeps | + packages.NeedTypes | packages.NeedTypesSizes | + packages.NeedTypesInfo | packages.NeedSyntax, + BuildFlags: buildFlags, + } + pkgs, err := packages.Load(cfg, patterns...) + if err != nil { + return err + } + log.Println("Done running packages.Load.") + + if len(pkgs) == 0 { + log.Println("No packages found.") + } + + log.Println("Extracting universe scope.") + extractUniverseScope() + log.Println("Done extracting universe scope.") + + // a map of package path to package root directory (currently the module root or the source directory) + pkgRoots := make(map[string]string) + // a map of package path to source code directory + pkgDirs := make(map[string]string) + // root directories of packages that we want to extract + wantedRoots := make(map[string]bool) + + // Do a post-order traversal and extract the package scope of each package + packages.Visit(pkgs, func(pkg *packages.Package) bool { + return true + }, func(pkg *packages.Package) { + log.Printf("Processing package %s.", pkg.PkgPath) + + if _, ok := pkgRoots[pkg.PkgPath]; !ok { + mdir := util.GetModDir(pkg.PkgPath, modFlags...) + pdir := util.GetPkgDir(pkg.PkgPath, modFlags...) + // GetModDir returns the empty string if the module directory cannot be determined, e.g. if the package + // is not using modules. If this is the case, fall back to the package directory + if mdir == "" { + mdir = pdir + } + pkgRoots[pkg.PkgPath] = mdir + pkgDirs[pkg.PkgPath] = pdir + } + + log.Printf("Extracting types for package %s.", pkg.PkgPath) + + tw, err := trap.NewWriter(pkg.PkgPath, pkg) + if err != nil { + log.Fatal(err) + } + defer tw.Close() + + scope := extractPackageScope(tw, pkg) + extractObjectTypes(tw) + lbl := tw.Labeler.GlobalID(util.EscapeTrapSpecialChars(pkg.PkgPath) + ";pkg") + dbscheme.PackagesTable.Emit(tw, lbl, pkg.Name, pkg.PkgPath, scope) + + if len(pkg.Errors) != 0 { + log.Printf("Warning: encountered errors extracting package `%s`:", pkg.PkgPath) + for i, err := range pkg.Errors { + log.Printf(" %s", err.Error()) + extraction.extractError(tw, err, lbl, i) + } + } + log.Printf("Done extracting types for package %s.", pkg.PkgPath) + }) + + for _, pkg := range pkgs { + if pkgRoots[pkg.PkgPath] == "" { + log.Fatalf("Unable to get a source directory for input package %s.", pkg.PkgPath) + } + wantedRoots[pkgRoots[pkg.PkgPath]] = true + wantedRoots[pkgDirs[pkg.PkgPath]] = true + } + + log.Println("Done processing dependencies.") + + log.Println("Starting to extract packages.") + + sep := regexp.QuoteMeta(string(filepath.Separator)) + // if a path matches this regexp, we don't want to extract this package. Currently, it checks + // - that the path does not contain a `..` segment, and + // - the path does not contain a `vendor` directory. + noExtractRe := regexp.MustCompile(`.*(^|` + sep + `)(\.\.|vendor)($|` + sep + `).*`) + + // extract AST information for all packages + packages.Visit(pkgs, func(pkg *packages.Package) bool { + return true + }, func(pkg *packages.Package) { + for root, _ := range wantedRoots { + relDir, err := filepath.Rel(root, pkgDirs[pkg.PkgPath]) + if err != nil || noExtractRe.MatchString(relDir) { + // if the path can't be made relative or matches the noExtract regexp skip it + continue + } + + extraction.extractPackage(pkg) + + if pkgRoots[pkg.PkgPath] != "" { + modPath := filepath.Join(pkgRoots[pkg.PkgPath], "go.mod") + if util.FileExists(modPath) { + log.Printf("Extracting %s", modPath) + start := time.Now() + + err := extraction.extractGoMod(modPath) + if err != nil { + log.Printf("Failed to extract go.mod: %s", err.Error()) + } + + end := time.Since(start) + log.Printf("Done extracting %s (%dms)", modPath, end.Nanoseconds()/1000000) + } + } + + return + } + + log.Printf("Skipping dependency package %s.", pkg.PkgPath) + }) + + extraction.WaitGroup.Wait() + + log.Println("Done extracting packages.") + + t := time.Now() + elapsed := t.Sub(startTime) + dbscheme.CompilationFinishedTable.Emit(extraction.StatWriter, extraction.Label, 0.0, elapsed.Seconds()) + + return nil +} + +type Extraction struct { + // A lock for preventing concurrent writes to maps and the stat trap writer, as they are not + // thread-safe + Lock sync.Mutex + LabelKey string + Label trap.Label + StatWriter *trap.Writer + WaitGroup sync.WaitGroup + GoroutineSem *semaphore + FdSem *semaphore + NextFileId int + FileInfo map[string]*FileInfo + SeenGoMods map[string]bool +} + +type FileInfo struct { + Idx int + NextErr int +} + +func (extraction *Extraction) SeenFile(path string) bool { + _, ok := extraction.FileInfo[path] + return ok +} + +func (extraction *Extraction) GetFileInfo(path string) *FileInfo { + if fileInfo, ok := extraction.FileInfo[path]; ok { + return fileInfo + } + + extraction.FileInfo[path] = &FileInfo{extraction.NextFileId, 0} + extraction.NextFileId += 1 + + return extraction.FileInfo[path] +} + +func (extraction *Extraction) GetFileIdx(path string) int { + return extraction.GetFileInfo(path).Idx +} + +func (extraction *Extraction) GetNextErr(path string) int { + finfo := extraction.GetFileInfo(path) + res := finfo.NextErr + finfo.NextErr += 1 + return res +} + +func NewExtraction(buildFlags []string, patterns []string) *Extraction { + hash := md5.New() + io.WriteString(hash, "go") + for _, buildFlag := range buildFlags { + io.WriteString(hash, " "+buildFlag) + } + io.WriteString(hash, " --") + for _, pattern := range patterns { + io.WriteString(hash, " "+pattern) + } + sum := hash.Sum(nil) + + i := 0 + var path string + // split compilation files into directories to avoid filling a single directory with too many files + pathFmt := fmt.Sprintf("compilations/%s/%s_%%d", hex.EncodeToString(sum[:1]), hex.EncodeToString(sum[1:])) + for { + path = fmt.Sprintf(pathFmt, i) + file, err := trap.FileFor(path) + if err != nil { + log.Fatalf("Error creating trap file: %s\n", err.Error()) + } + i++ + + if !util.FileExists(file) { + break + } + } + + statWriter, err := trap.NewWriter(path, nil) + if err != nil { + log.Fatal(err) + } + lblKey := fmt.Sprintf("%s_%d;compilation", hex.EncodeToString(sum), i) + lbl := statWriter.Labeler.GlobalID(lblKey) + + wd, err := os.Getwd() + if err != nil { + log.Fatalf("Unable to determine current directory: %s\n", err.Error()) + } + + dbscheme.CompilationsTable.Emit(statWriter, lbl, wd) + i = 0 + extractorPath, err := util.GetExtractorPath() + if err != nil { + log.Fatalf("Unable to get extractor path: %s\n", err.Error()) + } + dbscheme.CompilationArgsTable.Emit(statWriter, lbl, 0, extractorPath) + i++ + for _, flag := range buildFlags { + dbscheme.CompilationArgsTable.Emit(statWriter, lbl, i, flag) + i++ + } + // emit a fake "--" argument to make it clear that what comes after it are patterns + dbscheme.CompilationArgsTable.Emit(statWriter, lbl, i, "--") + i++ + for _, pattern := range patterns { + dbscheme.CompilationArgsTable.Emit(statWriter, lbl, i, pattern) + i++ + } + + return &Extraction{ + LabelKey: lblKey, + Label: lbl, + StatWriter: statWriter, + // this semaphore is used to limit the number of files that are open at once; + // this is to prevent the extractor from running into issues with caps on the + // number of open files that can be held by one process + FdSem: newSemaphore(100), + // this semaphore is used to limit the number of goroutines spawned, so we + // don't run into memory issues + GoroutineSem: newSemaphore(MaxGoRoutines), + NextFileId: 0, + FileInfo: make(map[string]*FileInfo), + SeenGoMods: make(map[string]bool), + } +} + +// extractUniverseScope extracts symbol table information for the universe scope +func extractUniverseScope() { + tw, err := trap.NewWriter("universe", nil) + if err != nil { + log.Fatal(err) + } + defer tw.Close() + + lbl := tw.Labeler.ScopeID(types.Universe, nil) + dbscheme.ScopesTable.Emit(tw, lbl, dbscheme.UniverseScopeType.Index()) + extractObjects(tw, types.Universe, lbl) + + // Always extract an empty interface type + extractType(tw, types.NewInterfaceType([]*types.Func{}, []types.Type{})) +} + +// extractObjects extracts all objects declared in the given scope +func extractObjects(tw *trap.Writer, scope *types.Scope, scopeLabel trap.Label) { + for _, name := range scope.Names() { + obj := scope.Lookup(name) + lbl, exists := tw.Labeler.ScopedObjectID(obj, func() trap.Label { return extractType(tw, obj.Type()) }) + if !exists { + // Populate type parameter parents for functions. Note that methods + // do not appear as objects in any scope, so they have to be dealt + // with separately in extractMethods. + if funcObj, ok := obj.(*types.Func); ok { + populateTypeParamParents(tw, funcObj.Type().(*types.Signature).TypeParams(), obj) + populateTypeParamParents(tw, funcObj.Type().(*types.Signature).RecvTypeParams(), obj) + } + // Populate type parameter parents for named types. Note that we + // skip type aliases as the original type should be the parent + // of any type parameters. + if typeNameObj, ok := obj.(*types.TypeName); ok && !typeNameObj.IsAlias() { + if tp, ok := typeNameObj.Type().(*types.Named); ok { + populateTypeParamParents(tw, tp.TypeParams(), obj) + } + } + extractObject(tw, obj, lbl) + } + + if obj.Parent() != scope { + // this can happen if a scope is embedded into another with a `.` import. + continue + } + dbscheme.ObjectScopesTable.Emit(tw, lbl, scopeLabel) + } +} + +// extractMethod extracts a method `meth` and emits it to the objects table, then returns its label +func extractMethod(tw *trap.Writer, meth *types.Func) trap.Label { + // get the receiver type of the method + recvtyp := meth.Type().(*types.Signature).Recv().Type() + // ensure receiver type has been extracted + recvtyplbl := extractType(tw, recvtyp) + + // if the method label does not exist, extract it + methlbl, exists := tw.Labeler.MethodID(meth, recvtyplbl) + if !exists { + // Populate type parameter parents for methods. They do not appear as + // objects in any scope, so they have to be dealt with separately here. + populateTypeParamParents(tw, meth.Type().(*types.Signature).TypeParams(), meth) + populateTypeParamParents(tw, meth.Type().(*types.Signature).RecvTypeParams(), meth) + extractObject(tw, meth, methlbl) + } + + return methlbl +} + +// extractObject extracts a single object and emits it to the objects table. +func extractObject(tw *trap.Writer, obj types.Object, lbl trap.Label) { + name := obj.Name() + isBuiltin := obj.Parent() == types.Universe + var kind int + switch obj.(type) { + case *types.PkgName: + kind = dbscheme.PkgObjectType.Index() + case *types.TypeName: + if isBuiltin { + kind = dbscheme.BuiltinTypeObjectType.Index() + } else { + kind = dbscheme.DeclTypeObjectType.Index() + } + case *types.Const: + if isBuiltin { + kind = dbscheme.BuiltinConstObjectType.Index() + } else { + kind = dbscheme.DeclConstObjectType.Index() + } + case *types.Nil: + kind = dbscheme.BuiltinConstObjectType.Index() + case *types.Var: + kind = dbscheme.DeclVarObjectType.Index() + case *types.Builtin: + kind = dbscheme.BuiltinFuncObjectType.Index() + case *types.Func: + kind = dbscheme.DeclFuncObjectType.Index() + case *types.Label: + kind = dbscheme.LabelObjectType.Index() + default: + log.Fatalf("unknown object of type %T", obj) + } + dbscheme.ObjectsTable.Emit(tw, lbl, kind, name) + + // for methods, additionally extract information about the receiver + if sig, ok := obj.Type().(*types.Signature); ok { + if recv := sig.Recv(); recv != nil { + recvlbl, exists := tw.Labeler.ReceiverObjectID(recv, lbl) + if !exists { + extractObject(tw, recv, recvlbl) + } + dbscheme.MethodReceiversTable.Emit(tw, lbl, recvlbl) + } + } +} + +// extractObjectTypes extracts type and receiver information for all objects +func extractObjectTypes(tw *trap.Writer) { + // calling `extractType` on a named type will extract all methods defined + // on it, which will add new objects. Therefore we need to do this first + // before we loops over all objects and emit them. + changed := true + for changed { + changed = tw.ForEachObject(extractObjectType) + } + changed = tw.ForEachObject(emitObjectType) + if changed { + log.Printf("Warning: more objects were labeled while emitted object types") + } +} + +// extractObjectType extracts type and receiver information for a given object +func extractObjectType(tw *trap.Writer, obj types.Object, lbl trap.Label) { + if tp := obj.Type(); tp != nil { + extractType(tw, tp) + } +} + +// emitObjectType emits the type information for a given object +func emitObjectType(tw *trap.Writer, obj types.Object, lbl trap.Label) { + if tp := obj.Type(); tp != nil { + dbscheme.ObjectTypesTable.Emit(tw, lbl, extractType(tw, tp)) + } +} + +var ( + // file:line:col + threePartPos = regexp.MustCompile(`^(.+):(\d+):(\d+)$`) + // file:line + twoPartPos = regexp.MustCompile(`^(.+):(\d+)$`) +) + +// extractError extracts the message and location of a frontend error +func (extraction *Extraction) extractError(tw *trap.Writer, err packages.Error, pkglbl trap.Label, idx int) { + var ( + lbl = tw.Labeler.FreshID() + tag = dbscheme.ErrorTags[err.Kind] + kind = dbscheme.ErrorTypes[err.Kind].Index() + pos = err.Pos + file = "" + line, col int + e error + ) + + if pos == "" || pos == "-" { + // extract a dummy file + wd, e := os.Getwd() + if e != nil { + wd = "." + log.Printf("Warning: failed to get working directory") + } + ewd, e := filepath.EvalSymlinks(wd) + if e != nil { + ewd = wd + log.Printf("Warning: failed to evaluate symlinks for %s", wd) + } + file = filepath.Join(ewd, "-") + } else { + var rawfile string + if parts := threePartPos.FindStringSubmatch(pos); parts != nil { + // "file:line:col" + col, e = strconv.Atoi(parts[3]) + if e != nil { + log.Printf("Warning: malformed column number `%s`: %v", parts[3], e) + } + line, e = strconv.Atoi(parts[2]) + if e != nil { + log.Printf("Warning: malformed line number `%s`: %v", parts[2], e) + } + rawfile = parts[1] + } else if parts := twoPartPos.FindStringSubmatch(pos); parts != nil { + // "file:line" + line, e = strconv.Atoi(parts[2]) + if e != nil { + log.Printf("Warning: malformed line number `%s`: %v", parts[2], e) + } + rawfile = parts[1] + } else if pos != "" && pos != "-" { + log.Printf("Warning: malformed error position `%s`", pos) + } + afile, e := filepath.Abs(rawfile) + if e != nil { + log.Printf("Warning: failed to get absolute path for for %s", file) + afile = file + } + file, e = filepath.EvalSymlinks(afile) + if e != nil { + log.Printf("Warning: failed to evaluate symlinks for %s", afile) + file = afile + } + + extraction.extractFileInfo(tw, file) + } + + extraction.Lock.Lock() + flbl := extraction.StatWriter.Labeler.FileLabelFor(file) + diagLbl := extraction.StatWriter.Labeler.FreshID() + dbscheme.DiagnosticsTable.Emit( + extraction.StatWriter, diagLbl, 1, tag, err.Msg, err.Msg, + emitLocation(extraction.StatWriter, flbl, line, col, line, col)) + dbscheme.DiagnosticForTable.Emit(extraction.StatWriter, diagLbl, extraction.Label, extraction.GetFileIdx(file), extraction.GetNextErr(file)) + extraction.Lock.Unlock() + transformed := filepath.ToSlash(srcarchive.TransformPath(file)) + dbscheme.ErrorsTable.Emit(tw, lbl, kind, err.Msg, pos, transformed, line, col, pkglbl, idx) +} + +// extractPackage extracts AST information for all files in the given package +func (extraction *Extraction) extractPackage(pkg *packages.Package) { + for _, astFile := range pkg.Syntax { + extraction.WaitGroup.Add(1) + extraction.GoroutineSem.acquire(1) + go func(astFile *ast.File) { + err := extraction.extractFile(astFile, pkg) + if err != nil { + log.Fatal(err) + } + extraction.GoroutineSem.release(1) + extraction.WaitGroup.Done() + }(astFile) + } +} + +// normalizedPath computes the normalized path (with symlinks resolved) for the given file +func normalizedPath(ast *ast.File, fset *token.FileSet) string { + file := fset.File(ast.Package).Name() + path, err := filepath.EvalSymlinks(file) + if err != nil { + return file + } + return path +} + +// extractFile extracts AST information for the given file +func (extraction *Extraction) extractFile(ast *ast.File, pkg *packages.Package) error { + fset := pkg.Fset + if ast.Package == token.NoPos { + log.Printf("Skipping extracting a file without a 'package' declaration") + return nil + } + path := normalizedPath(ast, fset) + + extraction.FdSem.acquire(3) + + log.Printf("Extracting %s", path) + start := time.Now() + + defer extraction.FdSem.release(1) + tw, err := trap.NewWriter(path, pkg) + if err != nil { + extraction.FdSem.release(2) + return err + } + defer tw.Close() + + err = srcarchive.Add(path) + extraction.FdSem.release(2) + if err != nil { + return err + } + + extraction.extractFileInfo(tw, path) + + extractScopes(tw, ast, pkg) + + extractFileNode(tw, ast) + + extractObjectTypes(tw) + + extractNumLines(tw, path, ast) + + end := time.Since(start) + log.Printf("Done extracting %s (%dms)", path, end.Nanoseconds()/1000000) + + return nil +} + +// extractFileInfo extracts file-system level information for the given file, populating +// the `files` and `containerparent` tables +func (extraction *Extraction) extractFileInfo(tw *trap.Writer, file string) { + // We may visit the same file twice because `extractError` calls this function to describe files containing + // compilation errors. It is also called for user source files being extracted. + extraction.Lock.Lock() + if extraction.SeenFile(file) { + extraction.Lock.Unlock() + return + } + extraction.Lock.Unlock() + + path := filepath.ToSlash(srcarchive.TransformPath(file)) + components := strings.Split(path, "/") + parentPath := "" + var parentLbl trap.Label + + for i, component := range components { + if i == 0 { + if component == "" { + path = "/" + } else { + path = component + } + } else { + path = parentPath + "/" + component + } + if i == len(components)-1 { + lbl := tw.Labeler.FileLabelFor(file) + dbscheme.FilesTable.Emit(tw, lbl, path) + dbscheme.ContainerParentTable.Emit(tw, parentLbl, lbl) + dbscheme.HasLocationTable.Emit(tw, lbl, emitLocation(tw, lbl, 0, 0, 0, 0)) + extraction.Lock.Lock() + slbl := extraction.StatWriter.Labeler.FileLabelFor(file) + dbscheme.CompilationCompilingFilesTable.Emit(extraction.StatWriter, extraction.Label, extraction.GetFileIdx(file), slbl) + extraction.Lock.Unlock() + break + } + lbl := tw.Labeler.GlobalID(util.EscapeTrapSpecialChars(path) + ";folder") + dbscheme.FoldersTable.Emit(tw, lbl, path) + if i > 0 { + dbscheme.ContainerParentTable.Emit(tw, parentLbl, lbl) + } + if path != "/" { + parentPath = path + } + parentLbl = lbl + } +} + +// extractLocation emits a location entity for the given entity +func extractLocation(tw *trap.Writer, entity trap.Label, sl int, sc int, el int, ec int) { + filelbl := tw.Labeler.FileLabel() + dbscheme.HasLocationTable.Emit(tw, entity, emitLocation(tw, filelbl, sl, sc, el, ec)) +} + +// emitLocation emits a location entity +func emitLocation(tw *trap.Writer, filelbl trap.Label, sl int, sc int, el int, ec int) trap.Label { + locLbl := tw.Labeler.GlobalID(fmt.Sprintf("loc,{%s},%d,%d,%d,%d", filelbl, sl, sc, el, ec)) + dbscheme.LocationsDefaultTable.Emit(tw, locLbl, filelbl, sl, sc, el, ec) + + return locLbl +} + +// extractNodeLocation extracts location information for the given node +func extractNodeLocation(tw *trap.Writer, nd ast.Node, lbl trap.Label) { + if nd == nil { + return + } + fset := tw.Package.Fset + start, end := fset.Position(nd.Pos()), fset.Position(nd.End()) + extractLocation(tw, lbl, start.Line, start.Column, end.Line, end.Column-1) +} + +// extractPackageScope extracts symbol table information for the given package +func extractPackageScope(tw *trap.Writer, pkg *packages.Package) trap.Label { + pkgScope := pkg.Types.Scope() + pkgScopeLabel := tw.Labeler.ScopeID(pkgScope, pkg.Types) + dbscheme.ScopesTable.Emit(tw, pkgScopeLabel, dbscheme.PackageScopeType.Index()) + dbscheme.ScopeNestingTable.Emit(tw, pkgScopeLabel, tw.Labeler.ScopeID(types.Universe, nil)) + extractObjects(tw, pkgScope, pkgScopeLabel) + return pkgScopeLabel +} + +// extractScopeLocation extracts location information for the given scope +func extractScopeLocation(tw *trap.Writer, scope *types.Scope, lbl trap.Label) { + fset := tw.Package.Fset + start, end := fset.Position(scope.Pos()), fset.Position(scope.End()) + extractLocation(tw, lbl, start.Line, start.Column, end.Line, end.Column-1) +} + +// extractScopes extracts symbol table information for the package scope and all local scopes +// of the given package. Note that this will not encounter methods or struct fields as +// they do not have a parent scope. +func extractScopes(tw *trap.Writer, nd *ast.File, pkg *packages.Package) { + pkgScopeLabel := extractPackageScope(tw, pkg) + fileScope := pkg.TypesInfo.Scopes[nd] + if fileScope != nil { + extractLocalScope(tw, fileScope, pkgScopeLabel) + } +} + +// extractLocalScope extracts symbol table information for the given scope and all its nested scopes +func extractLocalScope(tw *trap.Writer, scope *types.Scope, parentScopeLabel trap.Label) { + scopeLabel := tw.Labeler.ScopeID(scope, nil) + dbscheme.ScopesTable.Emit(tw, scopeLabel, dbscheme.LocalScopeType.Index()) + extractScopeLocation(tw, scope, scopeLabel) + dbscheme.ScopeNestingTable.Emit(tw, scopeLabel, parentScopeLabel) + + for i := 0; i < scope.NumChildren(); i++ { + childScope := scope.Child(i) + extractLocalScope(tw, childScope, scopeLabel) + } + + extractObjects(tw, scope, scopeLabel) +} + +// extractFileNode extracts AST information for the given file and all nodes contained in it +func extractFileNode(tw *trap.Writer, nd *ast.File) { + lbl := tw.Labeler.FileLabel() + + extractExpr(tw, nd.Name, lbl, 0) + + for i, decl := range nd.Decls { + extractDecl(tw, decl, lbl, i) + } + + for i, cg := range nd.Comments { + extractCommentGroup(tw, cg, lbl, i) + } + + extractDoc(tw, nd.Doc, lbl) + emitScopeNodeInfo(tw, nd, lbl) +} + +// extractDoc extracts information about a doc comment group associated with a given element +func extractDoc(tw *trap.Writer, doc *ast.CommentGroup, elt trap.Label) { + if doc != nil { + dbscheme.DocCommentsTable.Emit(tw, elt, tw.Labeler.LocalID(doc)) + } +} + +// extractCommentGroup extracts information about a doc comment group +func extractCommentGroup(tw *trap.Writer, cg *ast.CommentGroup, parent trap.Label, idx int) { + lbl := tw.Labeler.LocalID(cg) + dbscheme.CommentGroupsTable.Emit(tw, lbl, parent, idx) + extractNodeLocation(tw, cg, lbl) + for i, c := range cg.List { + extractComment(tw, c, lbl, i) + } +} + +// extractComment extracts information about a given comment +func extractComment(tw *trap.Writer, c *ast.Comment, parent trap.Label, idx int) { + lbl := tw.Labeler.LocalID(c) + rawText := c.Text + var kind int + var text string + if rawText[:2] == "//" { + kind = dbscheme.SlashSlashComment.Index() + text = rawText[2:] + } else { + kind = dbscheme.SlashStarComment.Index() + text = rawText[2 : len(rawText)-2] + } + dbscheme.CommentsTable.Emit(tw, lbl, kind, parent, idx, text) + extractNodeLocation(tw, c, lbl) +} + +// emitScopeNodeInfo associates an AST node with its induced scope, if any +func emitScopeNodeInfo(tw *trap.Writer, nd ast.Node, lbl trap.Label) { + scope, exists := tw.Package.TypesInfo.Scopes[nd] + if exists { + dbscheme.ScopeNodesTable.Emit(tw, lbl, tw.Labeler.ScopeID(scope, tw.Package.Types)) + } +} + +// extractExpr extracts AST information for the given expression and all its subexpressions +func extractExpr(tw *trap.Writer, expr ast.Expr, parent trap.Label, idx int) { + if expr == nil { + return + } + + lbl := tw.Labeler.LocalID(expr) + extractTypeOf(tw, expr, lbl) + + var kind int + switch expr := expr.(type) { + case *ast.BadExpr: + kind = dbscheme.BadExpr.Index() + case *ast.Ident: + if expr == nil { + return + } + kind = dbscheme.IdentExpr.Index() + dbscheme.LiteralsTable.Emit(tw, lbl, expr.Name, expr.Name) + def := tw.Package.TypesInfo.Defs[expr] + if def != nil { + defTyp := extractType(tw, def.Type()) + objlbl, exists := tw.Labeler.LookupObjectID(def, defTyp) + if objlbl == trap.InvalidLabel { + log.Printf("Omitting def binding to unknown object %v", def) + } else { + if !exists { + extractObject(tw, def, objlbl) + } + dbscheme.DefsTable.Emit(tw, lbl, objlbl) + } + } + use := getObjectBeingUsed(tw, expr) + if use != nil { + useTyp := extractType(tw, use.Type()) + objlbl, exists := tw.Labeler.LookupObjectID(use, useTyp) + if objlbl == trap.InvalidLabel { + log.Printf("Omitting use binding to unknown object %v", use) + } else { + if !exists { + extractObject(tw, use, objlbl) + } + dbscheme.UsesTable.Emit(tw, lbl, objlbl) + } + } + case *ast.Ellipsis: + if expr == nil { + return + } + kind = dbscheme.EllipsisExpr.Index() + extractExpr(tw, expr.Elt, lbl, 0) + case *ast.BasicLit: + if expr == nil { + return + } + value := "" + switch expr.Kind { + case token.INT: + ival, _ := strconv.ParseInt(expr.Value, 0, 64) + value = strconv.FormatInt(ival, 10) + kind = dbscheme.IntLitExpr.Index() + case token.FLOAT: + value = expr.Value + kind = dbscheme.FloatLitExpr.Index() + case token.IMAG: + value = expr.Value + kind = dbscheme.ImagLitExpr.Index() + case token.CHAR: + value, _ = strconv.Unquote(expr.Value) + kind = dbscheme.CharLitExpr.Index() + case token.STRING: + value, _ = strconv.Unquote(expr.Value) + kind = dbscheme.StringLitExpr.Index() + default: + log.Fatalf("unknown literal kind %v", expr.Kind) + } + dbscheme.LiteralsTable.Emit(tw, lbl, value, expr.Value) + case *ast.FuncLit: + if expr == nil { + return + } + kind = dbscheme.FuncLitExpr.Index() + extractExpr(tw, expr.Type, lbl, 0) + extractStmt(tw, expr.Body, lbl, 1) + case *ast.CompositeLit: + if expr == nil { + return + } + kind = dbscheme.CompositeLitExpr.Index() + extractExpr(tw, expr.Type, lbl, 0) + extractExprs(tw, expr.Elts, lbl, 1, 1) + case *ast.ParenExpr: + if expr == nil { + return + } + kind = dbscheme.ParenExpr.Index() + extractExpr(tw, expr.X, lbl, 0) + case *ast.SelectorExpr: + if expr == nil { + return + } + kind = dbscheme.SelectorExpr.Index() + extractExpr(tw, expr.X, lbl, 0) + extractExpr(tw, expr.Sel, lbl, 1) + case *ast.IndexExpr: + if expr == nil { + return + } + typeofx := typeOf(tw, expr.X) + if typeofx == nil { + // We are missing type information for `expr.X`, so we cannot + // determine whether this is a generic function instantiation + // or not. + kind = dbscheme.IndexExpr.Index() + } else { + if _, ok := typeofx.Underlying().(*types.Signature); ok { + kind = dbscheme.GenericFunctionInstantiationExpr.Index() + } else { + // Can't distinguish between actual index expressions (into a + // map, array, slice, string or pointer to array) and generic + // type specialization expression, so we do it later in QL. + kind = dbscheme.IndexExpr.Index() + } + } + extractExpr(tw, expr.X, lbl, 0) + extractExpr(tw, expr.Index, lbl, 1) + case *ast.IndexListExpr: + if expr == nil { + return + } + typeofx := typeOf(tw, expr.X) + if typeofx == nil { + // We are missing type information for `expr.X`, so we cannot + // determine whether this is a generic function instantiation + // or not. + kind = dbscheme.GenericTypeInstantiationExpr.Index() + } else { + if _, ok := typeofx.Underlying().(*types.Signature); ok { + kind = dbscheme.GenericFunctionInstantiationExpr.Index() + } else { + kind = dbscheme.GenericTypeInstantiationExpr.Index() + } + } + extractExpr(tw, expr.X, lbl, 0) + extractExprs(tw, expr.Indices, lbl, 1, 1) + case *ast.SliceExpr: + if expr == nil { + return + } + kind = dbscheme.SliceExpr.Index() + extractExpr(tw, expr.X, lbl, 0) + extractExpr(tw, expr.Low, lbl, 1) + extractExpr(tw, expr.High, lbl, 2) + extractExpr(tw, expr.Max, lbl, 3) + case *ast.TypeAssertExpr: + if expr == nil { + return + } + kind = dbscheme.TypeAssertExpr.Index() + extractExpr(tw, expr.X, lbl, 0) + extractExpr(tw, expr.Type, lbl, 1) + case *ast.CallExpr: + if expr == nil { + return + } + kind = dbscheme.CallOrConversionExpr.Index() + extractExpr(tw, expr.Fun, lbl, 0) + extractExprs(tw, expr.Args, lbl, 1, 1) + if expr.Ellipsis.IsValid() { + dbscheme.HasEllipsisTable.Emit(tw, lbl) + } + case *ast.StarExpr: + if expr == nil { + return + } + kind = dbscheme.StarExpr.Index() + extractExpr(tw, expr.X, lbl, 0) + case *ast.KeyValueExpr: + if expr == nil { + return + } + kind = dbscheme.KeyValueExpr.Index() + extractExpr(tw, expr.Key, lbl, 0) + extractExpr(tw, expr.Value, lbl, 1) + case *ast.UnaryExpr: + if expr == nil { + return + } + if expr.Op == token.TILDE { + kind = dbscheme.TypeSetLiteralExpr.Index() + } else { + tp := dbscheme.UnaryExprs[expr.Op] + if tp == nil { + log.Fatalf("unsupported unary operator %s", expr.Op) + } + kind = tp.Index() + } + extractExpr(tw, expr.X, lbl, 0) + case *ast.BinaryExpr: + if expr == nil { + return + } + _, isUnionType := typeOf(tw, expr).(*types.Union) + if expr.Op == token.OR && isUnionType { + kind = dbscheme.TypeSetLiteralExpr.Index() + flattenBinaryExprTree(tw, expr, lbl, 0) + } else { + tp := dbscheme.BinaryExprs[expr.Op] + if tp == nil { + log.Fatalf("unsupported binary operator %s", expr.Op) + } + kind = tp.Index() + extractExpr(tw, expr.X, lbl, 0) + extractExpr(tw, expr.Y, lbl, 1) + } + case *ast.ArrayType: + if expr == nil { + return + } + kind = dbscheme.ArrayTypeExpr.Index() + extractExpr(tw, expr.Len, lbl, 0) + extractExpr(tw, expr.Elt, lbl, 1) + case *ast.StructType: + if expr == nil { + return + } + kind = dbscheme.StructTypeExpr.Index() + extractFields(tw, expr.Fields, lbl, 0, 1) + case *ast.FuncType: + if expr == nil { + return + } + kind = dbscheme.FuncTypeExpr.Index() + extractFields(tw, expr.Params, lbl, 0, 1) + extractFields(tw, expr.Results, lbl, -1, -1) + emitScopeNodeInfo(tw, expr, lbl) + case *ast.InterfaceType: + if expr == nil { + return + } + kind = dbscheme.InterfaceTypeExpr.Index() + // expr.Methods contains methods, embedded interfaces and type set + // literals. + makeTypeSetLiteralsUnionTyped(tw, expr.Methods) + extractFields(tw, expr.Methods, lbl, 0, 1) + case *ast.MapType: + if expr == nil { + return + } + kind = dbscheme.MapTypeExpr.Index() + extractExpr(tw, expr.Key, lbl, 0) + extractExpr(tw, expr.Value, lbl, 1) + case *ast.ChanType: + if expr == nil { + return + } + tp := dbscheme.ChanTypeExprs[expr.Dir] + if tp == nil { + log.Fatalf("unsupported channel direction %v", expr.Dir) + } + kind = tp.Index() + extractExpr(tw, expr.Value, lbl, 0) + default: + log.Fatalf("unknown expression of type %T", expr) + } + dbscheme.ExprsTable.Emit(tw, lbl, kind, parent, idx) + extractNodeLocation(tw, expr, lbl) + extractValueOf(tw, expr, lbl) +} + +// extractExprs extracts AST information for a list of expressions, which are children of +// the given parent +// `idx` is the index of the first child in the list, and `dir` is the index increment of +// each child over its preceding child (usually either 1 for assigning increasing indices, or +// -1 for decreasing indices) +func extractExprs(tw *trap.Writer, exprs []ast.Expr, parent trap.Label, idx int, dir int) { + if exprs != nil { + for _, expr := range exprs { + extractExpr(tw, expr, parent, idx) + idx += dir + } + } +} + +// extractTypeOf looks up the type of `expr`, extracts it if it hasn't previously been +// extracted, and associates it with `expr` in the `type_of` table +func extractTypeOf(tw *trap.Writer, expr ast.Expr, lbl trap.Label) { + tp := typeOf(tw, expr) + if tp != nil { + tplbl := extractType(tw, tp) + dbscheme.TypeOfTable.Emit(tw, lbl, tplbl) + } +} + +// extractValueOf looks up the value of `expr`, and associates it with `expr` in +// the `consts` table +func extractValueOf(tw *trap.Writer, expr ast.Expr, lbl trap.Label) { + tpVal := tw.Package.TypesInfo.Types[expr] + + if tpVal.Value != nil { + // if Value is non-nil, the expression has a constant value + + // note that string literals in import statements do not have an associated + // Value and so do not get added to the table + + var value string + exact := tpVal.Value.ExactString() + switch tpVal.Value.Kind() { + case constant.String: + // we need to unquote strings + value = constant.StringVal(tpVal.Value) + exact = constant.StringVal(tpVal.Value) + case constant.Float: + flval, _ := constant.Float64Val(tpVal.Value) + value = fmt.Sprintf("%.20g", flval) + case constant.Complex: + real, _ := constant.Float64Val(constant.Real(tpVal.Value)) + imag, _ := constant.Float64Val(constant.Imag(tpVal.Value)) + value = fmt.Sprintf("(%.20g + %.20gi)", real, imag) + default: + value = tpVal.Value.ExactString() + } + + dbscheme.ConstValuesTable.Emit(tw, lbl, value, exact) + } else if tpVal.IsNil() { + dbscheme.ConstValuesTable.Emit(tw, lbl, "nil", "nil") + } +} + +// extractFields extracts AST information for a list of fields, which are children of +// the given parent +// `idx` is the index of the first child in the list, and `dir` is the index increment of +// each child over its preceding child (usually either 1 for assigning increasing indices, or +// -1 for decreasing indices) +func extractFields(tw *trap.Writer, fields *ast.FieldList, parent trap.Label, idx int, dir int) { + if fields == nil || fields.List == nil { + return + } + for _, field := range fields.List { + lbl := tw.Labeler.LocalID(field) + dbscheme.FieldsTable.Emit(tw, lbl, parent, idx) + extractNodeLocation(tw, field, lbl) + if field.Names != nil { + for i, name := range field.Names { + extractExpr(tw, name, lbl, i+1) + } + } + extractExpr(tw, field.Type, lbl, 0) + extractExpr(tw, field.Tag, lbl, -1) + extractDoc(tw, field.Doc, lbl) + idx += dir + } +} + +// extractStmt extracts AST information for a given statement and all other statements or expressions +// nested inside it +func extractStmt(tw *trap.Writer, stmt ast.Stmt, parent trap.Label, idx int) { + if stmt == nil { + return + } + + lbl := tw.Labeler.LocalID(stmt) + var kind int + switch stmt := stmt.(type) { + case *ast.BadStmt: + kind = dbscheme.BadStmtType.Index() + case *ast.DeclStmt: + if stmt == nil { + return + } + kind = dbscheme.DeclStmtType.Index() + extractDecl(tw, stmt.Decl, lbl, 0) + case *ast.EmptyStmt: + kind = dbscheme.EmptyStmtType.Index() + case *ast.LabeledStmt: + if stmt == nil { + return + } + kind = dbscheme.LabeledStmtType.Index() + extractExpr(tw, stmt.Label, lbl, 0) + extractStmt(tw, stmt.Stmt, lbl, 1) + case *ast.ExprStmt: + if stmt == nil { + return + } + kind = dbscheme.ExprStmtType.Index() + extractExpr(tw, stmt.X, lbl, 0) + case *ast.SendStmt: + if stmt == nil { + return + } + kind = dbscheme.SendStmtType.Index() + extractExpr(tw, stmt.Chan, lbl, 0) + extractExpr(tw, stmt.Value, lbl, 1) + case *ast.IncDecStmt: + if stmt == nil { + return + } + if stmt.Tok == token.INC { + kind = dbscheme.IncStmtType.Index() + } else if stmt.Tok == token.DEC { + kind = dbscheme.DecStmtType.Index() + } else { + log.Fatalf("unsupported increment/decrement operator %v", stmt.Tok) + } + extractExpr(tw, stmt.X, lbl, 0) + case *ast.AssignStmt: + if stmt == nil { + return + } + tp := dbscheme.AssignStmtTypes[stmt.Tok] + if tp == nil { + log.Fatalf("unsupported assignment statement with operator %v", stmt.Tok) + } + kind = tp.Index() + extractExprs(tw, stmt.Lhs, lbl, -1, -1) + extractExprs(tw, stmt.Rhs, lbl, 1, 1) + case *ast.GoStmt: + if stmt == nil { + return + } + kind = dbscheme.GoStmtType.Index() + extractExpr(tw, stmt.Call, lbl, 0) + case *ast.DeferStmt: + if stmt == nil { + return + } + kind = dbscheme.DeferStmtType.Index() + extractExpr(tw, stmt.Call, lbl, 0) + case *ast.ReturnStmt: + kind = dbscheme.ReturnStmtType.Index() + extractExprs(tw, stmt.Results, lbl, 0, 1) + case *ast.BranchStmt: + if stmt == nil { + return + } + switch stmt.Tok { + case token.BREAK: + kind = dbscheme.BreakStmtType.Index() + case token.CONTINUE: + kind = dbscheme.ContinueStmtType.Index() + case token.GOTO: + kind = dbscheme.GotoStmtType.Index() + case token.FALLTHROUGH: + kind = dbscheme.FallthroughStmtType.Index() + default: + log.Fatalf("unsupported branch statement type %v", stmt.Tok) + } + extractExpr(tw, stmt.Label, lbl, 0) + case *ast.BlockStmt: + if stmt == nil { + return + } + kind = dbscheme.BlockStmtType.Index() + extractStmts(tw, stmt.List, lbl, 0, 1) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.IfStmt: + if stmt == nil { + return + } + kind = dbscheme.IfStmtType.Index() + extractStmt(tw, stmt.Init, lbl, 0) + extractExpr(tw, stmt.Cond, lbl, 1) + extractStmt(tw, stmt.Body, lbl, 2) + extractStmt(tw, stmt.Else, lbl, 3) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.CaseClause: + if stmt == nil { + return + } + kind = dbscheme.CaseClauseType.Index() + extractExprs(tw, stmt.List, lbl, -1, -1) + extractStmts(tw, stmt.Body, lbl, 0, 1) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.SwitchStmt: + if stmt == nil { + return + } + kind = dbscheme.ExprSwitchStmtType.Index() + extractStmt(tw, stmt.Init, lbl, 0) + extractExpr(tw, stmt.Tag, lbl, 1) + extractStmt(tw, stmt.Body, lbl, 2) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.TypeSwitchStmt: + if stmt == nil { + return + } + kind = dbscheme.TypeSwitchStmtType.Index() + extractStmt(tw, stmt.Init, lbl, 0) + extractStmt(tw, stmt.Assign, lbl, 1) + extractStmt(tw, stmt.Body, lbl, 2) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.CommClause: + if stmt == nil { + return + } + kind = dbscheme.CommClauseType.Index() + extractStmt(tw, stmt.Comm, lbl, 0) + extractStmts(tw, stmt.Body, lbl, 1, 1) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.SelectStmt: + kind = dbscheme.SelectStmtType.Index() + extractStmt(tw, stmt.Body, lbl, 0) + case *ast.ForStmt: + if stmt == nil { + return + } + kind = dbscheme.ForStmtType.Index() + extractStmt(tw, stmt.Init, lbl, 0) + extractExpr(tw, stmt.Cond, lbl, 1) + extractStmt(tw, stmt.Post, lbl, 2) + extractStmt(tw, stmt.Body, lbl, 3) + emitScopeNodeInfo(tw, stmt, lbl) + case *ast.RangeStmt: + if stmt == nil { + return + } + kind = dbscheme.RangeStmtType.Index() + extractExpr(tw, stmt.Key, lbl, 0) + extractExpr(tw, stmt.Value, lbl, 1) + extractExpr(tw, stmt.X, lbl, 2) + extractStmt(tw, stmt.Body, lbl, 3) + emitScopeNodeInfo(tw, stmt, lbl) + default: + log.Fatalf("unknown statement of type %T", stmt) + } + dbscheme.StmtsTable.Emit(tw, lbl, kind, parent, idx) + extractNodeLocation(tw, stmt, lbl) +} + +// extractStmts extracts AST information for a list of statements, which are children of +// the given parent +// `idx` is the index of the first child in the list, and `dir` is the index increment of +// each child over its preceding child (usually either 1 for assigning increasing indices, or +// -1 for decreasing indices) +func extractStmts(tw *trap.Writer, stmts []ast.Stmt, parent trap.Label, idx int, dir int) { + if stmts != nil { + for _, stmt := range stmts { + extractStmt(tw, stmt, parent, idx) + idx += dir + } + } + +} + +// extractDecl extracts AST information for the given declaration +func extractDecl(tw *trap.Writer, decl ast.Decl, parent trap.Label, idx int) { + lbl := tw.Labeler.LocalID(decl) + var kind int + switch decl := decl.(type) { + case *ast.BadDecl: + kind = dbscheme.BadDeclType.Index() + case *ast.GenDecl: + if decl == nil { + return + } + switch decl.Tok { + case token.IMPORT: + kind = dbscheme.ImportDeclType.Index() + case token.CONST: + kind = dbscheme.ConstDeclType.Index() + case token.TYPE: + kind = dbscheme.TypeDeclType.Index() + case token.VAR: + kind = dbscheme.VarDeclType.Index() + default: + log.Fatalf("unknown declaration of kind %v", decl.Tok) + } + for i, spec := range decl.Specs { + extractSpec(tw, spec, lbl, i) + } + extractDoc(tw, decl.Doc, lbl) + case *ast.FuncDecl: + if decl == nil { + return + } + kind = dbscheme.FuncDeclType.Index() + extractFields(tw, decl.Recv, lbl, -1, -1) + extractExpr(tw, decl.Name, lbl, 0) + extractExpr(tw, decl.Type, lbl, 1) + extractStmt(tw, decl.Body, lbl, 2) + extractDoc(tw, decl.Doc, lbl) + extractTypeParamDecls(tw, decl.Type.TypeParams, lbl) + + // Note that we currently don't extract any kind of declaration for + // receiver type parameters. There isn't an explicit declaration, but + // we could consider the index/indices of an IndexExpr/IndexListExpr + // receiver as declarations. + default: + log.Fatalf("unknown declaration of type %T", decl) + } + dbscheme.DeclsTable.Emit(tw, lbl, kind, parent, idx) + extractNodeLocation(tw, decl, lbl) +} + +// extractSpec extracts AST information for the given declaration specifier +func extractSpec(tw *trap.Writer, spec ast.Spec, parent trap.Label, idx int) { + lbl := tw.Labeler.LocalID(spec) + var kind int + switch spec := spec.(type) { + case *ast.ImportSpec: + if spec == nil { + return + } + kind = dbscheme.ImportSpecType.Index() + extractExpr(tw, spec.Name, lbl, 0) + extractExpr(tw, spec.Path, lbl, 1) + extractDoc(tw, spec.Doc, lbl) + case *ast.ValueSpec: + if spec == nil { + return + } + kind = dbscheme.ValueSpecType.Index() + for i, name := range spec.Names { + extractExpr(tw, name, lbl, -(1 + i)) + } + extractExpr(tw, spec.Type, lbl, 0) + extractExprs(tw, spec.Values, lbl, 1, 1) + extractDoc(tw, spec.Doc, lbl) + case *ast.TypeSpec: + if spec == nil { + return + } + if spec.Assign.IsValid() { + kind = dbscheme.AliasSpecType.Index() + } else { + kind = dbscheme.TypeDefSpecType.Index() + } + extractExpr(tw, spec.Name, lbl, 0) + extractTypeParamDecls(tw, spec.TypeParams, lbl) + extractExpr(tw, spec.Type, lbl, 1) + extractDoc(tw, spec.Doc, lbl) + } + dbscheme.SpecsTable.Emit(tw, lbl, kind, parent, idx) + extractNodeLocation(tw, spec, lbl) +} + +// extractType extracts type information for `tp` and returns its associated label; +// types are only extracted once, so the second time `extractType` is invoked it simply returns the label +func extractType(tw *trap.Writer, tp types.Type) trap.Label { + lbl, exists := getTypeLabel(tw, tp) + if !exists { + var kind int + switch tp := tp.(type) { + case *types.Basic: + branch := dbscheme.BasicTypes[tp.Kind()] + if branch == nil { + log.Fatalf("unknown basic type %v", tp.Kind()) + } + kind = branch.Index() + case *types.Array: + kind = dbscheme.ArrayType.Index() + dbscheme.ArrayLengthTable.Emit(tw, lbl, fmt.Sprintf("%d", tp.Len())) + extractElementType(tw, lbl, tp.Elem()) + case *types.Slice: + kind = dbscheme.SliceType.Index() + extractElementType(tw, lbl, tp.Elem()) + case *types.Struct: + kind = dbscheme.StructType.Index() + for i := 0; i < tp.NumFields(); i++ { + field := tp.Field(i) + + // ensure the field is associated with a label - note that + // struct fields do not have a parent scope, so they are not + // dealt with by `extractScopes` + fieldlbl, exists := tw.Labeler.FieldID(field, i, lbl) + if !exists { + extractObject(tw, field, fieldlbl) + } + + dbscheme.FieldStructsTable.Emit(tw, fieldlbl, lbl) + + name := field.Name() + if field.Embedded() { + name = "" + } + extractComponentType(tw, lbl, i, name, field.Type()) + } + case *types.Pointer: + kind = dbscheme.PointerType.Index() + extractBaseType(tw, lbl, tp.Elem()) + case *types.Interface: + kind = dbscheme.InterfaceType.Index() + for i := 0; i < tp.NumMethods(); i++ { + meth := tp.Method(i) + + // Note that methods do not have a parent scope, so they are + // not dealt with by `extractScopes` + extractMethod(tw, meth) + + extractComponentType(tw, lbl, i, meth.Name(), meth.Type()) + } + for i := 0; i < tp.NumEmbeddeds(); i++ { + component := tp.EmbeddedType(i) + if isNonUnionTypeSetLiteral(component) { + component = createUnionFromType(component) + } + extractComponentType(tw, lbl, -(i + 1), "", component) + } + case *types.Tuple: + kind = dbscheme.TupleType.Index() + for i := 0; i < tp.Len(); i++ { + extractComponentType(tw, lbl, i, "", tp.At(i).Type()) + } + case *types.Signature: + kind = dbscheme.SignatureType.Index() + params, results := tp.Params(), tp.Results() + if params != nil { + for i := 0; i < params.Len(); i++ { + param := params.At(i) + extractComponentType(tw, lbl, i+1, "", param.Type()) + } + } + if results != nil { + for i := 0; i < results.Len(); i++ { + result := results.At(i) + extractComponentType(tw, lbl, -(i + 1), "", result.Type()) + } + } + if tp.Variadic() { + dbscheme.VariadicTable.Emit(tw, lbl) + } + case *types.Map: + kind = dbscheme.MapType.Index() + extractKeyType(tw, lbl, tp.Key()) + extractElementType(tw, lbl, tp.Elem()) + case *types.Chan: + kind = dbscheme.ChanTypes[tp.Dir()].Index() + extractElementType(tw, lbl, tp.Elem()) + case *types.Named: + origintp := tp.Origin() + kind = dbscheme.NamedType.Index() + dbscheme.TypeNameTable.Emit(tw, lbl, origintp.Obj().Name()) + underlying := origintp.Underlying() + extractUnderlyingType(tw, lbl, underlying) + trackInstantiatedStructFields(tw, tp, origintp) + + entitylbl, exists := tw.Labeler.LookupObjectID(origintp.Obj(), lbl) + if entitylbl == trap.InvalidLabel { + log.Printf("Omitting type-object binding for unknown object %v.\n", origintp.Obj()) + } else { + if !exists { + extractObject(tw, origintp.Obj(), entitylbl) + } + dbscheme.TypeObjectTable.Emit(tw, lbl, entitylbl) + } + + // ensure all methods have labels - note that methods do not have a + // parent scope, so they are not dealt with by `extractScopes` + for i := 0; i < origintp.NumMethods(); i++ { + meth := origintp.Method(i) + + extractMethod(tw, meth) + } + + // associate all methods of underlying interface with this type + if underlyingInterface, ok := underlying.(*types.Interface); ok { + for i := 0; i < underlyingInterface.NumMethods(); i++ { + methlbl := extractMethod(tw, underlyingInterface.Method(i)) + dbscheme.MethodHostsTable.Emit(tw, methlbl, lbl) + } + } + case *types.TypeParam: + kind = dbscheme.TypeParamType.Index() + parentlbl := getTypeParamParentLabel(tw, tp) + constraintLabel := extractType(tw, tp.Constraint()) + dbscheme.TypeParamTable.Emit(tw, lbl, tp.Obj().Name(), constraintLabel, parentlbl, tp.Index()) + case *types.Union: + kind = dbscheme.TypeSetLiteral.Index() + for i := 0; i < tp.Len(); i++ { + term := tp.Term(i) + tildeStr := "" + if term.Tilde() { + tildeStr = "~" + } + extractComponentType(tw, lbl, i, tildeStr, term.Type()) + } + default: + log.Fatalf("unexpected type %T", tp) + } + dbscheme.TypesTable.Emit(tw, lbl, kind) + } + return lbl +} + +// getTypeLabel looks up the label associated with `tp`, creating a new label if +// it does not have one yet; the second result indicates whether the label +// already existed +// +// Type labels refer to global keys to ensure that if the same type is +// encountered during the extraction of different files it is still ultimately +// mapped to the same entity. In particular, this means that keys for compound +// types refer to the labels of their component types. For named types, the key +// is constructed from their globally unique ID. This prevents cyclic type keys +// since type recursion in Go always goes through named types. +func getTypeLabel(tw *trap.Writer, tp types.Type) (trap.Label, bool) { + lbl, exists := tw.Labeler.TypeLabels[tp] + if !exists { + switch tp := tp.(type) { + case *types.Basic: + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%d;basictype", tp.Kind())) + case *types.Array: + len := tp.Len() + elem := extractType(tw, tp.Elem()) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%d,{%s};arraytype", len, elem)) + case *types.Slice: + elem := extractType(tw, tp.Elem()) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s};slicetype", elem)) + case *types.Struct: + var b strings.Builder + for i := 0; i < tp.NumFields(); i++ { + field := tp.Field(i) + fieldTypeLbl := extractType(tw, field.Type()) + if i > 0 { + b.WriteString(",") + } + name := field.Name() + if field.Embedded() { + name = "" + } + fmt.Fprintf(&b, "%s,{%s},%s", name, fieldTypeLbl, util.EscapeTrapSpecialChars(tp.Tag(i))) + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%s;structtype", b.String())) + case *types.Pointer: + base := extractType(tw, tp.Elem()) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s};pointertype", base)) + case *types.Interface: + var b strings.Builder + for i := 0; i < tp.NumMethods(); i++ { + meth := tp.Method(i) + methLbl := extractType(tw, meth.Type()) + if i > 0 { + b.WriteString(",") + } + fmt.Fprintf(&b, "%s,{%s}", meth.Id(), methLbl) + } + b.WriteString(";") + for i := 0; i < tp.NumEmbeddeds(); i++ { + if i > 0 { + b.WriteString(",") + } + fmt.Fprintf(&b, "{%s}", extractType(tw, tp.EmbeddedType(i))) + } + // We note whether the interface is comparable so that we can + // distinguish the underlying type of `comparable` from an + // empty interface. + if tp.IsComparable() { + b.WriteString(";comparable") + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%s;interfacetype", b.String())) + case *types.Tuple: + var b strings.Builder + for i := 0; i < tp.Len(); i++ { + compLbl := extractType(tw, tp.At(i).Type()) + if i > 0 { + b.WriteString(",") + } + fmt.Fprintf(&b, "{%s}", compLbl) + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%s;tupletype", b.String())) + case *types.Signature: + var b strings.Builder + params, results := tp.Params(), tp.Results() + if params != nil { + for i := 0; i < params.Len(); i++ { + paramLbl := extractType(tw, params.At(i).Type()) + if i > 0 { + b.WriteString(",") + } + fmt.Fprintf(&b, "{%s}", paramLbl) + } + } + b.WriteString(";") + if results != nil { + for i := 0; i < results.Len(); i++ { + resultLbl := extractType(tw, results.At(i).Type()) + if i > 0 { + b.WriteString(",") + } + fmt.Fprintf(&b, "{%s}", resultLbl) + } + } + if tp.Variadic() { + b.WriteString(";variadic") + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%s;signaturetype", b.String())) + case *types.Map: + key := extractType(tw, tp.Key()) + value := extractType(tw, tp.Elem()) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s},{%s};maptype", key, value)) + case *types.Chan: + dir := tp.Dir() + elem := extractType(tw, tp.Elem()) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%v,{%s};chantype", dir, elem)) + case *types.Named: + origintp := tp.Origin() + entitylbl, exists := tw.Labeler.LookupObjectID(origintp.Obj(), lbl) + if entitylbl == trap.InvalidLabel { + panic(fmt.Sprintf("Cannot construct label for named type %v (underlying object is %v).\n", origintp, origintp.Obj())) + } + if !exists { + extractObject(tw, origintp.Obj(), entitylbl) + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%s};namedtype", entitylbl)) + case *types.TypeParam: + parentlbl := getTypeParamParentLabel(tw, tp) + lbl = tw.Labeler.GlobalID(fmt.Sprintf("{%v},%s;typeparamtype", parentlbl, tp.Obj().Name())) + case *types.Union: + var b strings.Builder + for i := 0; i < tp.Len(); i++ { + compLbl := extractType(tw, tp.Term(i).Type()) + if i > 0 { + b.WriteString("|") + } + if tp.Term(i).Tilde() { + b.WriteString("~") + } + fmt.Fprintf(&b, "{%s}", compLbl) + } + lbl = tw.Labeler.GlobalID(fmt.Sprintf("%s;typesetliteraltype", b.String())) + default: + log.Fatalf("(getTypeLabel) unexpected type %T", tp) + } + tw.Labeler.TypeLabels[tp] = lbl + } + return lbl, exists +} + +// extractKeyType extracts `key` as the key type of the map type `mp` +func extractKeyType(tw *trap.Writer, mp trap.Label, key types.Type) { + dbscheme.KeyTypeTable.Emit(tw, mp, extractType(tw, key)) +} + +// extractElementType extracts `element` as the element type of the container type `container` +func extractElementType(tw *trap.Writer, container trap.Label, element types.Type) { + dbscheme.ElementTypeTable.Emit(tw, container, extractType(tw, element)) +} + +// extractBaseType extracts `base` as the base type of the pointer type `ptr` +func extractBaseType(tw *trap.Writer, ptr trap.Label, base types.Type) { + dbscheme.BaseTypeTable.Emit(tw, ptr, extractType(tw, base)) +} + +// extractUnderlyingType extracts `underlying` as the underlying type of the +// named type `named` +func extractUnderlyingType(tw *trap.Writer, named trap.Label, underlying types.Type) { + dbscheme.UnderlyingTypeTable.Emit(tw, named, extractType(tw, underlying)) +} + +// extractComponentType extracts `component` as the `idx`th component type of `parent` with name `name` +func extractComponentType(tw *trap.Writer, parent trap.Label, idx int, name string, component types.Type) { + dbscheme.ComponentTypesTable.Emit(tw, parent, idx, name, extractType(tw, component)) +} + +// extractNumLines extracts lines-of-code and lines-of-comments information for the +// given file +func extractNumLines(tw *trap.Writer, fileName string, ast *ast.File) { + f := tw.Package.Fset.File(ast.Pos()) + + lineCount := f.LineCount() + + // count lines of code by tokenizing + linesOfCode := 0 + src, err := ioutil.ReadFile(fileName) + if err != nil { + log.Fatalf("Unable to read file %s.", fileName) + } + var s scanner.Scanner + lastCodeLine := -1 + s.Init(f, src, nil, 0) + for { + pos, tok, lit := s.Scan() + if tok == token.EOF { + break + } else if tok != token.ILLEGAL && !(tok == token.SEMICOLON && lit == "\n") { + // specifically exclude newlines that are treated as semicolons + tkStartLine := f.Position(pos).Line + tkEndLine := tkStartLine + strings.Count(lit, "\n") + if tkEndLine > lastCodeLine { + if tkStartLine <= lastCodeLine { + // if the start line is the same as the last code line we've seen we don't want to double + // count it + // note tkStartLine < lastCodeLine should not be possible + linesOfCode += tkEndLine - lastCodeLine + } else { + linesOfCode += tkEndLine - tkStartLine + 1 + } + lastCodeLine = tkEndLine + } + } + } + + // count lines of comments by iterating over ast.Comments + linesOfComments := 0 + for _, cg := range ast.Comments { + for _, g := range cg.List { + fset := tw.Package.Fset + startPos, endPos := fset.Position(g.Pos()), fset.Position(g.End()) + linesOfComments += endPos.Line - startPos.Line + 1 + } + } + + dbscheme.NumlinesTable.Emit(tw, tw.Labeler.FileLabel(), lineCount, linesOfCode, linesOfComments) +} + +// For a type `t` which is the type of a field of an interface type, return +// whether `t` a type set literal which is not a union type. Note that a field +// of an interface must be a method signature, an embedded interface type or a +// type set literal. +func isNonUnionTypeSetLiteral(t types.Type) bool { + if t == nil { + return false + } + switch t.Underlying().(type) { + case *types.Interface, *types.Union, *types.Signature: + return false + default: + return true + } +} + +// Given a type `t`, return a union with a single term that is `t` without a +// tilde. +func createUnionFromType(t types.Type) *types.Union { + return types.NewUnion([]*types.Term{types.NewTerm(false, t)}) +} + +// Go through a `FieldList` and update the types of all type set literals which +// are not already union types to be union types. We do this by changing the +// types stored in `tw.Package.TypesInfo.Types`. Type set literals can only +// occur in two places: a type parameter declaration or a type in an interface. +func makeTypeSetLiteralsUnionTyped(tw *trap.Writer, fields *ast.FieldList) { + if fields == nil || fields.List == nil { + return + } + for i := 0; i < len(fields.List); i++ { + x := fields.List[i].Type + if _, alreadyOverridden := tw.TypesOverride[x]; !alreadyOverridden { + xtp := typeOf(tw, x) + if isNonUnionTypeSetLiteral(xtp) { + tw.TypesOverride[x] = createUnionFromType(xtp) + } + } + } +} + +func typeOf(tw *trap.Writer, e ast.Expr) types.Type { + if val, ok := tw.TypesOverride[e]; ok { + return val + } + return tw.Package.TypesInfo.TypeOf(e) +} + +func flattenBinaryExprTree(tw *trap.Writer, e ast.Expr, parent trap.Label, idx int) int { + binaryexpr, ok := e.(*ast.BinaryExpr) + if ok { + idx = flattenBinaryExprTree(tw, binaryexpr.X, parent, idx) + idx = flattenBinaryExprTree(tw, binaryexpr.Y, parent, idx) + } else { + extractExpr(tw, e, parent, idx) + idx = idx + 1 + } + return idx +} + +func extractTypeParamDecls(tw *trap.Writer, fields *ast.FieldList, parent trap.Label) { + if fields == nil || fields.List == nil { + return + } + + // Type set literals can occur as the type in a type parameter declaration, + // so we ensure that they are union typed. + makeTypeSetLiteralsUnionTyped(tw, fields) + + idx := 0 + for _, field := range fields.List { + lbl := tw.Labeler.LocalID(field) + dbscheme.TypeParamDeclsTable.Emit(tw, lbl, parent, idx) + extractNodeLocation(tw, field, lbl) + if field.Names != nil { + for i, name := range field.Names { + extractExpr(tw, name, lbl, i+1) + } + } + extractExpr(tw, field.Type, lbl, 0) + extractDoc(tw, field.Doc, lbl) + idx += 1 + } +} + +// populateTypeParamParents sets `parent` as the parent of the elements of `typeparams` +func populateTypeParamParents(tw *trap.Writer, typeparams *types.TypeParamList, parent types.Object) { + if typeparams != nil { + for idx := 0; idx < typeparams.Len(); idx++ { + setTypeParamParent(typeparams.At(idx), parent) + } + } +} + +// getobjectBeingUsed looks up `ident` in `tw.Package.TypesInfo.Uses` and makes +// some changes to the object to avoid returning objects relating to instantiated +// types. +func getObjectBeingUsed(tw *trap.Writer, ident *ast.Ident) types.Object { + obj := tw.Package.TypesInfo.Uses[ident] + if obj == nil { + return nil + } + if override, ok := tw.ObjectsOverride[obj]; ok { + return override + } + if funcObj, ok := obj.(*types.Func); ok { + sig := funcObj.Type().(*types.Signature) + if recv := sig.Recv(); recv != nil { + recvType := recv.Type() + originType, isSame := tryGetGenericType(recvType) + + if originType == nil { + if pointerType, ok := recvType.(*types.Pointer); ok { + originType, isSame = tryGetGenericType(pointerType.Elem()) + } + } + + if originType == nil || isSame { + return obj + } + + for i := 0; i < originType.NumMethods(); i++ { + meth := originType.Method(i) + if meth.Name() == funcObj.Name() { + return meth + } + } + if interfaceType, ok := originType.Underlying().(*types.Interface); ok { + for i := 0; i < interfaceType.NumMethods(); i++ { + meth := interfaceType.Method(i) + if meth.Name() == funcObj.Name() { + return meth + } + } + } + log.Fatalf("Could not find method %s on type %s", funcObj.Name(), originType) + } + } + + return obj +} + +// tryGetGenericType returns the generic type of `tp`, and a boolean indicating +// whether it is the same as `tp`. +func tryGetGenericType(tp types.Type) (*types.Named, bool) { + if namedType, ok := tp.(*types.Named); ok { + originType := namedType.Origin() + return originType, namedType == originType + } + return nil, false +} + +// trackInstantiatedStructFields tries to give the fields of an instantiated +// struct type underlying `tp` the same labels as the corresponding fields of +// the generic struct type. This is so that when we come across the +// instantiated field in `tw.Package.TypesInfo.Uses` we will get the label for +// the generic field instead. +func trackInstantiatedStructFields(tw *trap.Writer, tp, origintp *types.Named) { + if tp == origintp { + return + } + + if instantiatedStruct, ok := tp.Underlying().(*types.Struct); ok { + genericStruct, ok2 := origintp.Underlying().(*types.Struct) + if !ok2 { + log.Fatalf( + "Error: underlying type of instantiated type is a struct but underlying type of generic type is %s", + origintp.Underlying()) + } + + if instantiatedStruct.NumFields() != genericStruct.NumFields() { + log.Fatalf( + "Error: instantiated struct %s has different number of fields than the generic version %s (%d != %d)", + instantiatedStruct, genericStruct, instantiatedStruct.NumFields(), genericStruct.NumFields()) + } + + for i := 0; i < instantiatedStruct.NumFields(); i++ { + tw.ObjectsOverride[instantiatedStruct.Field(i)] = genericStruct.Field(i) + } + } +} + +func getTypeParamParentLabel(tw *trap.Writer, tp *types.TypeParam) trap.Label { + parent, exists := typeParamParent[tp] + if !exists { + log.Fatalf("Parent of type parameter does not exist: %s %s", tp.String(), tp.Constraint().String()) + } + parentlbl, _ := tw.Labeler.ScopedObjectID(parent, func() trap.Label { + log.Fatalf("getTypeLabel() called for parent of type parameter %s", tp.String()) + return trap.InvalidLabel + }) + return parentlbl +} + +func setTypeParamParent(tp *types.TypeParam, newobj types.Object) { + obj, exists := typeParamParent[tp] + if !exists { + typeParamParent[tp] = newobj + } else if newobj != obj { + log.Fatalf("Parent of type parameter '%s %s' being set to a different value: '%s' vs '%s'", tp.String(), tp.Constraint().String(), obj, newobj) + } +} diff --git a/go/extractor/gomodextractor.go b/go/extractor/gomodextractor.go new file mode 100644 index 00000000000..5a6a26281bc --- /dev/null +++ b/go/extractor/gomodextractor.go @@ -0,0 +1,201 @@ +package extractor + +import ( + "fmt" + "golang.org/x/mod/modfile" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + + "github.com/github/codeql-go/extractor/dbscheme" + "github.com/github/codeql-go/extractor/srcarchive" + "github.com/github/codeql-go/extractor/trap" +) + +func (extraction *Extraction) extractGoMod(path string) error { + if normPath, err := filepath.EvalSymlinks(path); err == nil { + path = normPath + } + + extraction.Lock.Lock() + if extraction.SeenGoMods[path] { + extraction.Lock.Unlock() + return nil + } + + extraction.SeenGoMods[path] = true + extraction.Lock.Unlock() + + tw, err := trap.NewWriter(path, nil) + if err != nil { + return err + } + defer tw.Close() + + err = srcarchive.Add(path) + if err != nil { + return err + } + + extraction.extractFileInfo(tw, path) + + file, err := os.Open(path) + if err != nil { + return fmt.Errorf("failed to open go.mod file %s: %s", path, err.Error()) + } + data, err := ioutil.ReadAll(file) + if err != nil { + return fmt.Errorf("failed to read go.mod file %s: %s", path, err.Error()) + } + + modfile, err := modfile.Parse(path, data, nil) + if err != nil { + return fmt.Errorf("failed to parse go.mod file %s: %s", path, err.Error()) + } + + extractGoModFile(tw, modfile.Syntax) + + return nil +} + +type commentGroupIdxAllocator struct { + nextIdx int +} + +func (cgIdxAlloc *commentGroupIdxAllocator) nextCgIdx() int { + ret := cgIdxAlloc.nextIdx + cgIdxAlloc.nextIdx++ + return ret +} + +func extractGoModFile(tw *trap.Writer, file *modfile.FileSyntax) { + cgIdxAlloc := commentGroupIdxAllocator{0} + + for idx, stmt := range file.Stmt { + extractGoModExpr(tw, stmt, tw.Labeler.FileLabel(), idx, &cgIdxAlloc) + } + + extractGoModComments(tw, file, tw.Labeler.FileLabel(), &cgIdxAlloc) +} + +func extractGoModExpr(tw *trap.Writer, expr modfile.Expr, parent trap.Label, idx int, cgIdxAlloc *commentGroupIdxAllocator) { + lbl := tw.Labeler.LocalID(expr) + + var kind int + switch expr := expr.(type) { + case *modfile.CommentBlock: + kind = dbscheme.ModCommentBlockType.Index() + case *modfile.LParen: + kind = dbscheme.ModLParenType.Index() + case *modfile.RParen: + kind = dbscheme.ModRParenType.Index() + case *modfile.Line: + kind = dbscheme.ModLineType.Index() + for idx, tok := range expr.Token { + dbscheme.ModTokensTable.Emit(tw, tok, lbl, idx) + } + case *modfile.LineBlock: + kind = dbscheme.ModLineBlockType.Index() + for idx, tok := range expr.Token { + dbscheme.ModTokensTable.Emit(tw, tok, lbl, idx) + } + extractGoModExpr(tw, &expr.LParen, lbl, 0, cgIdxAlloc) + for idx, line := range expr.Line { + extractGoModExpr(tw, line, lbl, idx+1, cgIdxAlloc) + } + extractGoModExpr(tw, &expr.RParen, lbl, len(expr.Line)+1, cgIdxAlloc) + default: + log.Fatalf("unknown go.mod expression of type %T", expr) + } + + dbscheme.ModExprsTable.Emit(tw, lbl, kind, parent, idx) + + extractGoModComments(tw, expr, lbl, cgIdxAlloc) + + start, end := expr.Span() + extractLocation(tw, lbl, start.Line, start.LineRune, end.Line, end.LineRune) +} + +type GoModExprCommentWrapper struct { + expr modfile.Expr +} + +func minInt(a int, b int) int { + if a < b { + return a + } + return b +} + +func maxInt(a int, b int) int { + if a > b { + return a + } + return b +} + +func lexMin(a1 int, a2 int, b1 int, b2 int) (int, int) { + if a1 < b1 { + return a1, a2 + } else if a1 > b1 { + return b1, b2 + } else { + return a1, minInt(b1, b2) + } +} + +func lexMax(a1 int, a2 int, b1 int, b2 int) (int, int) { + if a1 < b1 { + return b1, b2 + } else if a1 > b1 { + return a1, a2 + } else { + return a1, maxInt(b1, b2) + } +} + +func extractGoModComments(tw *trap.Writer, expr modfile.Expr, exprlbl trap.Label, cgIdxAlloc *commentGroupIdxAllocator) { + comments := expr.Comment() + + if len(comments.Before) == 0 && len(comments.Suffix) == 0 && len(comments.After) == 0 { + return + } + + // extract a pseudo `@commentgroup` for each expr that contains their associated comments + grouplbl := tw.Labeler.LocalID(GoModExprCommentWrapper{expr}) + dbscheme.CommentGroupsTable.Emit(tw, grouplbl, tw.Labeler.FileLabel(), cgIdxAlloc.nextCgIdx()) + dbscheme.DocCommentsTable.Emit(tw, exprlbl, grouplbl) + + var allComments []modfile.Comment + allComments = append(allComments, comments.Before...) + allComments = append(allComments, comments.Suffix...) + allComments = append(allComments, comments.After...) + + var startLine, startCol, endLine, endCol int = 0, 0, 0, 0 + var first bool = true + idx := 0 + for _, comment := range allComments { + commentToken := strings.TrimSuffix(strings.TrimSuffix(comment.Token, "\n"), "\r") + extractGoModComment(tw, comment, commentToken, grouplbl, idx) + idx++ + commentEndCol := comment.Start.LineRune + (len(commentToken) - 1) + if first { + startLine, startCol, endLine, endCol = comment.Start.Line, comment.Start.LineRune, comment.Start.Line, commentEndCol + first = false + } else { + startLine, startCol = lexMin(comment.Start.Line, comment.Start.LineRune, startLine, startCol) + endLine, endCol = lexMax(comment.Start.Line, commentEndCol, endLine, endCol) + } + } + + extractLocation(tw, grouplbl, startLine, startCol, endLine, endCol) +} + +func extractGoModComment(tw *trap.Writer, comment modfile.Comment, commentToken string, grouplbl trap.Label, idx int) { + lbl := tw.Labeler.LocalID(comment) + dbscheme.CommentsTable.Emit(tw, lbl, dbscheme.SlashSlashComment.Index(), grouplbl, idx, commentToken) + + extractLocation(tw, lbl, comment.Start.Line, comment.Start.LineRune, comment.Start.Line, comment.Start.LineRune+(len(commentToken)-1)) +} diff --git a/go/extractor/net/sourceforge/pmd/cpd/AbstractLanguage.java b/go/extractor/net/sourceforge/pmd/cpd/AbstractLanguage.java new file mode 100644 index 00000000000..363be4e8fa1 --- /dev/null +++ b/go/extractor/net/sourceforge/pmd/cpd/AbstractLanguage.java @@ -0,0 +1,13 @@ +package net.sourceforge.pmd.cpd; + +/* + * This is a stub definition for pmd's AbstractLanguage class + * including only the API used by the GoLanguage class. + */ + +public abstract class AbstractLanguage { + + public AbstractLanguage(String... extensions) {} + + public abstract Tokenizer getTokenizer(boolean fuzzyMatch); +} diff --git a/go/extractor/net/sourceforge/pmd/cpd/GoLanguage.java b/go/extractor/net/sourceforge/pmd/cpd/GoLanguage.java new file mode 100644 index 00000000000..400a52c0e0d --- /dev/null +++ b/go/extractor/net/sourceforge/pmd/cpd/GoLanguage.java @@ -0,0 +1,68 @@ +package net.sourceforge.pmd.cpd; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.ProcessBuilder.Redirect; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.List; +import opencsv.CSVReader; + +public class GoLanguage extends AbstractLanguage { + public GoLanguage() { + super(".go"); + } + + @Override + public Tokenizer getTokenizer(final boolean fuzzyMatch) { + return new Tokenizer() { + @Override + public void tokenize(SourceCode tokens, List tokenEntries) { + String fileName = tokens.getFileName(); + String platform = "linux", exe = ""; + + String osName = System.getProperty("os.name", "unknown"); + if (osName.contains("Windows")) { + platform = "win"; + exe = ".exe"; + } else if (osName.contains("Mac OS X")) { + platform = "osx"; + } + + // get tools folder from SEMMLE_DIST + String toolsDir = null; + String dist = System.getenv("SEMMLE_DIST"); + if (dist != null && !dist.isEmpty()) { + toolsDir = dist + "/language-packs/go/tools/platform/" + platform; + } + + String goTokenizer = toolsDir == null ? "go-tokenizer" : toolsDir + "/bin/go-tokenizer"; + goTokenizer += exe; + ProcessBuilder pb = new ProcessBuilder(Paths.get(goTokenizer).toString(), fileName); + pb.redirectError(Redirect.INHERIT); + try { + Process process = pb.start(); + try ( + CSVReader r = new CSVReader(new InputStreamReader(process.getInputStream(), Charset.forName("UTF-8"))) + ) { + String[] row; + while ((row = r.readNext()) != null) { + String text = row[0]; + String fuzzyText = row[1]; + int beginLine = Integer.parseInt(row[2]); + int beginColumn = Integer.parseInt(row[3]); + int endLine = Integer.parseInt(row[4]); + int endColumn = Integer.parseInt(row[5]); + tokenEntries.add(new TokenEntry(fuzzyMatch ? text : fuzzyText, fileName, beginLine, beginColumn, endLine, endColumn)); + } + } + int exitCode = process.waitFor(); + if (exitCode != 0) + throw new RuntimeException("Tokenizing " + fileName + " returned " + exitCode + "."); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } + }; + } +} diff --git a/go/extractor/net/sourceforge/pmd/cpd/SourceCode.java b/go/extractor/net/sourceforge/pmd/cpd/SourceCode.java new file mode 100644 index 00000000000..f3ad49f8343 --- /dev/null +++ b/go/extractor/net/sourceforge/pmd/cpd/SourceCode.java @@ -0,0 +1,12 @@ +package net.sourceforge.pmd.cpd; + +/* + * This is a stub definition for pmd's SourceCode class + * including only the API used by the GoLanguage class. + */ + +public class SourceCode { + public String getFileName() { + return null; + } +} diff --git a/go/extractor/net/sourceforge/pmd/cpd/TokenEntry.java b/go/extractor/net/sourceforge/pmd/cpd/TokenEntry.java new file mode 100644 index 00000000000..d599ebea367 --- /dev/null +++ b/go/extractor/net/sourceforge/pmd/cpd/TokenEntry.java @@ -0,0 +1,11 @@ +package net.sourceforge.pmd.cpd; + +/* + * This is a stub definition for pmd's TokenEntry class + * including only the API used by the GoLanguage class. + */ + +public class TokenEntry { + public TokenEntry(String image, String tokenSrcID, int beginLine, int beginColumn, int endLine, int endColumn) { + } +} diff --git a/go/extractor/net/sourceforge/pmd/cpd/Tokenizer.java b/go/extractor/net/sourceforge/pmd/cpd/Tokenizer.java new file mode 100644 index 00000000000..cc94bbbb149 --- /dev/null +++ b/go/extractor/net/sourceforge/pmd/cpd/Tokenizer.java @@ -0,0 +1,12 @@ +package net.sourceforge.pmd.cpd; + +/* + * This is a stub definition for pmd's Tokenizer interface + * including only the API used by the GoLanguage class. + */ + +import java.util.List; + +public interface Tokenizer { + void tokenize(SourceCode tokens, List tokenEntries); +} diff --git a/go/extractor/opencsv/CSVParser.java b/go/extractor/opencsv/CSVParser.java new file mode 100644 index 00000000000..e3a864bef3f --- /dev/null +++ b/go/extractor/opencsv/CSVParser.java @@ -0,0 +1,207 @@ +/** + Copyright 2005 Bytecode Pty Ltd. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package opencsv; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * A very simple CSV parser released under a commercial-friendly license. + * This just implements splitting a single line into fields. + * + * @author Glen Smith + * @author Rainer Pruy + * + */ +public class CSVParser { + + private final char separator; + + private final char quotechar; + + private final char escape; + + private final boolean strictQuotes; + + private StringBuilder buf = new StringBuilder(INITIAL_READ_SIZE); + + /** The default separator to use if none is supplied to the constructor. */ + public static final char DEFAULT_SEPARATOR = ','; + + private static final int INITIAL_READ_SIZE = 128; + + /** + * The default quote character to use if none is supplied to the + * constructor. + */ + public static final char DEFAULT_QUOTE_CHARACTER = '"'; + + + /** + * The default escape character to use if none is supplied to the + * constructor. + */ + public static final char DEFAULT_ESCAPE_CHARACTER = '"'; + + /** + * The default strict quote behavior to use if none is supplied to the + * constructor + */ + public static final boolean DEFAULT_STRICT_QUOTES = false; + + /** + * Constructs CSVReader with supplied separator and quote char. + * Allows setting the "strict quotes" flag + * @param separator + * the delimiter to use for separating entries + * @param quotechar + * the character to use for quoted elements + * @param escape + * the character to use for escaping a separator or quote + * @param strictQuotes + * if true, characters outside the quotes are ignored + */ + CSVParser(char separator, char quotechar, char escape, boolean strictQuotes) { + this.separator = separator; + this.quotechar = quotechar; + this.escape = escape; + this.strictQuotes = strictQuotes; + } + + /** + * + * @return true if something was left over from last call(s) + */ + public boolean isPending() { + return buf.length() != 0; + } + + public String[] parseLineMulti(String nextLine) throws IOException { + return parseLine(nextLine, true); + } + + public String[] parseLine(String nextLine) throws IOException { + return parseLine(nextLine, false); + } + /** + * Parses an incoming String and returns an array of elements. + * + * @param nextLine + * the string to parse + * @return the comma-tokenized list of elements, or null if nextLine is null + * @throws IOException if bad things happen during the read + */ + private String[] parseLine(String nextLine, boolean multi) throws IOException { + + if (!multi && isPending()) { + clear(); + } + + if (nextLine == null) { + if (isPending()) { + String s = buf.toString(); + clear(); + return new String[] {s}; + } else { + return null; + } + } + + ListtokensOnThisLine = new ArrayList(); + boolean inQuotes = isPending(); + for (int i = 0; i < nextLine.length(); i++) { + + char c = nextLine.charAt(i); + if (c == this.escape && isNextCharacterEscapable(nextLine, inQuotes, i)) { + buf.append(nextLine.charAt(i+1)); + i++; + } else if (c == quotechar) { + if( isNextCharacterEscapedQuote(nextLine, inQuotes, i) ){ + buf.append(nextLine.charAt(i+1)); + i++; + }else{ + inQuotes = !inQuotes; + // the tricky case of an embedded quote in the middle: a,bc"d"ef,g + if (!strictQuotes) { + if(i>2 //not on the beginning of the line + && nextLine.charAt(i-1) != this.separator //not at the beginning of an escape sequence + && nextLine.length()>(i+1) && + nextLine.charAt(i+1) != this.separator //not at the end of an escape sequence + ){ + buf.append(c); + } + } + } + } else if (c == separator && !inQuotes) { + tokensOnThisLine.add(buf.toString()); + clear(); // start work on next token + } else { + if (!strictQuotes || inQuotes) + buf.append(c); + } + } + // line is done - check status + if (inQuotes) { + if (multi) { + // continuing a quoted section, re-append newline + buf.append('\n'); + // this partial content is not to be added to field list yet + } else { + throw new IOException("Un-terminated quoted field at end of CSV line"); + } + } else { + tokensOnThisLine.add(buf.toString()); + clear(); + } + return tokensOnThisLine.toArray(new String[tokensOnThisLine.size()]); + + } + + /** + * precondition: the current character is a quote or an escape + * @param nextLine the current line + * @param inQuotes true if the current context is quoted + * @param i current index in line + * @return true if the following character is a quote + */ + private boolean isNextCharacterEscapedQuote(String nextLine, boolean inQuotes, int i) { + return inQuotes // we are in quotes, therefore there can be escaped quotes in here. + && nextLine.length() > (i+1) // there is indeed another character to check. + && nextLine.charAt(i+1) == quotechar; + } + + /** + * precondition: the current character is an escape + * @param nextLine the current line + * @param inQuotes true if the current context is quoted + * @param i current index in line + * @return true if the following character is a quote + */ + protected boolean isNextCharacterEscapable(String nextLine, boolean inQuotes, int i) { + return inQuotes // we are in quotes, therefore there can be escaped quotes in here. + && nextLine.length() > (i+1) // there is indeed another character to check. + && ( nextLine.charAt(i+1) == quotechar || nextLine.charAt(i+1) == this.escape); + } + + /** + * Reset the buffer used for storing the current field's value + */ + private void clear() { + buf.setLength(0); + } +} diff --git a/go/extractor/opencsv/CSVReader.java b/go/extractor/opencsv/CSVReader.java new file mode 100644 index 00000000000..11b537e4995 --- /dev/null +++ b/go/extractor/opencsv/CSVReader.java @@ -0,0 +1,192 @@ +/** + Copyright 2005 Bytecode Pty Ltd. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package opencsv; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +/** + * A very simple CSV reader released under a commercial-friendly license. + * + * @author Glen Smith + * + */ +public class CSVReader implements Closeable { + + private final BufferedReader br; + + private boolean hasNext = true; + + private final CSVParser parser; + + private final int skipLines; + + private boolean linesSkipped; + + /** The line number of the last physical line read (one-based). */ + private int curline = 0; + + /** The physical line number at which the last logical line read started (one-based). */ + private int startLine = 0; + + /** + * The default line to start reading. + */ + private static final int DEFAULT_SKIP_LINES = 0; + + /** + * Constructs CSVReader using a comma for the separator. + * + * @param reader + * the reader to an underlying CSV source. + */ + public CSVReader(Reader reader) { + this(reader, + CSVParser.DEFAULT_SEPARATOR, CSVParser.DEFAULT_QUOTE_CHARACTER, + CSVParser.DEFAULT_ESCAPE_CHARACTER, DEFAULT_SKIP_LINES, + CSVParser.DEFAULT_STRICT_QUOTES); + } + + /** + * Constructs CSVReader with supplied separator and quote char. + * + * @param reader + * the reader to an underlying CSV source. + * @param separator + * the delimiter to use for separating entries + * @param quotechar + * the character to use for quoted elements + * @param escape + * the character to use for escaping a separator or quote + * @param line + * the line number to skip for start reading + * @param strictQuotes + * sets if characters outside the quotes are ignored + */ + private CSVReader(Reader reader, char separator, char quotechar, char escape, int line, boolean strictQuotes) { + this.br = new BufferedReader(reader); + this.parser = new CSVParser(separator, quotechar, escape, strictQuotes); + this.skipLines = line; + } + + + /** + * Reads the entire file into a List with each element being a String[] of + * tokens. + * + * @return a List of String[], with each String[] representing a line of the + * file. + * + * @throws IOException + * if bad things happen during the read + */ + public List readAll() throws IOException { + + List allElements = new ArrayList(); + while (hasNext) { + String[] nextLineAsTokens = readNext(); + if (nextLineAsTokens != null) + allElements.add(nextLineAsTokens); + } + return allElements; + + } + + /** + * Reads the next line from the buffer and converts to a string array. + * + * @return a string array with each comma-separated element as a separate + * entry, or null if there are no more lines to read. + * + * @throws IOException + * if bad things happen during the read + */ + public String[] readNext() throws IOException { + boolean first = true; + String[] result = null; + do { + String nextLine = getNextLine(); + + if (first) { + startLine = curline; + first = false; + } + + if (!hasNext) { + return result; // should throw if still pending? + } + String[] r = parser.parseLineMulti(nextLine); + if (r.length > 0) { + if (result == null) { + result = r; + } else { + String[] t = new String[result.length+r.length]; + System.arraycopy(result, 0, t, 0, result.length); + System.arraycopy(r, 0, t, result.length, r.length); + result = t; + } + } + } while (parser.isPending()); + return result; + } + + /** + * Reads the next line from the file. + * + * @return the next line from the file without trailing newline + * @throws IOException + * if bad things happen during the read + */ + private String getNextLine() throws IOException { + if (!this.linesSkipped) { + for (int i = 0; i < skipLines; i++) { + br.readLine(); + ++curline; + } + this.linesSkipped = true; + } + String nextLine = br.readLine(); + if (nextLine == null) { + hasNext = false; + } else { + ++curline; + } + return hasNext ? nextLine : null; + } + + /** + * Closes the underlying reader. + * + * @throws IOException if the close fails + */ + @Override + public void close() throws IOException{ + br.close(); + } + + /** + * Return the physical line number (one-based) at which the last logical line read started, + * or zero if no line has been read yet. + */ + public int getStartLine() { + return startLine; + } +} diff --git a/go/extractor/semaphore.go b/go/extractor/semaphore.go new file mode 100644 index 00000000000..127f94aa6d0 --- /dev/null +++ b/go/extractor/semaphore.go @@ -0,0 +1,42 @@ +package extractor + +import ( + "log" +) + +type Unit struct{} + +var unit = Unit{} + +type semaphore struct { + counter, lock chan Unit +} + +func (s *semaphore) acquire(n int) { + if s != nil { + if cap(s.counter) < n { + log.Fatalf("Tried to acquire more resources than were available.") + } + s.lock <- unit + for i := 0; i < n; i++ { + s.counter <- unit + } + <-s.lock + } +} + +func (s *semaphore) release(n int) { + if s != nil { + for i := 0; i < n; i++ { + <-s.counter + } + } +} + +func newSemaphore(max int) *semaphore { + if max > 0 { + return &semaphore{make(chan Unit, max), make(chan Unit, 1)} + } else { + return nil + } +} diff --git a/go/extractor/srcarchive/projectlayout.go b/go/extractor/srcarchive/projectlayout.go new file mode 100644 index 00000000000..da717dd4217 --- /dev/null +++ b/go/extractor/srcarchive/projectlayout.go @@ -0,0 +1,105 @@ +package srcarchive + +import ( + "bufio" + "errors" + "fmt" + "os" + "strings" +) + +// ProjectLayout describes a very simple project layout rewriting paths starting +// with `from` to start with `to` instead. +// +// We currently only support project layouts of the form +// +// # to +// from// +type ProjectLayout struct { + from, to string +} + +// normaliseSlashes adds an initial slash to `path` if there isn't one, and trims +// a final slash if there is one +func normaliseSlashes(path string) string { + if !strings.HasPrefix(path, "/") { + path = "/" + path + } + return strings.TrimSuffix(path, "/") +} + +// LoadProjectLayout loads a project layout from the given file, returning an error +// if the file does not have the right format +func LoadProjectLayout(file *os.File) (*ProjectLayout, error) { + res := ProjectLayout{} + scanner := bufio.NewScanner(file) + + line := "" + for ; line == "" && scanner.Scan(); line = strings.TrimSpace(scanner.Text()) { + } + + if !strings.HasPrefix(line, "#") { + return nil, fmt.Errorf("first line of project layout should start with #, but got %s", line) + } + res.to = normaliseSlashes(strings.TrimSpace(strings.TrimPrefix(line, "#"))) + + if !scanner.Scan() { + return nil, errors.New("empty section in project-layout file") + } + + line = strings.TrimSpace(scanner.Text()) + + if !strings.HasSuffix(line, "//") { + return nil, errors.New("unsupported project-layout feature") + } + line = strings.TrimSuffix(line, "//") + + if strings.HasPrefix(line, "-") || strings.Contains(line, "*") || strings.Contains(line, "//") { + return nil, errors.New("unsupported project-layout feature") + } + res.from = normaliseSlashes(line) + + for scanner.Scan() { + if strings.TrimSpace(scanner.Text()) != "" { + return nil, errors.New("only one section with one rewrite supported") + } + } + + return &res, nil +} + +// transformString transforms `str` as specified by the project layout: if it starts with the `from` +// prefix, that prefix is relaced by `to`; otherwise the string is returned unchanged +func (p *ProjectLayout) transformString(str string) string { + if str == p.from { + return p.to + } + if strings.HasPrefix(str, p.from+"/") { + return p.to + "/" + str[len(p.from)+1:] + } + return str +} + +// isWindowsPath checks whether the substring of `path` starting at `idx` looks like a (slashified) +// Windows path, that is, starts with a drive letter followed by a colon and a slash +func isWindowsPath(path string, idx int) bool { + return len(path) >= 3+idx && + path[idx] != '/' && + path[idx+1] == ':' && path[idx+2] == '/' +} + +// Transform transforms the given path according to the project layout: if it starts with the `from` +// prefix, that prefix is relaced by `to`; otherwise the path is returned unchanged. +// +// Unlike the (internal) method `transformString`, this method handles Windows paths sensibly. +func (p *ProjectLayout) Transform(path string) string { + if isWindowsPath(path, 0) { + result := p.transformString("/" + path) + if isWindowsPath(result, 1) && result[0] == '/' { + return result[1:] + } + return result + } else { + return p.transformString(path) + } +} diff --git a/go/extractor/srcarchive/projectlayout_test.go b/go/extractor/srcarchive/projectlayout_test.go new file mode 100644 index 00000000000..fb9f180ff7e --- /dev/null +++ b/go/extractor/srcarchive/projectlayout_test.go @@ -0,0 +1,136 @@ +package srcarchive + +import ( + "io/ioutil" + "os" + "testing" +) + +func mkProjectLayout(projectLayoutSource string, t *testing.T) (*ProjectLayout, error) { + pt, err := ioutil.TempFile("", "path-transformer") + if err != nil { + t.Fatalf("Unable to create temporary file for project layout: %s", err.Error()) + } + defer os.Remove(pt.Name()) + _, err = pt.WriteString(projectLayoutSource) + if err != nil { + t.Fatalf("Unable to write to temporary file for project layout: %s", err.Error()) + } + err = pt.Close() + if err != nil { + t.Fatalf("Unable to close path transformer file: %s.", err.Error()) + } + + pt, err = os.Open(pt.Name()) + if err != nil { + t.Fatalf("Unable to open path transformer file: %s.", err.Error()) + } + + return LoadProjectLayout(pt) +} + +func testTransformation(projectLayout *ProjectLayout, t *testing.T, path string, expected string) { + actual := projectLayout.Transform(path) + if actual != expected { + t.Errorf("Expected %s to be transformed to %s, but got %s", path, expected, actual) + } +} + +func TestValidProjectLayout(t *testing.T) { + p, err := mkProjectLayout(` +# /opt/src +/opt/src/root/src/org/repo// +`, t) + + if err != nil { + t.Fatalf("Error loading project layout: %s", err.Error()) + } + + testTransformation(p, t, "/opt/src/root/src/org/repo", "/opt/src") + testTransformation(p, t, "/opt/src/root/src/org/repo/", "/opt/src/") + testTransformation(p, t, "/opt/src/root/src/org/repo/main.go", "/opt/src/main.go") + testTransformation(p, t, "/opt/not/in/src", "/opt/not/in/src") + testTransformation(p, t, "/opt/src/root/srcorg/repo", "/opt/src/root/srcorg/repo") + testTransformation(p, t, "opt/src/root/src/org/repo", "opt/src/root/src/org/repo") +} + +func TestWindowsPaths(t *testing.T) { + p, err := mkProjectLayout(` +# /c:/virtual +/d:// +`, t) + + if err != nil { + t.Fatalf("Error loading project layout: %s", err.Error()) + } + + testTransformation(p, t, "d:/foo", "c:/virtual/foo") +} + +func TestWindowsToUnixPaths(t *testing.T) { + p, err := mkProjectLayout(` +# /opt/src +/d:// +`, t) + + if err != nil { + t.Fatalf("Error loading project layout: %s", err.Error()) + } + + testTransformation(p, t, "d:/foo", "/opt/src/foo") +} + +func TestEmptyProjectLayout(t *testing.T) { + _, err := mkProjectLayout("", t) + if err == nil { + t.Error("Expected error on empty project layout") + } +} + +func TestEmptyProjectLayout2(t *testing.T) { + _, err := mkProjectLayout(` + `, t) + if err == nil { + t.Error("Expected error on empty project layout") + } +} + +func TestExclusion(t *testing.T) { + _, err := mkProjectLayout(` +# /opt/src +-/foo// +`, t) + if err == nil { + t.Error("Expected error on exclusion") + } +} + +func TestStar(t *testing.T) { + _, err := mkProjectLayout(` +# /opt/src +/foo/**/bar// +`, t) + if err == nil { + t.Error("Expected error on star") + } +} + +func TestDoubleSlash(t *testing.T) { + _, err := mkProjectLayout(` +# /opt/src +/foo//bar// +`, t) + if err == nil { + t.Error("Expected error on multiple double slashes") + } +} + +func TestInternalDoubleSlash(t *testing.T) { + _, err := mkProjectLayout(` +# /opt/src +/foo//bar +`, t) + if err == nil { + t.Error("Expected error on internal double slash") + } +} diff --git a/go/extractor/srcarchive/srcarchive.go b/go/extractor/srcarchive/srcarchive.go new file mode 100644 index 00000000000..ee9aea43064 --- /dev/null +++ b/go/extractor/srcarchive/srcarchive.go @@ -0,0 +1,85 @@ +package srcarchive + +import ( + "errors" + "io" + "log" + "os" + "path/filepath" + "strings" +) + +var pathTransformer *ProjectLayout + +func init() { + pt := os.Getenv("SEMMLE_PATH_TRANSFORMER") + if pt != "" { + ptf, err := os.Open(pt) + if err != nil { + log.Fatalf("Unable to open path transformer %s: %s.\n", pt, err.Error()) + } + pathTransformer, err = LoadProjectLayout(ptf) + if err != nil { + log.Fatalf("Unable to initialize path transformer: %s.\n", err.Error()) + } + } +} + +// Add inserts the file with the given `path` into the source archive, returning a non-nil +// error value if it fails +func Add(path string) error { + srcArchive, err := srcArchive() + if err != nil { + return err + } + + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + archiveFilePath := filepath.Join(srcArchive, AppendablePath(path)) + err = os.MkdirAll(filepath.Dir(archiveFilePath), 0755) + if err != nil { + return err + } + archiveFile, err := os.Create(archiveFilePath) + if err != nil { + return err + } + defer archiveFile.Close() + + _, err = io.Copy(archiveFile, file) + return err +} + +func srcArchive() (string, error) { + srcArchive := os.Getenv("CODEQL_EXTRACTOR_GO_SOURCE_ARCHIVE_DIR") + if srcArchive == "" { + srcArchive = os.Getenv("SOURCE_ARCHIVE") + } + if srcArchive == "" { + return "", errors.New("environment variable CODEQL_EXTRACTOR_GO_SOURCE_ARCHIVE_DIR not set") + } + err := os.MkdirAll(srcArchive, 0755) + if err != nil { + return "", err + } + return srcArchive, nil +} + +// TransformPath applies the transformations specified by `SEMMLE_PATH_TRANSFORMER` (if any) to the +// given path +func TransformPath(path string) string { + if pathTransformer != nil { + return filepath.FromSlash(pathTransformer.Transform(filepath.ToSlash(path))) + } + return path +} + +// AppendablePath transforms the given path and also replaces colons with underscores to make it +// possible to append it to a base path on Windows +func AppendablePath(path string) string { + return strings.ReplaceAll(TransformPath(path), ":", "_") +} diff --git a/go/extractor/trap/labels.go b/go/extractor/trap/labels.go new file mode 100644 index 00000000000..1e9bd298447 --- /dev/null +++ b/go/extractor/trap/labels.go @@ -0,0 +1,232 @@ +package trap + +import ( + "fmt" + "go/types" + + "github.com/github/codeql-go/extractor/util" +) + +// Label represents a label +type Label struct { + id string +} + +// InvalidLabel represents an uninitialized or otherwise invalid label +var InvalidLabel Label + +func (lbl *Label) String() string { + return lbl.id +} + +// Labeler is used to represent labels for a file. It is used to write +// associate objects with labels. +type Labeler struct { + tw *Writer + + nextid int + fileLabel Label + nodeLabels map[interface{}]Label // labels associated with AST nodes + scopeLabels map[*types.Scope]Label // labels associated with scopes + objectLabels map[types.Object]Label // labels associated with objects (that is, declared entities) + TypeLabels map[types.Type]Label // labels associated with types + keyLabels map[string]Label +} + +func newLabeler(tw *Writer) *Labeler { + return &Labeler{ + tw, + 10000, + InvalidLabel, + make(map[interface{}]Label), + make(map[*types.Scope]Label), + make(map[types.Object]Label), + make(map[types.Type]Label), + make(map[string]Label), + } +} + +func (l *Labeler) nextID() string { + var id = l.nextid + l.nextid++ + return fmt.Sprintf("#%d", id) +} + +// GlobalID associates a label with the given `key` and returns it +func (l *Labeler) GlobalID(key string) Label { + label, exists := l.keyLabels[key] + if !exists { + id := l.nextID() + fmt.Fprintf(l.tw.zip, "%s=@\"%s\"\n", id, escapeString(key)) + label = Label{id} + l.keyLabels[key] = label + } + return label +} + +// FileLabel returns the label for a file with path `path`. +func (l *Labeler) FileLabel() Label { + if l.fileLabel == InvalidLabel { + l.fileLabel = l.FileLabelFor(l.tw.path) + } + return l.fileLabel +} + +// FileLabelFor returns the label for the file for which the trap writer `tw` is associated +func (l *Labeler) FileLabelFor(path string) Label { + return l.GlobalID(util.EscapeTrapSpecialChars(path) + ";sourcefile") +} + +// LocalID associates a label with the given AST node `nd` and returns it +func (l *Labeler) LocalID(nd interface{}) Label { + label, exists := l.nodeLabels[nd] + if !exists { + label = l.FreshID() + l.nodeLabels[nd] = label + } + return label +} + +// FreshID creates a fresh label and returns it +func (l *Labeler) FreshID() Label { + id := l.nextID() + fmt.Fprintf(l.tw.zip, "%s=*\n", id) + return Label{id} +} + +// ScopeID associates a label with the given scope and returns it +func (l *Labeler) ScopeID(scope *types.Scope, pkg *types.Package) Label { + label, exists := l.scopeLabels[scope] + if !exists { + if scope == types.Universe { + label = l.GlobalID("universe;scope") + } else { + if pkg != nil && pkg.Scope() == scope { + // if this scope is the package scope + pkgLabel := l.GlobalID(util.EscapeTrapSpecialChars(pkg.Path()) + ";package") + label = l.GlobalID("{" + pkgLabel.String() + "};scope") + } else { + label = l.FreshID() + } + } + l.scopeLabels[scope] = label + } + return label +} + +// LookupObjectID looks up the label associated with the given object and returns it; if the object does not have +// a label yet, it tries to construct one based on its scope and/or name, and otherwise returns InvalidLabel +func (l *Labeler) LookupObjectID(object types.Object, typelbl Label) (Label, bool) { + label, exists := l.objectLabels[object] + if !exists { + if object.Parent() == nil { + // blank identifiers and the pseudo-package `.` (from `import . "..."` imports) can only be referenced + // once, so we can use a fresh label for them + if object.Name() == "_" || object.Name() == "." { + label = l.FreshID() + l.objectLabels[object] = label + return label, false + } + label = InvalidLabel + } else { + label, exists = l.ScopedObjectID(object, func() Label { return typelbl }) + } + } + return label, exists +} + +// ScopedObjectID associates a label with the given object and returns it, +// together with a flag indicating whether the object already had a label +// associated with it; the object must have a scope, since the scope's label is +// used to construct the label of the object. +// +// There is a special case for variables that are method receivers. When this is +// detected, we must construct a special label, as the variable can be reached +// from several files via the method. As the type label is required to construct +// the receiver object id, it is also required here. +func (l *Labeler) ScopedObjectID(object types.Object, getTypeLabel func() Label) (Label, bool) { + label, exists := l.objectLabels[object] + if !exists { + scope := object.Parent() + if scope == nil { + panic(fmt.Sprintf("Object has no scope: %v :: %v.\n", object, + l.tw.Package.Fset.Position(object.Pos()))) + } else { + // associate method receiver objects to special keys, because those can be + // referenced from other files via their method + meth := findMethodWithGivenReceiver(object.Type(), object) + if meth == nil { + if pointerType, ok := object.Type().(*types.Pointer); ok { + meth = findMethodWithGivenReceiver(pointerType.Elem(), object) + } + } + + if meth != nil { + methlbl, _ := l.MethodID(meth, getTypeLabel()) + label, _ = l.ReceiverObjectID(object, methlbl) + } else { + scopeLbl := l.ScopeID(scope, object.Pkg()) + label = l.GlobalID(fmt.Sprintf("{%v},%s;object", scopeLbl, object.Name())) + } + } + l.objectLabels[object] = label + } + return label, exists +} + +func findMethodWithGivenReceiver(tp types.Type, object types.Object) *types.Func { + if namedType, ok := tp.(*types.Named); ok { + for i := 0; i < namedType.NumMethods(); i++ { + meth := namedType.Method(i) + if object == meth.Type().(*types.Signature).Recv() { + return meth + } + } + } + return nil +} + +// ReceiverObjectID associates a label with the given object and returns it, together with a flag indicating whether +// the object already had a label associated with it; the object must be the receiver of `methlbl`, since that label +// is used to construct the label of the object +func (l *Labeler) ReceiverObjectID(object types.Object, methlbl Label) (Label, bool) { + label, exists := l.objectLabels[object] + if !exists { + // if we can't, construct a special label + label = l.GlobalID(fmt.Sprintf("{%v},%s;receiver", methlbl, object.Name())) + l.objectLabels[object] = label + } + return label, exists +} + +// FieldID associates a label with the given field and returns it, together with +// a flag indicating whether the field already had a label associated with it; +// the field must belong to `structlbl`, since that label is used to construct +// the label of the field. When the field name is the blank identifier `_`, +// `idx` is used to generate a unique name. +func (l *Labeler) FieldID(field *types.Var, idx int, structlbl Label) (Label, bool) { + label, exists := l.objectLabels[field] + if !exists { + name := field.Name() + // there can be multiple fields with the blank identifier, so use index to + // distinguish them + if field.Name() == "_" { + name = fmt.Sprintf("_%d", idx) + } + label = l.GlobalID(fmt.Sprintf("{%v},%s;field", structlbl, name)) + l.objectLabels[field] = label + } + return label, exists +} + +// MethodID associates a label with the given method and returns it, together with a flag indicating whether +// the method already had a label associated with it; the method must belong to `recvtyplbl`, since that label +// is used to construct the label of the method +func (l *Labeler) MethodID(method types.Object, recvtyplbl Label) (Label, bool) { + label, exists := l.objectLabels[method] + if !exists { + label = l.GlobalID(fmt.Sprintf("{%v},%s;method", recvtyplbl, method.Name())) + l.objectLabels[method] = label + } + return label, exists +} diff --git a/go/extractor/trap/trapwriter.go b/go/extractor/trap/trapwriter.go new file mode 100644 index 00000000000..4c0911e24d7 --- /dev/null +++ b/go/extractor/trap/trapwriter.go @@ -0,0 +1,168 @@ +package trap + +import ( + "bufio" + "compress/gzip" + "errors" + "fmt" + "go/ast" + "go/types" + "io/ioutil" + "os" + "path/filepath" + "unicode/utf8" + + "github.com/github/codeql-go/extractor/srcarchive" + "golang.org/x/tools/go/packages" +) + +// A Writer provides methods for writing data to a TRAP file +type Writer struct { + zip *gzip.Writer + w *bufio.Writer + file *os.File + Labeler *Labeler + path string + trapFilePath string + Package *packages.Package + TypesOverride map[ast.Expr]types.Type + ObjectsOverride map[types.Object]types.Object +} + +func FileFor(path string) (string, error) { + trapFolder, err := trapFolder() + if err != nil { + return "", err + } + + return filepath.Join(trapFolder, srcarchive.AppendablePath(path)+".trap.gz"), nil +} + +// NewWriter creates a TRAP file for the given path and returns a writer for +// writing to it +func NewWriter(path string, pkg *packages.Package) (*Writer, error) { + trapFilePath, err := FileFor(path) + if err != nil { + return nil, err + } + trapFileDir := filepath.Dir(trapFilePath) + err = os.MkdirAll(trapFileDir, 0755) + if err != nil { + return nil, err + } + tmpFile, err := ioutil.TempFile(trapFileDir, filepath.Base(trapFilePath)) + if err != nil { + return nil, err + } + bufioWriter := bufio.NewWriter(tmpFile) + zipWriter := gzip.NewWriter(bufioWriter) + tw := &Writer{ + zipWriter, + bufioWriter, + tmpFile, + nil, + path, + trapFilePath, + pkg, + make(map[ast.Expr]types.Type), + make(map[types.Object]types.Object), + } + tw.Labeler = newLabeler(tw) + return tw, nil +} + +func trapFolder() (string, error) { + trapFolder := os.Getenv("CODEQL_EXTRACTOR_GO_TRAP_DIR") + if trapFolder == "" { + trapFolder = os.Getenv("TRAP_FOLDER") + } + if trapFolder == "" { + return "", errors.New("environment variable CODEQL_EXTRACTOR_GO_TRAP_DIR not set") + } + err := os.MkdirAll(trapFolder, 0755) + if err != nil { + return "", err + } + return trapFolder, nil +} + +// Close the underlying file writer +func (tw *Writer) Close() error { + err := tw.zip.Close() + if err != nil { + // return zip-close error, but ignore file-close error + tw.file.Close() + return err + } + err = tw.w.Flush() + if err != nil { + // throw away close error because write errors are likely to be more important + tw.file.Close() + return err + } + err = tw.file.Close() + if err != nil { + return err + } + return os.Rename(tw.file.Name(), tw.trapFilePath) +} + +// ForEachObject iterates over all objects labeled by this labeler, and invokes +// the provided callback with a writer for the trap file, the object, and its +// label. It returns true if any extra objects were labeled and false otherwise. +func (tw *Writer) ForEachObject(cb func(*Writer, types.Object, Label)) bool { + // copy the objects into an array so that our behaviour is deterministic even + // if `cb` adds any new objects + i := 0 + objects := make([]types.Object, len(tw.Labeler.objectLabels)) + for k := range tw.Labeler.objectLabels { + objects[i] = k + i++ + } + + for _, object := range objects { + cb(tw, object, tw.Labeler.objectLabels[object]) + } + + return len(tw.Labeler.objectLabels) != len(objects) +} + +const max_strlen = 1024 * 1024 + +func capStringLength(s string) string { + // if the UTF8-encoded string is longer than 1MiB, we truncate it + if len(s) > max_strlen { + // to ensure that the truncated string is valid UTF-8, we find the last byte at or + // before index max_strlen that starts a UTF-8 encoded character, and then cut off + // right before that byte + end := max_strlen + for ; !utf8.RuneStart(s[end]); end-- { + } + return s[0:end] + } + return s +} + +// Emit writes out a tuple of values for the given `table` +func (tw *Writer) Emit(table string, values []interface{}) error { + fmt.Fprintf(tw.zip, "%s(", table) + for i, value := range values { + if i > 0 { + fmt.Fprint(tw.zip, ", ") + } + switch value := value.(type) { + case Label: + fmt.Fprint(tw.zip, value.id) + case string: + fmt.Fprintf(tw.zip, "\"%s\"", escapeString(capStringLength(value))) + case int: + fmt.Fprintf(tw.zip, "%d", value) + case float64: + fmt.Fprintf(tw.zip, "%e", value) + default: + return errors.New("Cannot emit value") + } + } + fmt.Fprintf(tw.zip, ")\n") + return nil +} diff --git a/go/extractor/trap/trapwriter_test.go b/go/extractor/trap/trapwriter_test.go new file mode 100644 index 00000000000..4fe1886b3ec --- /dev/null +++ b/go/extractor/trap/trapwriter_test.go @@ -0,0 +1,68 @@ +package trap + +import ( + "strings" + "testing" +) + +const ( + asciiChar = "*" + bmpChar = "\u2028" + nonBmpChar = "\U000101d0" +) + +func TestCapStringLength(t *testing.T) { + // test simple cases only involving ASCII characters + short := strings.Repeat(asciiChar, max_strlen-1) + if capStringLength(short) != short { + t.Errorf("Strings shorter than maximum length should not be truncated") + } + + short = strings.Repeat(asciiChar, max_strlen) + if capStringLength(short) != short { + t.Errorf("Strings no longer than maximum length should not be truncated") + } + + long := strings.Repeat(asciiChar, max_strlen+1) + if capStringLength(long) != long[0:max_strlen] { + t.Errorf("Strings longer than maximum length should be truncated") + } + + // test chopping off non-ASCII characters + prefix := strings.Repeat(asciiChar, max_strlen) + long = prefix + bmpChar + if capStringLength(long) != prefix { + t.Errorf("BMP character after max_strlen should be correctly chopped off") + } + + prefix = strings.Repeat(asciiChar, max_strlen) + long = prefix + nonBmpChar + if capStringLength(long) != prefix { + t.Errorf("Non-BMP character after max_strlen should be correctly chopped off") + } + + prefix = strings.Repeat(asciiChar, max_strlen-(len(bmpChar)-1)) + long = prefix + bmpChar + if capStringLength(long) != prefix { + t.Errorf("BMP character straddling max_strlen should be correctly chopped off") + } + + prefix = strings.Repeat(asciiChar, max_strlen-(len(nonBmpChar)-1)) + long = prefix + nonBmpChar + if capStringLength(long) != prefix { + t.Errorf("Non-BMP character straddling max_strlen should be correctly chopped off") + } + + // test preserving non-ASCII characters that just about fit + prefix = strings.Repeat(asciiChar, max_strlen-len(bmpChar)) + short = prefix + bmpChar + if capStringLength(short) != short { + t.Errorf("BMP character before max_strlen should be correctly preserved") + } + + prefix = strings.Repeat(asciiChar, max_strlen-len(nonBmpChar)) + short = prefix + nonBmpChar + if capStringLength(short) != short { + t.Errorf("Non-BMP character before max_strlen should be correctly preserved") + } +} diff --git a/go/extractor/trap/util.go b/go/extractor/trap/util.go new file mode 100644 index 00000000000..2e32cfc04af --- /dev/null +++ b/go/extractor/trap/util.go @@ -0,0 +1,9 @@ +package trap + +import ( + "strings" +) + +func escapeString(s string) string { + return strings.Replace(s, "\"", "\"\"", -1) +} diff --git a/go/extractor/util/util.go b/go/extractor/util/util.go new file mode 100644 index 00000000000..5725c03d5b6 --- /dev/null +++ b/go/extractor/util/util.go @@ -0,0 +1,210 @@ +package util + +import ( + "errors" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" +) + +var extractorPath string + +// Getenv retrieves the value of the environment variable named by the key. +// If that variable is not present, it iterates over the given aliases until +// it finds one that is. If none are present, the empty string is returned. +func Getenv(key string, aliases ...string) string { + val := os.Getenv(key) + if val != "" { + return val + } + for _, alias := range aliases { + val = os.Getenv(alias) + if val != "" { + return val + } + } + return "" +} + +// runGoList is a helper function for running go list with format `format` and flags `flags` on +// package `pkgpath`. +func runGoList(format string, pkgpath string, flags ...string) (string, error) { + return runGoListWithEnv(format, pkgpath, nil, flags...) +} + +func runGoListWithEnv(format string, pkgpath string, additionalEnv []string, flags ...string) (string, error) { + args := append([]string{"list", "-e", "-f", format}, flags...) + args = append(args, pkgpath) + cmd := exec.Command("go", args...) + cmd.Env = append(os.Environ(), additionalEnv...) + out, err := cmd.Output() + + if err != nil { + if err, ok := err.(*exec.ExitError); ok { + log.Printf("Warning: go list command failed, output below:\nstdout:\n%s\nstderr:\n%s\n", out, err.Stderr) + } else { + log.Printf("Warning: Failed to run go list: %s", err.Error()) + } + return "", err + } + + return strings.TrimSpace(string(out)), nil +} + +// GetModDir gets the absolute directory of the module containing the package with path +// `pkgpath`. It passes the `go list` the flags specified by `flags`. +func GetModDir(pkgpath string, flags ...string) string { + // enable module mode so that we can find a module root if it exists, even if go module support is + // disabled by a build + mod, err := runGoListWithEnv("{{.Module}}", pkgpath, []string{"GO111MODULE=on"}, flags...) + if err != nil || mod == "" { + // if the command errors or modules aren't being used, return the empty string + return "" + } + + modDir, err := runGoListWithEnv("{{.Module.Dir}}", pkgpath, []string{"GO111MODULE=on"}, flags...) + if err != nil { + return "" + } + + abs, err := filepath.Abs(modDir) + if err != nil { + log.Printf("Warning: unable to make %s absolute: %s", modDir, err.Error()) + return "" + } + return abs +} + +// GetPkgDir gets the absolute directory containing the package with path `pkgpath`. It passes the +// `go list` command the flags specified by `flags`. +func GetPkgDir(pkgpath string, flags ...string) string { + pkgDir, err := runGoList("{{.Dir}}", pkgpath, flags...) + if err != nil { + return "" + } + + abs, err := filepath.Abs(pkgDir) + if err != nil { + log.Printf("Warning: unable to make %s absolute: %s", pkgDir, err.Error()) + return "" + } + return abs +} + +// DepErrors checks there are any errors resolving dependencies for `pkgpath`. It passes the `go +// list` command the flags specified by `flags`. +func DepErrors(pkgpath string, flags ...string) bool { + out, err := runGoList("{{if .DepsErrors}}{{else}}error{{end}}", pkgpath, flags...) + if err != nil { + // if go list failed, assume dependencies are broken + return false + } + + return out != "" +} + +// FileExists tests whether the file at `filename` exists and is not a directory. +func FileExists(filename string) bool { + info, err := os.Stat(filename) + if err != nil && !os.IsNotExist(err) { + log.Printf("Unable to stat %s: %s\n", filename, err.Error()) + } + return err == nil && !info.IsDir() +} + +// DirExists tests whether `filename` exists and is a directory. +func DirExists(filename string) bool { + info, err := os.Stat(filename) + if err != nil && !os.IsNotExist(err) { + log.Printf("Unable to stat %s: %s\n", filename, err.Error()) + } + return err == nil && info.IsDir() +} + +func RunCmd(cmd *exec.Cmd) bool { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + in, _ := cmd.StdinPipe() + err := cmd.Start() + if err != nil { + log.Printf("Running %s failed, continuing anyway: %s\n", cmd.Path, err.Error()) + return false + } + in.Close() + err = cmd.Wait() + if err != nil { + log.Printf("Running %s failed, continuing anyway: %s\n", cmd.Path, err.Error()) + return false + } + + return true +} + +func getOsToolsSubdir() (string, error) { + platform, set := os.LookupEnv("CODEQL_PLATFORM") + if set && platform != "" { + return platform, nil + } + + switch runtime.GOOS { + case "darwin": + return "osx64", nil + case "linux": + return "linux64", nil + case "windows": + return "win64", nil + } + return "", errors.New("Unsupported OS: " + runtime.GOOS) +} + +func getExtractorDir() (string, error) { + extractorRoot := os.Getenv("CODEQL_EXTRACTOR_GO_ROOT") + if extractorRoot == "" { + log.Print("CODEQL_EXTRACTOR_GO_ROOT not set.\nThis binary should not be run manually; instead, use the CodeQL CLI or VSCode extension. See https://securitylab.github.com/tools/codeql.\n") + log.Print("Falling back to guess the root based on this executable's path.\n") + + mypath, err := os.Executable() + if err == nil { + return filepath.Dir(mypath), nil + } else { + return "", errors.New("CODEQL_EXTRACTOR_GO_ROOT not set, and could not determine path of this executable: " + err.Error()) + } + } + + osSubdir, err := getOsToolsSubdir() + if err != nil { + return "", err + } + + return filepath.Join(extractorRoot, "tools", osSubdir), nil +} + +func GetExtractorPath() (string, error) { + if extractorPath != "" { + return extractorPath, nil + } + + dirname, err := getExtractorDir() + if err != nil { + return "", err + } + extractorPath := filepath.Join(dirname, "go-extractor") + if runtime.GOOS == "windows" { + extractorPath = extractorPath + ".exe" + } + return extractorPath, nil +} + +func EscapeTrapSpecialChars(s string) string { + // Replace TRAP special characters with their HTML entities, as well as '&' to avoid ambiguity. + s = strings.ReplaceAll(s, "&", "&") + s = strings.ReplaceAll(s, "{", "{") + s = strings.ReplaceAll(s, "}", "}") + s = strings.ReplaceAll(s, "\"", """) + s = strings.ReplaceAll(s, "@", "@") + s = strings.ReplaceAll(s, "#", "#") + return s +} diff --git a/go/go.mod b/go/go.mod new file mode 100644 index 00000000000..25e2d87d342 --- /dev/null +++ b/go/go.mod @@ -0,0 +1,13 @@ +module github.com/github/codeql-go + +go 1.18 + +require ( + golang.org/x/mod v0.5.0 + golang.org/x/tools v0.1.5 +) + +require ( + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect +) diff --git a/go/go.sum b/go/go.sum new file mode 100644 index 00000000000..57b82477ee7 --- /dev/null +++ b/go/go.sum @@ -0,0 +1,28 @@ +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go/old-change-notes/1.23/analysis-go.md b/go/old-change-notes/1.23/analysis-go.md new file mode 100644 index 00000000000..5710d7acfcd --- /dev/null +++ b/go/old-change-notes/1.23/analysis-go.md @@ -0,0 +1,15 @@ +# Improvements to Go analysis + +## New queries + +| **Query** | **Tags** | **Purpose** | +|---------------------------------------------------------------------------|----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------| +| Clear-text logging of sensitive information (`go/clear-text-logging`) | security, external/cwe/cwe-312, external/cwe/cwe-315, external/cwe/cwe-359 | Highlights code that writes sensitive information to a log file, or to the console, without encryption or hashing. Results are shown on LGTM by default. | +| Open URL redirect (`go/unvalidated-url-redirection`) | security, external/cwe/cwe-601 | Highlights code that redirects to a URL that may be controlled by an attacker. Results are shown on LGTM by default. | + +## Changes to existing queries + +| **Query** | **Expected impact** | **Change** | +|-----------------------------------------------------|------------------------------|-----------------------------------------------------------| +| Expression has no effect (`go/useless-expression`) | Fewer false positive results | This query no longer flags calls to empty stub functions. | +| Hard-coded credentials (`go/hardcoded-credentials`) | Fewer false positive results | This query now recognizes more placeholder credentials. | diff --git a/go/old-change-notes/1.24/analysis-go.md b/go/old-change-notes/1.24/analysis-go.md new file mode 100644 index 00000000000..a9f38cb1ec2 --- /dev/null +++ b/go/old-change-notes/1.24/analysis-go.md @@ -0,0 +1,39 @@ +# Improvements to Go analysis + +## General improvements + +* You can now suppress alerts using either single-line block comments (`/* ... */`) or line comments (`// ...`). +* Analysis of flow through fields and elements of arrays and slices has been improved, which may lead to more results from the security queries. +* Detection of test code has been improved. LGTM will not show alerts in test code by default. +* Go 1.14 library changes have been modeled. +* More sources of untrusted input as well as vulnerable sinks are modeled, which may lead to more results from the security queries. + +## New queries + +The CodeQL library for Go now contains a folder of simple "cookbook" queries that show how to access basic Go elements using the predicates defined by the standard library. They're intended to give you a starting point for your own experiments and to help you work out the best way to frame your questions using CodeQL. You can find them in the `examples/snippets` folder in the [CodeQL for Go repository](https://github.com/github/codeql-go/tree/main/ql/examples/snippets). + +| **Query** | **Tags** | **Purpose** | +|------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Bad check of redirect URL (`go/bad-redirect-check`) | correctness, security, external/cwe/cwe-601 | Highlights checks that ensure redirect URLs start with `/` but don't check for `//` or `/\`. Results are shown on LGTM by default. | +| Constant length comparison (`go/constant-length-comparison`) | correctness | Highlights code that checks the length of an array or slice against a constant before indexing it using a variable, suggesting a logic error. Results are shown on LGTM by default. | +| Disabled TLS certificate check (`go/disabled-certificate-check`) | security, external/cwe/295 | Highlights code that disables TLS certificate checking. Results are shown on LGTM by default. | +| Impossible interface nil check (`go/impossible-interface-nil-check`) | correctness | Highlights code that compares an interface value that cannot be `nil` to `nil`, suggesting a logic error. Results are shown on LGTM by default. | +| Incomplete URL scheme check (`go/incomplete-url-scheme-check`) | correctness, security, external/cwe/cwe-020 | Highlights checks for `javascript` URLs that do not take `data` or `vbscript` URLs into account. Results are shown on LGTM by default. | +| Potentially unsafe quoting (`go/unsafe-quoting`) | correctness, security, external/cwe/cwe-078, external/cwe/cwe-089, external/cwe/cwe-094 | Highlights code that constructs a quoted string literal containing data that may itself contain quotes. Results are shown on LGTM by default. | +| Size computation for allocation may overflow (`go/allocation-size-overflow`) | correctness, security, external/cwe/cwe-190 | Highlights code that computes the size of an allocation based on the size of a potentially large object. Results are shown on LGTM by default. | +| Uncontrolled data used in network request (`go/request-forgery`) | correctness, security, external/cwe/cwe-918 | Highlights code that uses uncontrolled user input to make a request. Results are shown on LGTM by default. | +| XPath injection (`go/xml/xpath-injection`) | security, external/cwe/cwe-643 | Highlights code that uses remote input in an XPath expression. Results are shown on LGTM by default. | + +## Changes to existing queries + +| **Query** | **Expected impact** | **Change** | +|-------------------------------------------------------------------------------|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Arbitrary file write during zip extraction ("zip slip") (`go/zipslip`) | Fewer false positive results | The query now excludes more cases where it is safe to use a path extractor from an archive. | +| Bitwise exclusive-or used like exponentiation (`go/mistyped-exponentiation`) | Fewer false positive results | The query now identifies when the value of an xor is assigned to a mask object, and excludes such results. | +| Command built from user-controlled sources (`go/command-injection`) | More results | The library models used by the query have been improved, allowing it to flag more potentially problematic cases, including sources that flow into shells, sudo, or programming-language interpreters as arguments. | +| Database query built from user-controlled sources (`go/sql-injection`) | More results | The library models used by the query have been improved, allowing it to flag more potentially problematic cases. | +| Identical operands (`go/redundant-operation`) | Fewer false positive results | The query no longer flags cases where the operands have the same value but are syntactically distinct, since this is usually intentional. | +| Incomplete regular expression for hostnames (`go/incomplete-hostname-regexp`) | More results | The query now flags unescaped dots before the TLD in a hostname regex. | +| Open URL redirect (`go/unvalidated-url-redirection`) | Fewer false positive results | The query now identifies some sources that are not attacker-controlled, and excludes results with such sources. | +| Reflected cross-site scripting (`go/reflected-xss`) | Fewer results | Untrusted input flowing into an HTTP header definition or into an `fmt.Fprintf` call with a constant prefix is no longer flagged, since it is in both cases often harmless. | +| Useless assignment to field (`go/useless-assignment-to-field`) | Fewer false positive results | The query now conservatively handles fields promoted through embedded pointer types. | diff --git a/go/old-change-notes/1.24/extractor-go.md b/go/old-change-notes/1.24/extractor-go.md new file mode 100644 index 00000000000..c51d47a78d1 --- /dev/null +++ b/go/old-change-notes/1.24/extractor-go.md @@ -0,0 +1,19 @@ +[[ condition: enterprise-only ]] + +# Improvements to Go analysis + +## Improvements to the autobuilder + +* When Makefiles or custom build scripts are present in the codebase, the autobuilder uses them to install dependencies. The build command + to invoke can be configured via `lgtm.yml`, or by setting the environment variable `CODEQL_EXTRACTOR_GO_BUILD_COMMAND`. +* The autobuilder now attempts to automatically detect when dependencies have been vendored and use `-mod=vendor` appropriately. + +## Changes to code extraction + +* The extractor now supports Go 1.14. +* In resource-constrained environments, the environment variable `CODEQL_EXTRACTOR_GO_MAX_GOROUTINES` can be used to limit the + number of parallel goroutines started by the extractor, which reduces CPU and memory requirements. The default value for this + variable is 32. +* The extractor now uses buffered i/o for writing database files, which reduces the amount of time taken for extraction. +* The extractor now compresses intermediate files used for constructing databases, which reduces the amount of disk space it requires. +* The extractor now supports extracting `go.mod` files, enabling queries on dependencies and their versions. diff --git a/go/old-change-notes/2020-04-30-syscall-functions.md b/go/old-change-notes/2020-04-30-syscall-functions.md new file mode 100644 index 00000000000..caa2cf56654 --- /dev/null +++ b/go/old-change-notes/2020-04-30-syscall-functions.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Command built from user-controlled sources" has been improved to recognize methods from the `syscall` library, which may lead to more alerts. diff --git a/go/old-change-notes/2020-05-01-bad-redirect-check.md b/go/old-change-notes/2020-05-01-bad-redirect-check.md new file mode 100644 index 00000000000..6ee5d0fb235 --- /dev/null +++ b/go/old-change-notes/2020-05-01-bad-redirect-check.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Bad redirect check" (`go/bad-redirect-check`) now requires that the checked variable is actually used in a redirect as opposed to relying on a name-based heuristic. This eliminates some false positive results, and adds more true positive results. diff --git a/go/old-change-notes/2020-05-01-macaron-model.md b/go/old-change-notes/2020-05-01-macaron-model.md new file mode 100644 index 00000000000..056e7d093cc --- /dev/null +++ b/go/old-change-notes/2020-05-01-macaron-model.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Basic support for the [Macaron](https://go-macaron.com/) HTTP library has been added, which may lead to more results from the security queries. \ No newline at end of file diff --git a/go/old-change-notes/2020-05-05-clear-text-logging.md b/go/old-change-notes/2020-05-05-clear-text-logging.md new file mode 100644 index 00000000000..ad9e974557f --- /dev/null +++ b/go/old-change-notes/2020-05-05-clear-text-logging.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Clear-text logging of sensitive information" has been improved to recognize more logging APIs, which may lead to more alerts. \ No newline at end of file diff --git a/go/old-change-notes/2020-05-05-mux-model.md b/go/old-change-notes/2020-05-05-mux-model.md new file mode 100644 index 00000000000..4ca9d688dd7 --- /dev/null +++ b/go/old-change-notes/2020-05-05-mux-model.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Basic support for the [Mux](https://github.com/gorilla/mux/) HTTP library has been added, which + may lead to more results from the security queries. diff --git a/go/old-change-notes/2020-05-07-update-data-flow.md b/go/old-change-notes/2020-05-07-update-data-flow.md new file mode 100644 index 00000000000..6d67c59b041 --- /dev/null +++ b/go/old-change-notes/2020-05-07-update-data-flow.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* The data-flow library has been improved, which affects and improves most security queries. In particular, + flow through functions involving nested field reads and writes is now modeled more fully. diff --git a/go/old-change-notes/2020-05-11-reflected-xss.md b/go/old-change-notes/2020-05-11-reflected-xss.md new file mode 100644 index 00000000000..0d1f703c7e4 --- /dev/null +++ b/go/old-change-notes/2020-05-11-reflected-xss.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* The query "Reflected cross-site scripting" has been improved to recognize more cases where the + value should be considered to be safe, which should lead to fewer false positive results. diff --git a/go/old-change-notes/2020-05-12-tainted-path.md b/go/old-change-notes/2020-05-12-tainted-path.md new file mode 100644 index 00000000000..ccd78ed7d1f --- /dev/null +++ b/go/old-change-notes/2020-05-12-tainted-path.md @@ -0,0 +1,4 @@ +lgtm,codescanning +* The queries "Uncontrolled data used in path expression" and "Arbitrary file write during zip + extraction ("zip slip")" have been improved to recognize more file APIs, which may lead to more + alerts. diff --git a/go/old-change-notes/2020-05-13-io-model.md b/go/old-change-notes/2020-05-13-io-model.md new file mode 100644 index 00000000000..0e3531efedc --- /dev/null +++ b/go/old-change-notes/2020-05-13-io-model.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Modeling of the standard `io` library has been improved, which may lead to more results from the + security queries. diff --git a/go/old-change-notes/2020-05-18-redundant-recover.md b/go/old-change-notes/2020-05-18-redundant-recover.md new file mode 100644 index 00000000000..cca5e8fe490 --- /dev/null +++ b/go/old-change-notes/2020-05-18-redundant-recover.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query "Redundant call to recover" (`go/redundant-recover`) has been added. The query detects calls to `recover` that have no effect. diff --git a/go/old-change-notes/2020-05-20-mongodb-model.md b/go/old-change-notes/2020-05-20-mongodb-model.md new file mode 100644 index 00000000000..ff0a09d37de --- /dev/null +++ b/go/old-change-notes/2020-05-20-mongodb-model.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Modeling of the `go.mongodb.org/mongo-driver/mongo` package has been added, which may lead to more + results from the security queries. diff --git a/go/old-change-notes/2020-05-20-request-forgery-sanitizers.md b/go/old-change-notes/2020-05-20-request-forgery-sanitizers.md new file mode 100644 index 00000000000..cb1fdcb5acf --- /dev/null +++ b/go/old-change-notes/2020-05-20-request-forgery-sanitizers.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Uncontrolled data used in network request" is now more precise, which may reduce the number of false positives. diff --git a/go/old-change-notes/2020-05-22-websocket-model.md b/go/old-change-notes/2020-05-22-websocket-model.md new file mode 100644 index 00000000000..5ce24528ee2 --- /dev/null +++ b/go/old-change-notes/2020-05-22-websocket-model.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Modeling of several WebSocket libraries has been added, which may lead to more results from the + security queries. diff --git a/go/old-change-notes/2020-05-29-open-redirect.md b/go/old-change-notes/2020-05-29-open-redirect.md new file mode 100644 index 00000000000..182a001ae09 --- /dev/null +++ b/go/old-change-notes/2020-05-29-open-redirect.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Open URL redirect" (`go/unvalidated-url-redirection`) now recognizes values returned by method `http.Request.FormValue` as possibly user controlled, allowing it to flag more true positive results. diff --git a/go/old-change-notes/2020-06-11-build-tracing.md b/go/old-change-notes/2020-06-11-build-tracing.md new file mode 100644 index 00000000000..b500742db09 --- /dev/null +++ b/go/old-change-notes/2020-06-11-build-tracing.md @@ -0,0 +1,5 @@ +lgtm,codescanning +* The Go extractor now supports build tracing, allowing users to supply a build command when + creating databases with the CodeQL CLI or via configuration. It currently only supports projects + that use Go modules. To opt-in, set the environment variable `CODEQL_EXTRACTOR_GO_BUILD_TRACING` + to `on`, or supply a build command. diff --git a/go/old-change-notes/2020-06-12-more-dependency-extraction.md b/go/old-change-notes/2020-06-12-more-dependency-extraction.md new file mode 100644 index 00000000000..76523ced9e8 --- /dev/null +++ b/go/old-change-notes/2020-06-12-more-dependency-extraction.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The extractor now attempts to extract the AST of all dependencies that are related to the packages passed explicitly on the commandline, which is determined by using the module root or, if not using modules, the directory containing the source for those packages. In particular, this means if a package passed to the extractor depends on another package inside the same module, the dependency's AST will now be extracted. diff --git a/go/old-change-notes/2020-06-16-email-injection.md b/go/old-change-notes/2020-06-16-email-injection.md new file mode 100644 index 00000000000..63abd57f2d6 --- /dev/null +++ b/go/old-change-notes/2020-06-16-email-injection.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Email injection" (`go/email-injection`) has been moved out of the experimental folder. The query detects when untrusted input can be incorporated directly into an email. diff --git a/go/old-change-notes/2020-06-17-reflected-xss-refinements.md b/go/old-change-notes/2020-06-17-reflected-xss-refinements.md new file mode 100644 index 00000000000..7cb277327dd --- /dev/null +++ b/go/old-change-notes/2020-06-17-reflected-xss-refinements.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* The query "Reflected cross-site scripting" has been improved to more correctly determine whether + an HTML mime type will be sniffed, which should lead to more accurate results. diff --git a/go/old-change-notes/2020-06-19-call-graph.md b/go/old-change-notes/2020-06-19-call-graph.md new file mode 100644 index 00000000000..891ddda62b4 --- /dev/null +++ b/go/old-change-notes/2020-06-19-call-graph.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Resolution of method calls through interfaces has been improved, resulting in more precise call-graph information, which in turn may eliminate false positives from the security queries. diff --git a/go/old-change-notes/2020-06-19-cyclic-field-lookup.md b/go/old-change-notes/2020-06-19-cyclic-field-lookup.md new file mode 100644 index 00000000000..04901d5757f --- /dev/null +++ b/go/old-change-notes/2020-06-19-cyclic-field-lookup.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A bug has been fixed that could cause the analysis not to terminate in the presence of cycles through embedded struct fields. \ No newline at end of file diff --git a/go/old-change-notes/2020-06-19-switch-block-without-test.md b/go/old-change-notes/2020-06-19-switch-block-without-test.md new file mode 100644 index 00000000000..17f20f6840f --- /dev/null +++ b/go/old-change-notes/2020-06-19-switch-block-without-test.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A bug has been fixed that could cause the incorrect analysis of control flow around switch statements. diff --git a/go/old-change-notes/2020-06-24-clear-text-logging.md b/go/old-change-notes/2020-06-24-clear-text-logging.md new file mode 100644 index 00000000000..6dd26dbb1ee --- /dev/null +++ b/go/old-change-notes/2020-06-24-clear-text-logging.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Clear-text logging of sensitive information" has been improved to recognize more sources of sensitive data, which may lead to more alerts. The query is now also more precise, which may reduce the number of false positives. diff --git a/go/old-change-notes/2020-06-24-open-redirect.md b/go/old-change-notes/2020-06-24-open-redirect.md new file mode 100644 index 00000000000..3916ca733e8 --- /dev/null +++ b/go/old-change-notes/2020-06-24-open-redirect.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Open URL redirect" (`go/unvalidated-url-redirection`) now recognizes more problematic fields of `URL` objects, allowing it to flag more results. \ No newline at end of file diff --git a/go/old-change-notes/2020-06-26-taint-model-tar-zip.md b/go/old-change-notes/2020-06-26-taint-model-tar-zip.md new file mode 100644 index 00000000000..10cdaa41b46 --- /dev/null +++ b/go/old-change-notes/2020-06-26-taint-model-tar-zip.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Modeling of the `archive/tar` and `archive/zip` packages has been added, which may lead to more + results from the security queries. diff --git a/go/old-change-notes/2020-06-26-taint-through-range.md b/go/old-change-notes/2020-06-26-taint-through-range.md new file mode 100644 index 00000000000..55d870d1c88 --- /dev/null +++ b/go/old-change-notes/2020-06-26-taint-through-range.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Taint tracking through `range` statements has been improved, which may cause more results from the security queries. diff --git a/go/old-change-notes/2020-07-06-repo-with-file-url-origin.md b/go/old-change-notes/2020-07-06-repo-with-file-url-origin.md new file mode 100644 index 00000000000..f84d4c995a2 --- /dev/null +++ b/go/old-change-notes/2020-07-06-repo-with-file-url-origin.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A bug has been fixed that caused the autobuilder to not work on repositories with a `file://` URL as `origin`. diff --git a/go/old-change-notes/2020-07-06-tolerate-more-unreachable-returns.md b/go/old-change-notes/2020-07-06-tolerate-more-unreachable-returns.md new file mode 100644 index 00000000000..766c767e77e --- /dev/null +++ b/go/old-change-notes/2020-07-06-tolerate-more-unreachable-returns.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Unreachable statement" (`go/unreachable-statement`) now tolerates more unreachable return statements, which can often be required in Go following a function call that cannot return. Newly tolerated statements include `return true`, `return MyStruct{0, true}`, and any return when the return value has type `error`. This eliminates some nuisance results. diff --git a/go/old-change-notes/2020-07-07-missing-error-check.md b/go/old-change-notes/2020-07-07-missing-error-check.md new file mode 100644 index 00000000000..9202e3bc9ec --- /dev/null +++ b/go/old-change-notes/2020-07-07-missing-error-check.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* New query "Missing error check" (`go/missing-error-check`) added. This checks for dangerous pointer dereferences when an accompanying error value returned from a call has not been checked. diff --git a/go/old-change-notes/2020-07-15-insecure-tls.md b/go/old-change-notes/2020-07-15-insecure-tls.md new file mode 100644 index 00000000000..8cacfa5b2bf --- /dev/null +++ b/go/old-change-notes/2020-07-15-insecure-tls.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query "Insecure TLS configuration" (`go/insecure-tls`) is promoted from experimental status. This checks for use of insecure SSL/TLS versions and cipher suites. diff --git a/go/old-change-notes/2020-07-22-ssh-host-checking.md b/go/old-change-notes/2020-07-22-ssh-host-checking.md new file mode 100644 index 00000000000..7f83626bf0e --- /dev/null +++ b/go/old-change-notes/2020-07-22-ssh-host-checking.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query "Use of insecure HostKeyCallback implementation" (`go/insecure-hostkeycallback`) is promoted from experimental status. This checks for insecurely omitting SSH host-key verification. diff --git a/go/old-change-notes/2020-07-28-library-models.md b/go/old-change-notes/2020-07-28-library-models.md new file mode 100644 index 00000000000..41a0de5c064 --- /dev/null +++ b/go/old-change-notes/2020-07-28-library-models.md @@ -0,0 +1,9 @@ +lgtm,codescanning +* Basic support for the [Go-restful](https://github.com/emicklei/go-restful) HTTP library has been added, which + may lead to more results from the security queries. +* Basic support for the [Gorm](https://github.com/go-gorm/gorm) ORM library has been added (specifically, its SQL statement building facilities), which + may lead to more results from the security queries. +* Basic support for the [Sqlx](https://github.com/jmoiron/sqlx) database access library has been added, which + may lead to more results from the security queries. +* Basic support for the [Json-iterator](https://github.com/json-iterator/go) JSON library has been added, which + may lead to more results from the security queries. diff --git a/go/old-change-notes/2020-08-05-incorrect-integer-conversion.md b/go/old-change-notes/2020-08-05-incorrect-integer-conversion.md new file mode 100644 index 00000000000..258d8427f27 --- /dev/null +++ b/go/old-change-notes/2020-08-05-incorrect-integer-conversion.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query "Incorrect integer conversion" (`go/incorrect-integer-conversion`) is promoted from experimental status. This checks for parsing a string to an integer and then assigning it to an integer type of a smaller bit size. diff --git a/go/old-change-notes/2020-08-07-negative-length-check.md b/go/old-change-notes/2020-08-07-negative-length-check.md new file mode 100644 index 00000000000..38db6f38d54 --- /dev/null +++ b/go/old-change-notes/2020-08-07-negative-length-check.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Query "Redundant check for negative value" (`go/negative-length-check`) has been expanded to consider unsigned integers, along + with the return values of `len` and `cap` which it already handled. It has also been renamed to match its expanded role. diff --git a/go/old-change-notes/2020-08-18-oauth2.md b/go/old-change-notes/2020-08-18-oauth2.md new file mode 100644 index 00000000000..aa4b566a3f0 --- /dev/null +++ b/go/old-change-notes/2020-08-18-oauth2.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Use of constant `state` value in OAuth 2.0 URL" (`go/constant-oauth2-state`) has been promoted from experimental status. This checks for use of a constant state value in generating an OAuth2 redirect URL, which may open the way for a CSRF attack. diff --git a/go/old-change-notes/2020-08-19-gin-model.md b/go/old-change-notes/2020-08-19-gin-model.md new file mode 100644 index 00000000000..03a8343231d --- /dev/null +++ b/go/old-change-notes/2020-08-19-gin-model.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Basic support for the [Gin](https://github.com/gin-gonic/gin) HTTP library has been added (extending UntrustedFlowSource), which may lead to more results from the security queries. diff --git a/go/old-change-notes/2020-08-27-protobufs.md b/go/old-change-notes/2020-08-27-protobufs.md new file mode 100644 index 00000000000..2628fd12d91 --- /dev/null +++ b/go/old-change-notes/2020-08-27-protobufs.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Taint is now propagated across protocol buffer ("protobuf") marshalling and unmarshalling operations. This may result in more results from existing queries where the protocol buffer format is used. diff --git a/go/old-change-notes/2020-08-28-allocation-size-overflow-sanitizers.md b/go/old-change-notes/2020-08-28-allocation-size-overflow-sanitizers.md new file mode 100644 index 00000000000..8876401c71f --- /dev/null +++ b/go/old-change-notes/2020-08-28-allocation-size-overflow-sanitizers.md @@ -0,0 +1,4 @@ +lgtm,codescanning +* The query "Size computation for allocation may overflow" has been improved to recognize more + cases where the value should be considered to be safe, which should lead to fewer false + positive results. diff --git a/go/old-change-notes/2020-09-10-gorm-model-improved.md b/go/old-change-notes/2020-09-10-gorm-model-improved.md new file mode 100644 index 00000000000..10b99296eb6 --- /dev/null +++ b/go/old-change-notes/2020-09-10-gorm-model-improved.md @@ -0,0 +1,4 @@ +lgtm,codescanning +* Support for the [GORM](https://github.com/go-gorm/gorm) ORM library (specifically, its SQL + statement building facilities) has been improved, which may lead to more results from the + security queries. diff --git a/go/old-change-notes/2020-09-10-xss-false-positives.md b/go/old-change-notes/2020-09-10-xss-false-positives.md new file mode 100644 index 00000000000..dd04bc4ba22 --- /dev/null +++ b/go/old-change-notes/2020-09-10-xss-false-positives.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Reflected cross-site scripting" (`go/reflected-xss`) now recognizes more cases of JSON marshaled data, which cannot serve as a vector for an XSS attack. This may reduce false-positive results for this query. diff --git a/go/old-change-notes/2020-09-14-split-string-sanitizer.md b/go/old-change-notes/2020-09-14-split-string-sanitizer.md new file mode 100644 index 00000000000..970da425e87 --- /dev/null +++ b/go/old-change-notes/2020-09-14-split-string-sanitizer.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Splitting a string by whitespace or a colon is now considered sanitizing by the `go/clear-text-logging` query, because this is frequently used to split a username and password or other secret. diff --git a/go/old-change-notes/2020-09-15-chi.md b/go/old-change-notes/2020-09-15-chi.md new file mode 100644 index 00000000000..f8674951cfe --- /dev/null +++ b/go/old-change-notes/2020-09-15-chi.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the Chi web framework diff --git a/go/old-change-notes/2020-09-17-echo.md b/go/old-change-notes/2020-09-17-echo.md new file mode 100644 index 00000000000..75576b8c4d3 --- /dev/null +++ b/go/old-change-notes/2020-09-17-echo.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the Echo web framework diff --git a/go/old-change-notes/2020-09-22-suspicious-character-in-regexp.md b/go/old-change-notes/2020-09-22-suspicious-character-in-regexp.md new file mode 100644 index 00000000000..1cb06313ea0 --- /dev/null +++ b/go/old-change-notes/2020-09-22-suspicious-character-in-regexp.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query `go/suspicious-character-in-regex` has been added. The query flags uses of `\b` and `\a` in regular expressions, where a character class was likely intended. diff --git a/go/old-change-notes/2020-09-23-stdlib.md b/go/old-change-notes/2020-09-23-stdlib.md new file mode 100644 index 00000000000..2b30973e79b --- /dev/null +++ b/go/old-change-notes/2020-09-23-stdlib.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Add/improve taint-tracking models for 63 Go standard library packages. This means that all queries that track tainted data may produce more results; these include queries scanning for cross-site scripting vulnerabilities and SQL injection vulnerabilities among others. diff --git a/go/old-change-notes/2020-10-01-gomod-extraction.md b/go/old-change-notes/2020-10-01-gomod-extraction.md new file mode 100644 index 00000000000..ca0c0c72d50 --- /dev/null +++ b/go/old-change-notes/2020-10-01-gomod-extraction.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The extractor now only extracts go.mod files belonging to extracted packages. In particular, vendored go.mod files will no longer be extracted unless the vendored package is explicitly passed to the extractor. This will remove unexpected `GoModExpr` and similar expressions seen by queries. diff --git a/go/old-change-notes/2020-10-01-stack-trace-exposure.md b/go/old-change-notes/2020-10-01-stack-trace-exposure.md new file mode 100644 index 00000000000..35437a0598f --- /dev/null +++ b/go/old-change-notes/2020-10-01-stack-trace-exposure.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query `go/stack-trace-exposure` has been added. The query flags exposure of a stack trace to a remote party. diff --git a/go/old-change-notes/2020-10-12-old-context-package.md b/go/old-change-notes/2020-10-12-old-context-package.md new file mode 100644 index 00000000000..3e40ba064f0 --- /dev/null +++ b/go/old-change-notes/2020-10-12-old-context-package.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the `golang.org/x/net/context` package, which was already supported under its modern standard-library name `context`. diff --git a/go/old-change-notes/2020-10-12-x-net-html.md b/go/old-change-notes/2020-10-12-x-net-html.md new file mode 100644 index 00000000000..4644ecf9e09 --- /dev/null +++ b/go/old-change-notes/2020-10-12-x-net-html.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* Added partial support for the `golang.org/x/net/html` package, modeling tainted data flow from a retrieved HTML document to its attributes and other data. +* Modeled more ways of writing data to an `net/http.ResponseWriter`. This may produce more results from queries such as `go/reflected-xss` which look for data flowing to an HTTP response. diff --git a/go/old-change-notes/2020-10-14-allocation-overflow-accuracy.md b/go/old-change-notes/2020-10-14-allocation-overflow-accuracy.md new file mode 100644 index 00000000000..44e2ec9552a --- /dev/null +++ b/go/old-change-notes/2020-10-14-allocation-overflow-accuracy.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The accuracy of the `go/allocation-size-overflow` query was improved, excluding more false-positives in which a small array could be mistaken for one of unbounded size. diff --git a/go/old-change-notes/2020-10-14-spew.md b/go/old-change-notes/2020-10-14-spew.md new file mode 100644 index 00000000000..29103258c18 --- /dev/null +++ b/go/old-change-notes/2020-10-14-spew.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the Spew deep pretty-printing framework. This may cause the `go/clear-text-logging` query to return more results when sensitive data is exposed using this library. diff --git a/go/old-change-notes/2020-10-19-revel.md b/go/old-change-notes/2020-10-19-revel.md new file mode 100644 index 00000000000..3683c95ac14 --- /dev/null +++ b/go/old-change-notes/2020-10-19-revel.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added basic support for the Revel web framework. diff --git a/go/old-change-notes/2020-11-03-underscore-assigns.md b/go/old-change-notes/2020-11-03-underscore-assigns.md new file mode 100644 index 00000000000..d8f7accfeda --- /dev/null +++ b/go/old-change-notes/2020-11-03-underscore-assigns.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Fixed a bug that meant partially-ignored parallel assignments, such as `x, _ := a, b`, could produce an incorrect control-flow graph. diff --git a/go/old-change-notes/2020-11-04-unsafe-unzip-symlink.md b/go/old-change-notes/2020-11-04-unsafe-unzip-symlink.md new file mode 100644 index 00000000000..88a13019dc5 --- /dev/null +++ b/go/old-change-notes/2020-11-04-unsafe-unzip-symlink.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query `go/unsafe-unzip-symlink` has been added. The query checks for extracting symbolic links from an archive without using `filepath.EvalSymlinks`. This could lead to a file being written outside the destination directory. diff --git a/go/old-change-notes/2020-11-09-suspicious-character-in-regexp-improvement.md b/go/old-change-notes/2020-11-09-suspicious-character-in-regexp-improvement.md new file mode 100644 index 00000000000..3e5c9fce574 --- /dev/null +++ b/go/old-change-notes/2020-11-09-suspicious-character-in-regexp-improvement.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Suspicious characters in a regular expression" has been improved to recognize raw string literals, which should lead to fewer false positives. diff --git a/go/old-change-notes/2020-11-11-stored-command.md b/go/old-change-notes/2020-11-11-stored-command.md new file mode 100644 index 00000000000..fed234b2d96 --- /dev/null +++ b/go/old-change-notes/2020-11-11-stored-command.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query "Command built from stored data" (`go/stored-command`) has been added. The query detects command executions that contain data from a database or a similar possibly user-controllable source. diff --git a/go/old-change-notes/2020-11-11-stored-xss.md b/go/old-change-notes/2020-11-11-stored-xss.md new file mode 100644 index 00000000000..fb9f877132f --- /dev/null +++ b/go/old-change-notes/2020-11-11-stored-xss.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A new query "Stored cross-site scripting" (`go/stored-xss`) has been added. The query detects HTTP request responses that contain data from a database or a similar possibly user-controllable source. diff --git a/go/old-change-notes/2020-11-12-zipslip-sanitizers.md b/go/old-change-notes/2020-11-12-zipslip-sanitizers.md new file mode 100644 index 00000000000..880660ae4f3 --- /dev/null +++ b/go/old-change-notes/2020-11-12-zipslip-sanitizers.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Improved recongition of sanitizer functions for the `go/zipslip` query. This may reduce false-positives (but also perhaps false-negatives) when application code attempts to check a zip header entry does not contain an illegal path traversal attempt. diff --git a/go/old-change-notes/2020-11-19-dataflow-edges.md b/go/old-change-notes/2020-11-19-dataflow-edges.md new file mode 100644 index 00000000000..827b33ce436 --- /dev/null +++ b/go/old-change-notes/2020-11-19-dataflow-edges.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Fixed a bug that meant data-flow through a checked typecast (e.g. `cast, ok = x.(*Type)`) could be missed. diff --git a/go/old-change-notes/2020-11-27-external-api.md b/go/old-change-notes/2020-11-27-external-api.md new file mode 100644 index 00000000000..b65b4da8534 --- /dev/null +++ b/go/old-change-notes/2020-11-27-external-api.md @@ -0,0 +1,4 @@ +lgtm,codescanning +* A new query "Untrusted data passed to external API" (`go/untrusted-data-to-external-api`) has been added. The query reports external APIs that use untrusted data. This query is designed primarily to help identify which APIs may be relevant for security analysis of this application. +* A new query "Untrusted data passed to unknown external API" (`go/untrusted-data-to-unknown-external-api`) has been added. The query reports external APIs that use untrusted data and which are not already known to be safe. This query is designed primarily to help identify which APIs may be relevant for security analysis of this application. +* A new query "Frequency counts for external APIs that are used with untrusted data" (`go/count-untrusted-data-external-api`) has been added. The query reports external APIs that use untrusted data. It displays the same results as "Untrusted data passed to external API" (`go/untrusted-data-to-external-api`) but in a table. diff --git a/go/old-change-notes/2020-11-27-guarding-functions.md b/go/old-change-notes/2020-11-27-guarding-functions.md new file mode 100644 index 00000000000..5a51d59ef43 --- /dev/null +++ b/go/old-change-notes/2020-11-27-guarding-functions.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Improved ability to recognise a sanitizing function (for example, `func f(s string) bool { return isClean(s) }`). This may reduce false-positives for any query employing a sanitizing test. diff --git a/go/old-change-notes/2020-11-30-evanphx-json-patch.md b/go/old-change-notes/2020-11-30-evanphx-json-patch.md new file mode 100644 index 00000000000..5c0e17bdea4 --- /dev/null +++ b/go/old-change-notes/2020-11-30-evanphx-json-patch.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Support for the [json-patch](https://github.com/evanphx/json-patch/) library has been added, which may lead to more results from the security queries. diff --git a/go/old-change-notes/2020-12-01-fmt-errorf.md b/go/old-change-notes/2020-12-01-fmt-errorf.md new file mode 100644 index 00000000000..e90c5967631 --- /dev/null +++ b/go/old-change-notes/2020-12-01-fmt-errorf.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Recognised function `fmt.Errorf` to always return non-nil strings. This may reduce false-positives that depend on a function possibly returning nil. diff --git a/go/old-change-notes/2020-12-08-beego.md b/go/old-change-notes/2020-12-08-beego.md new file mode 100644 index 00000000000..59084d625e8 --- /dev/null +++ b/go/old-change-notes/2020-12-08-beego.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the Beego web framework diff --git a/go/old-change-notes/2020-12-08-k8s-io-apimachinery-pkg-runtime.md b/go/old-change-notes/2020-12-08-k8s-io-apimachinery-pkg-runtime.md new file mode 100644 index 00000000000..b4d6ac7e70a --- /dev/null +++ b/go/old-change-notes/2020-12-08-k8s-io-apimachinery-pkg-runtime.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Support for the [k8s.io/apimachinery/pkg/runtime](https://pkg.go.dev/k8s.io/apimachinery/pkg/runtime) library has been added, which may lead to more results from the security queries. diff --git a/go/old-change-notes/2020-12-09-clear-text-logging-source.md b/go/old-change-notes/2020-12-09-clear-text-logging-source.md new file mode 100644 index 00000000000..7ba2113ba79 --- /dev/null +++ b/go/old-change-notes/2020-12-09-clear-text-logging-source.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The query "Clear-text logging of sensitive information" has been improved to recognize `SecretInterface` from `k8s.io/client-go/kubernetes/typed/core/v1` as a source of sensitive data, which may lead to more alerts. diff --git a/go/old-change-notes/2020-12-14-insecure-randomness.md b/go/old-change-notes/2020-12-14-insecure-randomness.md new file mode 100644 index 00000000000..9e016703e46 --- /dev/null +++ b/go/old-change-notes/2020-12-14-insecure-randomness.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query "Use of insufficient randomness as the key of a cryptographic algorithm" (`go/insecure-randomness`) is promoted from experimental status. This checks for use of an insecure random number generator in a security component. diff --git a/go/old-change-notes/2020-12-15-beego-orm.md b/go/old-change-notes/2020-12-15-beego-orm.md new file mode 100644 index 00000000000..79fd312ed91 --- /dev/null +++ b/go/old-change-notes/2020-12-15-beego-orm.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the ORM subpackage of the Beego web framework diff --git a/go/old-change-notes/2020-12-18-goproxy.md b/go/old-change-notes/2020-12-18-goproxy.md new file mode 100644 index 00000000000..e56d542a76b --- /dev/null +++ b/go/old-change-notes/2020-12-18-goproxy.md @@ -0,0 +1,5 @@ +lgtm,codescanning +* Added support for the `github.com/elazarl/goproxy` package. +* The query "Incomplete regular expression for hostnames" has been improved to recognize some cases + when the regexp in question is guarding an HTTP error response, which will lead to fewer false + positives. diff --git a/go/old-change-notes/2020-12-23-regexp-anchors.md b/go/old-change-notes/2020-12-23-regexp-anchors.md new file mode 100644 index 00000000000..4574cf1c10f --- /dev/null +++ b/go/old-change-notes/2020-12-23-regexp-anchors.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query `go/regex/missing-regexp-anchor` now recognizes the start- and end-of-text anchors `\A` and `\z`. This reduces false-positives relating to unanchored expressions. diff --git a/go/old-change-notes/2021-01-07-gokit-sources.md b/go/old-change-notes/2021-01-07-gokit-sources.md new file mode 100644 index 00000000000..3f544e14f25 --- /dev/null +++ b/go/old-change-notes/2021-01-07-gokit-sources.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Models for gokit request sources have been added as an opt-in feature; import `semmle.go.frameworks.GoKit` in a query to enable these sources. diff --git a/go/old-change-notes/2021-01-08-git-as-interpreter.md b/go/old-change-notes/2021-01-08-git-as-interpreter.md new file mode 100644 index 00000000000..adcd9cafaad --- /dev/null +++ b/go/old-change-notes/2021-01-08-git-as-interpreter.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added `git` as a potentially-exploitable command interpreter for the purposes of the `go/command-injection` query. Because some of its options can cause it to execute an arbitrary command, unsanitized user data can be dangerous to include in its argument list. Such cases will now be flagged as an alert. diff --git a/go/old-change-notes/2021-01-12-model-couchbase.md b/go/old-change-notes/2021-01-12-model-couchbase.md new file mode 100644 index 00000000000..77e0973cdff --- /dev/null +++ b/go/old-change-notes/2021-01-12-model-couchbase.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for [the offical Couchbase Go SDK library](https://github.com/couchbase/gocb), v1 and v2. The `go/sql-injection` query (which also handles non-SQL databases such as Couchbase) will now identify Couchbase queries built from untrusted external input. diff --git a/go/old-change-notes/2021-01-21-default-sanitizer-guard.md b/go/old-change-notes/2021-01-21-default-sanitizer-guard.md new file mode 100644 index 00000000000..2ee9b0d9ec0 --- /dev/null +++ b/go/old-change-notes/2021-01-21-default-sanitizer-guard.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* An equality comparison with a constant value now sanitizes the other value. This was already the case in XSS queries, but it now applies in all queries involving tainted data flow. This should lead to fewer false positive results. diff --git a/go/old-change-notes/2021-02-02-constant-comparison-sanitizer-guard.md b/go/old-change-notes/2021-02-02-constant-comparison-sanitizer-guard.md new file mode 100644 index 00000000000..0442a7f9ccd --- /dev/null +++ b/go/old-change-notes/2021-02-02-constant-comparison-sanitizer-guard.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* A function which compares a value with a list of constants now acts as a sanitizer guard. This should lead to fewer false positive results. diff --git a/go/old-change-notes/2021-02-09-html-templates.md b/go/old-change-notes/2021-02-09-html-templates.md new file mode 100644 index 00000000000..d742ea4630e --- /dev/null +++ b/go/old-change-notes/2021-02-09-html-templates.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Improved our modeling of Go's builtin `html/template` package to understand that these templates provide context-sensitive escaping of HTML and Javascript special characters. This may reduce false-positives seen by the `go/reflected-xss` query, as well as other queries for which HTML escaping is relevant. diff --git a/go/old-change-notes/2021-02-10-cfg-equality-panic-edges.md b/go/old-change-notes/2021-02-10-cfg-equality-panic-edges.md new file mode 100644 index 00000000000..4a4e41b89ae --- /dev/null +++ b/go/old-change-notes/2021-02-10-cfg-equality-panic-edges.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Improved the Go control-flow graph to exclude more edges representing panics due to comparisons when the types of the compared values indicate a panic is impossible (for example, comparing integers cannot panic). This may reduce false-positives or false-negatives for any query for which control-flow is relevant. diff --git a/go/old-change-notes/2021-02-10-yaml.md b/go/old-change-notes/2021-02-10-yaml.md new file mode 100644 index 00000000000..3a23f42a0f5 --- /dev/null +++ b/go/old-change-notes/2021-02-10-yaml.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the [gopkg.in/yaml](https://pkg.go.dev/gopkg.in/yaml.v3) package, which may lead to more results from the security queries. diff --git a/go/old-change-notes/2021-02-11-zap.md b/go/old-change-notes/2021-02-11-zap.md new file mode 100644 index 00000000000..a318f05ac3b --- /dev/null +++ b/go/old-change-notes/2021-02-11-zap.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for [the Zap logging framework](https://pkg.go.dev/go.uber.org/zap). This may cause the `go/clear-text-logging` query to return more results when sensitive data is exposed using this library. diff --git a/go/old-change-notes/2021-02-15-logrus-updated.md b/go/old-change-notes/2021-02-15-logrus-updated.md new file mode 100644 index 00000000000..eacc43ced80 --- /dev/null +++ b/go/old-change-notes/2021-02-15-logrus-updated.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Modeling of the `Logrus` logging library has been improved. This may cause the `go/clear-text-logging` query to return more results when sensitive data is exposed using this library. diff --git a/go/old-change-notes/2021-02-18-go-116.md b/go/old-change-notes/2021-02-18-go-116.md new file mode 100644 index 00000000000..353b5afa189 --- /dev/null +++ b/go/old-change-notes/2021-02-18-go-116.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The extractor now supports Go 1.16 and the new `io/fs` library that was introduced. diff --git a/go/old-change-notes/2021-03-05-dataflow-promoted-fields.md b/go/old-change-notes/2021-03-05-dataflow-promoted-fields.md new file mode 100644 index 00000000000..54b5d780535 --- /dev/null +++ b/go/old-change-notes/2021-03-05-dataflow-promoted-fields.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The data-flow library has been improved to represent reads and writes of promoted fields correctly, which may lead to more alerts. diff --git a/go/old-change-notes/2021-03-16-html-tracing.md b/go/old-change-notes/2021-03-16-html-tracing.md new file mode 100644 index 00000000000..664e5f312b6 --- /dev/null +++ b/go/old-change-notes/2021-03-16-html-tracing.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Support for extracting HTML files has been added, alongside support for Raw Revel templates. diff --git a/go/old-change-notes/2021-03-16-nethttp-updated.md b/go/old-change-notes/2021-03-16-nethttp-updated.md new file mode 100644 index 00000000000..f9138f67f7a --- /dev/null +++ b/go/old-change-notes/2021-03-16-nethttp-updated.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the `Transport.RoundTrip` method in `net/http`. diff --git a/go/old-change-notes/2021-04-19-http-request-taint-flow.md b/go/old-change-notes/2021-04-19-http-request-taint-flow.md new file mode 100644 index 00000000000..08eb761e0db --- /dev/null +++ b/go/old-change-notes/2021-04-19-http-request-taint-flow.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* `net/http.Request` and `mime/multipart.Part`'s models have been improved. `Request`'s error returns are no longer considered tainted, and `Part`'s methods propagate taint (for example, the `Part.FileName()` of a tainted `Part` is itself tainted). This should lead to more accurate results from any query where `Request` or `Part` methods occurred in a taint-flow path. diff --git a/go/old-change-notes/2021-04-20-tuple-types.md b/go/old-change-notes/2021-04-20-tuple-types.md new file mode 100644 index 00000000000..a4db5df1967 --- /dev/null +++ b/go/old-change-notes/2021-04-20-tuple-types.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Fixed a bug where data flow was not correctly computed through two-value index expressions (for example, `got, ok := myMap[someIndex]`). This may lead to extra results from any dataflow query when an index expression would form part of an important dataflow path. diff --git a/go/old-change-notes/2021-05-06-xorm.md b/go/old-change-notes/2021-05-06-xorm.md new file mode 100644 index 00000000000..0398530b950 --- /dev/null +++ b/go/old-change-notes/2021-05-06-xorm.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added support for the `xorm.io/xorm` package diff --git a/go/old-change-notes/2021-07-28-insufficient-key-size.md b/go/old-change-notes/2021-07-28-insufficient-key-size.md new file mode 100644 index 00000000000..d3880bee73f --- /dev/null +++ b/go/old-change-notes/2021-07-28-insufficient-key-size.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Query "Use of a weak cryptographic key" (`go/insufficient-key-size`) is promoted from experimental status. This checks that any RSA keys which are generated have a size of at least 2048 bits. diff --git a/go/old-change-notes/2021-08-17-go-117.md b/go/old-change-notes/2021-08-17-go-117.md new file mode 100644 index 00000000000..640f771b5f0 --- /dev/null +++ b/go/old-change-notes/2021-08-17-go-117.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The extractor now supports Go 1.17 features and models the changed libraries. diff --git a/go/old-change-notes/2021-08-23-getPrimaryQlClasses.md b/go/old-change-notes/2021-08-23-getPrimaryQlClasses.md new file mode 100644 index 00000000000..30b00908a23 --- /dev/null +++ b/go/old-change-notes/2021-08-23-getPrimaryQlClasses.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added `AstNode.getPrimaryQlClasses()` predicate, which gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. diff --git a/go/old-change-notes/2021-10-27-insufficient-key-size-sanitizer.md b/go/old-change-notes/2021-10-27-insufficient-key-size-sanitizer.md new file mode 100644 index 00000000000..5cd7a616e08 --- /dev/null +++ b/go/old-change-notes/2021-10-27-insufficient-key-size-sanitizer.md @@ -0,0 +1,3 @@ +lgtm,codescanning +* The query "Use of a weak cryptographic key" has been improved to recognize more cases where the + key size should be considered to be safe, which should lead to fewer false positive results. diff --git a/go/ql/config/legacy-support/qlpack.yml b/go/ql/config/legacy-support/qlpack.yml new file mode 100644 index 00000000000..cff1d02b271 --- /dev/null +++ b/go/ql/config/legacy-support/qlpack.yml @@ -0,0 +1,3 @@ +name: legacy-libraries-go +version: 0.0.0 +libraryPathDependencies: codeql-go diff --git a/go/ql/config/suites/lgtm/go-alerts-lgtm b/go/ql/config/suites/lgtm/go-alerts-lgtm new file mode 100644 index 00000000000..17b8ee5c45b --- /dev/null +++ b/go/ql/config/suites/lgtm/go-alerts-lgtm @@ -0,0 +1,3 @@ +# DO NOT EDIT +# This is a stub file. The actual suite of queries to run is generated +# automatically based on query precision and severity. diff --git a/go/ql/config/suites/lgtm/go-lgtm b/go/ql/config/suites/lgtm/go-lgtm new file mode 100644 index 00000000000..fa96641e229 --- /dev/null +++ b/go/ql/config/suites/lgtm/go-lgtm @@ -0,0 +1,3 @@ +@import "go-alerts-lgtm" +@import "go-metrics-lgtm" +@import "go-util-lgtm" diff --git a/go/ql/config/suites/lgtm/go-metrics-lgtm b/go/ql/config/suites/lgtm/go-metrics-lgtm new file mode 100644 index 00000000000..a295f30c0bf --- /dev/null +++ b/go/ql/config/suites/lgtm/go-metrics-lgtm @@ -0,0 +1,2 @@ ++ go-queries/Metrics/FLinesOfCode.ql: /Metrics/Files + @_namespace com.lgtm/go-queries diff --git a/go/ql/config/suites/lgtm/go-util-lgtm b/go/ql/config/suites/lgtm/go-util-lgtm new file mode 100644 index 00000000000..908e157d2dc --- /dev/null +++ b/go/ql/config/suites/lgtm/go-util-lgtm @@ -0,0 +1,6 @@ ++ go-queries/definitions.ql + @_namespace com.lgtm/go-queries ++ go-queries/AlertSuppression.ql + @_namespace com.lgtm/go-queries ++ go-queries/filters/ClassifyFiles.ql + @_namespace com.lgtm/go-queries diff --git a/go/ql/docs/experimental.md b/go/ql/docs/experimental.md new file mode 100644 index 00000000000..bef435d6674 --- /dev/null +++ b/go/ql/docs/experimental.md @@ -0,0 +1,37 @@ +# Experimental CodeQL queries and libraries + +In addition to our standard CodeQL queries and libraries, this repository may also contain queries and libraries of a more experimental nature. Experimental queries and libraries can be improved incrementally and may eventually reach a sufficient maturity to be included in our standard libraries and queries. + +Experimental queries and libraries may not be actively maintained as the standard libraries evolve. They may also be changed in backwards-incompatible ways or may be removed entirely in the future without deprecation warnings. + +## Requirements + +1. **Directory structure** + + - Experimental queries and libraries are stored in the `ql/src/experimental` subdirectory, and any corresponding tests in `ql/test/experimental`. + - The structure of an `experimental` subdirectory mirrors the structure of standard queries and libraries (or tests) in the parent directory. + +2. **Query metadata** + + - The query `@id` must not clash with any other queries in the repository. + - The query must have a `@name` and `@description` to explain its purpose. + - The query must have a `@kind` and `@problem.severity` as required by CodeQL tools. + + For details, see the [guide on query metadata](https://github.com/github/codeql/blob/main/docs/query-metadata-style-guide.md). + +3. **Formatting** + + - The queries and libraries must be [autoformatted](https://codeql.github.com/docs/codeql-for-visual-studio-code/about-codeql-for-visual-studio-code/). + +4. **Compilation** + + - Compilation of the query and any associated libraries and tests must be resilient to future development of the standard libraries. This means that the functionality cannot use internal APIs, cannot depend on the output of `getAQlClass`, and cannot make use of regexp matching on `toString`. + - The query and any associated libraries and tests must not cause any compiler warnings to be emitted (such as use of deprecated functionality or missing `override` annotations). + +5. **Results** + + - The query must have at least one true positive result on some revision of a real project. + +## Non-requirements + +Other criteria typically required for our standard queries and libraries are not required for experimental queries and libraries. In particular, fully disciplined query [metadata](https://github.com/github/codeql/blob/main/docs/query-metadata-style-guide.md), query [help](https://github.com/github/codeql/blob/main/docs/query-help-style-guide.md), tests, a low false positive rate and performance tuning are not required (but nonetheless recommended). diff --git a/go/ql/examples/.project b/go/ql/examples/.project new file mode 100644 index 00000000000..45114efbc5a --- /dev/null +++ b/go/ql/examples/.project @@ -0,0 +1,12 @@ + + + go-examples + + + + + + + com.semmle.plugin.qdt.core.qlnature + + diff --git a/go/ql/examples/.qlpath b/go/ql/examples/.qlpath new file mode 100644 index 00000000000..ac27c76308e --- /dev/null +++ b/go/ql/examples/.qlpath @@ -0,0 +1,10 @@ + + + + /go-queries + + /go-queries/go.dbscheme + + go + + diff --git a/go/ql/examples/qlpack.lock.yml b/go/ql/examples/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/go/ql/examples/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/go/ql/examples/qlpack.yml b/go/ql/examples/qlpack.yml new file mode 100644 index 00000000000..bfe19ffd65c --- /dev/null +++ b/go/ql/examples/qlpack.yml @@ -0,0 +1,6 @@ +name: codeql/go-examples +groups: + - go + - examples +dependencies: + codeql/go-all: "*" diff --git a/go/ql/examples/queries.xml b/go/ql/examples/queries.xml new file mode 100644 index 00000000000..6a456b21d09 --- /dev/null +++ b/go/ql/examples/queries.xml @@ -0,0 +1 @@ + diff --git a/go/ql/examples/snippets/calltobuiltin.ql b/go/ql/examples/snippets/calltobuiltin.ql new file mode 100644 index 00000000000..5ff20e563be --- /dev/null +++ b/go/ql/examples/snippets/calltobuiltin.ql @@ -0,0 +1,15 @@ +/** + * @name Call to built-in function + * @description Finds calls to the built-in `len` function. + * @id go/examples/calltolen + * @tags call + * function + * len + * built-in + */ + +import go + +from DataFlow::CallNode call +where call = Builtin::len().getACall() +select call diff --git a/go/ql/examples/snippets/calltofunction.ql b/go/ql/examples/snippets/calltofunction.ql new file mode 100644 index 00000000000..5bbe28b52a6 --- /dev/null +++ b/go/ql/examples/snippets/calltofunction.ql @@ -0,0 +1,16 @@ +/** + * @name Call to library function + * @description Finds calls to "fmt.Println". + * @id go/examples/calltoprintln + * @tags call + * function + * println + */ + +import go + +from Function println, DataFlow::CallNode call +where + println.hasQualifiedName("fmt", "Println") and + call = println.getACall() +select call diff --git a/go/ql/examples/snippets/calltomethod.ql b/go/ql/examples/snippets/calltomethod.ql new file mode 100644 index 00000000000..eebfc707f2b --- /dev/null +++ b/go/ql/examples/snippets/calltomethod.ql @@ -0,0 +1,18 @@ +/** + * @name Call to method + * @description Finds calls to the `Get` method of type `Header` from the `net/http` package. + * @id go/examples/calltoheaderget + * @tags call + * function + * net/http + * Header + * strings + */ + +import go + +from Method get, DataFlow::CallNode call +where + get.hasQualifiedName("net/http", "Header", "Get") and + call = get.getACall() +select call diff --git a/go/ql/examples/snippets/constant.ql b/go/ql/examples/snippets/constant.ql new file mode 100644 index 00000000000..3627efb6722 --- /dev/null +++ b/go/ql/examples/snippets/constant.ql @@ -0,0 +1,14 @@ +/** + * @name Compile-time constant + * @description Finds compile-time constants with value zero. + * @id go/examples/zeroconstant + * @tags expression + * numeric value + * constant + */ + +import go + +from DataFlow::Node zero +where zero.getNumericValue() = 0 +select zero diff --git a/go/ql/examples/snippets/emptythen.ql b/go/ql/examples/snippets/emptythen.ql new file mode 100644 index 00000000000..97a810e388c --- /dev/null +++ b/go/ql/examples/snippets/emptythen.ql @@ -0,0 +1,18 @@ +/** + * @name If statements with empty then branch + * @description Finds 'if' statements where the 'then' branch is + * an empty block statement + * @id go/examples/emptythen + * @tags if + * then + * empty + * conditional + * branch + * statement + */ + +import go + +from IfStmt i +where i.getThen().getNumStmt() = 0 +select i diff --git a/go/ql/examples/snippets/fieldread.ql b/go/ql/examples/snippets/fieldread.ql new file mode 100644 index 00000000000..aef9bc2f4d9 --- /dev/null +++ b/go/ql/examples/snippets/fieldread.ql @@ -0,0 +1,15 @@ +/** + * @name Field read + * @description Finds code that reads `Request.Method`. + * @id go/examples/readofrequestmethod + * @tags field + * read + */ + +import go + +from Field reqm, Read read +where + reqm.hasQualifiedName("net/http", "Request", "Method") and + read = reqm.getARead() +select read diff --git a/go/ql/examples/snippets/fieldwrite.ql b/go/ql/examples/snippets/fieldwrite.ql new file mode 100644 index 00000000000..b9374f4ef24 --- /dev/null +++ b/go/ql/examples/snippets/fieldwrite.ql @@ -0,0 +1,15 @@ +/** + * @name Field write + * @description Finds assignments to field `Status` of type `Response` from package `net/http`. + * @id go/examples/responsestatus + * @tags net/http + * field write + */ + +import go + +from Field status, Write write +where + status.hasQualifiedName("net/http", "Response", "Status") and + write = status.getAWrite() +select write, write.getRhs() diff --git a/go/ql/examples/snippets/function.ql b/go/ql/examples/snippets/function.ql new file mode 100644 index 00000000000..559dd34c234 --- /dev/null +++ b/go/ql/examples/snippets/function.ql @@ -0,0 +1,13 @@ +/** + * @name Function + * @description Finds functions called "main". + * @id go/examples/mainfunction + * @tags function + * main + */ + +import go + +from Function main +where main.getName() = "main" +select main diff --git a/go/ql/examples/snippets/incompleteswitchoverenum.ql b/go/ql/examples/snippets/incompleteswitchoverenum.ql new file mode 100644 index 00000000000..b201e55089e --- /dev/null +++ b/go/ql/examples/snippets/incompleteswitchoverenum.ql @@ -0,0 +1,17 @@ +/** + * @name Incomplete switch over enum + * @description A switch statement of enum type should explicitly reference each + * of the members of that enum. + * @kind problem + * @id go/examples/incomplete-switch + */ + +import go + +from ExpressionSwitchStmt ss, DeclaredConstant c, NamedType t +where + t.getUnderlyingType() instanceof IntegerType and + t = ss.getExpr().getType() and + c.getType() = t and + forall(CaseClause case | case = ss.getACase() | not case = c.getAReference().getParent()) +select ss, "This switch statement is not exhaustive: missing $@", c, c.getName() diff --git a/go/ql/examples/snippets/nilcheck.ql b/go/ql/examples/snippets/nilcheck.ql new file mode 100644 index 00000000000..cb82f14618e --- /dev/null +++ b/go/ql/examples/snippets/nilcheck.ql @@ -0,0 +1,15 @@ +/** + * @name Comparison with nil + * @description Finds comparisons with nil. + * @id go/examples/nilcheck + * @tags comparison + * nil + */ + +import go + +from DataFlow::EqualityTestNode eq, DataFlow::Node nd, DataFlow::Node nil +where + nil = Builtin::nil().getARead() and + eq.eq(_, nd, nil) +select eq diff --git a/go/ql/examples/snippets/param.ql b/go/ql/examples/snippets/param.ql new file mode 100644 index 00000000000..4340e018f9a --- /dev/null +++ b/go/ql/examples/snippets/param.ql @@ -0,0 +1,12 @@ +/** + * @name Parameter + * @description Finds parameters of type "ResponseWriter" from package "net/http". + * @id go/examples/responseparam + * @tags parameter + */ + +import go + +from Parameter req +where req.getType().hasQualifiedName("net/http", "ResponseWriter") +select req diff --git a/go/ql/examples/snippets/pointertype.ql b/go/ql/examples/snippets/pointertype.ql new file mode 100644 index 00000000000..b21f03f243e --- /dev/null +++ b/go/ql/examples/snippets/pointertype.ql @@ -0,0 +1,15 @@ +/** + * @name Type + * @description Finds pointer type `*Request` from package `net/http`. + * @id go/examples/requestptrtype + * @tags net/http + * type + */ + +import go + +from Type reqtp, PointerType reqptrtp +where + reqtp.hasQualifiedName("net/http", "Request") and + reqptrtp.getBaseType() = reqtp +select reqptrtp diff --git a/go/ql/examples/snippets/receiver.ql b/go/ql/examples/snippets/receiver.ql new file mode 100644 index 00000000000..511ef1314f5 --- /dev/null +++ b/go/ql/examples/snippets/receiver.ql @@ -0,0 +1,12 @@ +/** + * @name Receiver variable + * @description Finds receiver variables of pointer type. + * @id go/examples/pointerreceiver + * @tags receiver variable + */ + +import go + +from ReceiverVariable recv +where recv.getType() instanceof PointerType +select recv diff --git a/go/ql/examples/snippets/result.ql b/go/ql/examples/snippets/result.ql new file mode 100644 index 00000000000..1241142bd4a --- /dev/null +++ b/go/ql/examples/snippets/result.ql @@ -0,0 +1,12 @@ +/** + * @name Result variable + * @description Finds result variables of type "error". + * @id go/examples/errresult + * @tags result variable + */ + +import go + +from ResultVariable err +where err.getType() = Builtin::error().getType() +select err diff --git a/go/ql/examples/snippets/type.ql b/go/ql/examples/snippets/type.ql new file mode 100644 index 00000000000..60861c72bad --- /dev/null +++ b/go/ql/examples/snippets/type.ql @@ -0,0 +1,13 @@ +/** + * @name Type + * @description Finds type `Request` from package `net/http`. + * @id go/examples/requesttype + * @tags net/http + * type + */ + +import go + +from Type request +where request.hasQualifiedName("net/http", "Request") +select request diff --git a/go/ql/examples/snippets/typeinfo.ql b/go/ql/examples/snippets/typeinfo.ql new file mode 100644 index 00000000000..b5c22943466 --- /dev/null +++ b/go/ql/examples/snippets/typeinfo.ql @@ -0,0 +1,16 @@ +/** + * @name Type information + * @description Finds code elements of type `*Request` from package `net/http`. + * @id go/examples/requests + * @tags net/http + * types + */ + +import go + +from Type reqtp, PointerType reqptrtp, DataFlow::Node req +where + reqtp.hasQualifiedName("net/http", "Request") and + reqptrtp.getBaseType() = reqtp and + req.getType() = reqptrtp +select req diff --git a/go/ql/examples/snippets/updateinloop.ql b/go/ql/examples/snippets/updateinloop.ql new file mode 100644 index 00000000000..f047f16dae2 --- /dev/null +++ b/go/ql/examples/snippets/updateinloop.ql @@ -0,0 +1,13 @@ +/** + * @name Increment statements in loops + * @description Finds increment statements that are nested in a loop + * @id go/examples/updateinloop + * @tags nesting + * increment + */ + +import go + +from IncStmt s, LoopStmt l +where s.getParent+() = l +select s, l diff --git a/go/ql/examples/snippets/variable.ql b/go/ql/examples/snippets/variable.ql new file mode 100644 index 00000000000..28bb4934544 --- /dev/null +++ b/go/ql/examples/snippets/variable.ql @@ -0,0 +1,13 @@ +/** + * @name Variable + * @description Finds variables called "err". + * @id go/examples/errvariable + * @tags variable + * err + */ + +import go + +from Variable err +where err.getName() = "err" +select err, err.getDeclaration() diff --git a/go/ql/examples/snippets/varread.ql b/go/ql/examples/snippets/varread.ql new file mode 100644 index 00000000000..87282146d41 --- /dev/null +++ b/go/ql/examples/snippets/varread.ql @@ -0,0 +1,14 @@ +/** + * @name Variable read + * @description Finds code that reads a variable called `err`. + * @id go/examples/readoferr + * @tags variable read + */ + +import go + +from Variable err, Read read +where + err.getName() = "err" and + read = err.getARead() +select read diff --git a/go/ql/examples/snippets/varwrite.ql b/go/ql/examples/snippets/varwrite.ql new file mode 100644 index 00000000000..189e915c167 --- /dev/null +++ b/go/ql/examples/snippets/varwrite.ql @@ -0,0 +1,14 @@ +/** + * @name Variable write + * @description Finds assignments to variables named "err". + * @id go/examples/errwrite + * @tags variable write + */ + +import go + +from Variable err, Write write +where + err.getName() = "err" and + write = err.getAWrite() +select write, write.getRhs() diff --git a/go/ql/examples/snippets/zerocheck.ql b/go/ql/examples/snippets/zerocheck.ql new file mode 100644 index 00000000000..467dae7122d --- /dev/null +++ b/go/ql/examples/snippets/zerocheck.ql @@ -0,0 +1,16 @@ +/** + * @name Comparison with zero + * @description Finds comparisons between an unsigned value and zero. + * @id go/examples/unsignedgez + * @tags comparison + * unsigned + */ + +import go + +from DataFlow::RelationalComparisonNode cmp, DataFlow::Node unsigned, DataFlow::Node zero +where + zero.getNumericValue() = 0 and + unsigned.getType().getUnderlyingType() instanceof UnsignedIntegerType and + cmp.leq(_, zero, unsigned, 0) +select cmp, unsigned diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md new file mode 100644 index 00000000000..940f3e17251 --- /dev/null +++ b/go/ql/lib/CHANGELOG.md @@ -0,0 +1,45 @@ +## 0.1.2 + +### New Features + +* Go 1.18 generics are now extracted and can be explored using the new CodeQL classes `TypeParamDecl`, `GenericFunctionInstantiationExpr`, `GenericTypeInstantiationExpr`, `TypeSetTerm`, and `TypeSetLiteralType`, as well as using new predicates defined on the existing `InterfaceType`. Class- and predicate-level documentation can be found in the [Go CodeQL library reference](https://codeql.github.com/codeql-standard-libraries/go/). + +## 0.1.1 + +### Minor Analysis Improvements + +* The method predicate `getACalleeIncludingExternals` on `DataFlow::CallNode` and the function `viableCallable` in `DataFlowDispatch` now also work for calls to functions via a variable, where the function can be determined using local flow. + +## 0.1.0 + +### Minor Analysis Improvements + +* Fixed a bug where dataflow steps were ignored if both ends were inside the initialiser routine of a file-level variable. + +## 0.0.12 + +## 0.0.11 + +## 0.0.10 + +## 0.0.9 + +## 0.0.8 + +## 0.0.7 + +### Deprecated APIs + +* The `codeql/go-upgrades` CodeQL pack has been removed. All database upgrade scripts have been merged into the `codeql/go-all` CodeQL pack. + +### Bug Fixes + +* `Function`'s predicate `getACall` now returns more results in some situations. It now always returns callers that may call a method indirectly via an interface method that it implements. Previously this only happened if the method was in the source code being analysed. + +## 0.0.6 + +## 0.0.5 + +## 0.0.4 + +## 0.0.3 diff --git a/go/ql/lib/Customizations.qll b/go/ql/lib/Customizations.qll new file mode 100644 index 00000000000..127840de9dd --- /dev/null +++ b/go/ql/lib/Customizations.qll @@ -0,0 +1,12 @@ +/** + * Contains customizations to the standard library. + * + * This module is imported by `go.qll`, so any customizations defined here automatically + * apply to all queries. + * + * Typical examples of customizations include adding new subclasses of abstract classes such as + * `FileSystemAccess`, or the `Source` and `Sink` classes associated with the security queries + * to model frameworks that are not covered by the standard library. + */ + +import go diff --git a/go/ql/lib/change-notes/released/0.0.10.md b/go/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..979029c0162 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1 @@ +## 0.0.10 diff --git a/go/ql/lib/change-notes/released/0.0.11.md b/go/ql/lib/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..eba254bd51f --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.11.md @@ -0,0 +1 @@ +## 0.0.11 diff --git a/go/ql/lib/change-notes/released/0.0.12.md b/go/ql/lib/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..a8e2f0b468e --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.12.md @@ -0,0 +1 @@ +## 0.0.12 diff --git a/go/ql/lib/change-notes/released/0.0.3.md b/go/ql/lib/change-notes/released/0.0.3.md new file mode 100644 index 00000000000..e47c9f5700e --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.3.md @@ -0,0 +1 @@ +## 0.0.3 diff --git a/go/ql/lib/change-notes/released/0.0.4.md b/go/ql/lib/change-notes/released/0.0.4.md new file mode 100644 index 00000000000..3268fefb272 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.4.md @@ -0,0 +1 @@ +## 0.0.4 diff --git a/go/ql/lib/change-notes/released/0.0.5.md b/go/ql/lib/change-notes/released/0.0.5.md new file mode 100644 index 00000000000..259776640e3 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.5.md @@ -0,0 +1 @@ +## 0.0.5 diff --git a/go/ql/lib/change-notes/released/0.0.6.md b/go/ql/lib/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..7cad4d986e5 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.6.md @@ -0,0 +1 @@ +## 0.0.6 diff --git a/go/ql/lib/change-notes/released/0.0.7.md b/go/ql/lib/change-notes/released/0.0.7.md new file mode 100644 index 00000000000..338327d3179 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.7.md @@ -0,0 +1,9 @@ +## 0.0.7 + +### Deprecated APIs + +* The `codeql/go-upgrades` CodeQL pack has been removed. All database upgrade scripts have been merged into the `codeql/go-all` CodeQL pack. + +### Bug Fixes + +* `Function`'s predicate `getACall` now returns more results in some situations. It now always returns callers that may call a method indirectly via an interface method that it implements. Previously this only happened if the method was in the source code being analysed. diff --git a/go/ql/lib/change-notes/released/0.0.8.md b/go/ql/lib/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..bc5efa50ee2 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.8.md @@ -0,0 +1 @@ +## 0.0.8 diff --git a/go/ql/lib/change-notes/released/0.0.9.md b/go/ql/lib/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a64559b3ac8 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.0.9.md @@ -0,0 +1 @@ +## 0.0.9 diff --git a/go/ql/lib/change-notes/released/0.1.0.md b/go/ql/lib/change-notes/released/0.1.0.md new file mode 100644 index 00000000000..6e062153857 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.1.0.md @@ -0,0 +1,5 @@ +## 0.1.0 + +### Minor Analysis Improvements + +* Fixed a bug where dataflow steps were ignored if both ends were inside the initialiser routine of a file-level variable. diff --git a/go/ql/lib/change-notes/released/0.1.1.md b/go/ql/lib/change-notes/released/0.1.1.md new file mode 100644 index 00000000000..724e8e4cd30 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.1.1.md @@ -0,0 +1,5 @@ +## 0.1.1 + +### Minor Analysis Improvements + +* The method predicate `getACalleeIncludingExternals` on `DataFlow::CallNode` and the function `viableCallable` in `DataFlowDispatch` now also work for calls to functions via a variable, where the function can be determined using local flow. diff --git a/go/ql/lib/change-notes/released/0.1.2.md b/go/ql/lib/change-notes/released/0.1.2.md new file mode 100644 index 00000000000..6dfa74f5b5a --- /dev/null +++ b/go/ql/lib/change-notes/released/0.1.2.md @@ -0,0 +1,5 @@ +## 0.1.2 + +### New Features + +* Go 1.18 generics are now extracted and can be explored using the new CodeQL classes `TypeParamDecl`, `GenericFunctionInstantiationExpr`, `GenericTypeInstantiationExpr`, `TypeSetTerm`, and `TypeSetLiteralType`, as well as using new predicates defined on the existing `InterfaceType`. Class- and predicate-level documentation can be found in the [Go CodeQL library reference](https://codeql.github.com/codeql-standard-libraries/go/). diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml new file mode 100644 index 00000000000..6abd14b1ef8 --- /dev/null +++ b/go/ql/lib/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.1.2 diff --git a/go/ql/lib/definitions.ql b/go/ql/lib/definitions.ql new file mode 100644 index 00000000000..46e28d9fe71 --- /dev/null +++ b/go/ql/lib/definitions.ql @@ -0,0 +1,15 @@ +/** + * @name Jump-to-definition links + * @description Generates use-definition pairs that provide the data + * for jump-to-definition in the code viewer. + * @kind definitions + * @id go/jump-to-definition + */ + +import go + +from Ident def, Ident use, Entity e +where + use.uses(e) and + def.declares(e) +select use, def, "V" diff --git a/go/ql/lib/go.dbscheme b/go/ql/lib/go.dbscheme new file mode 100644 index 00000000000..90fa7836e0a --- /dev/null +++ b/go/ql/lib/go.dbscheme @@ -0,0 +1,547 @@ +/** Auto-generated dbscheme; do not edit. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * 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; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +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); + +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); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @namedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int named: @namedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref, + int parent: @typeparamparentobject ref, int idx: int ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @errorexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @namedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @namedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/go.dbscheme.stats b/go/ql/lib/go.dbscheme.stats new file mode 100644 index 00000000000..b18e8556fb2 --- /dev/null +++ b/go/ql/lib/go.dbscheme.stats @@ -0,0 +1,15183 @@ + + + + @similarity + 0 + + + @duplication + 0 + + + @xmldtd + 0 + + + @xmlelement + 504 + + + @xmlattribute + 408 + + + @externalDataElement + 0 + + + @xmlnamespace + 0 + + + @xmlcomment + 30 + + + @xmlcharacters + 869 + + + @compilation + 1 + + + @diagnostic + 0 + + + @file + 529 + + + @folder + 210 + + + @comment_group + 12083 + + + @slashslashcomment + 24878 + + + @slashstarcomment + 846 + + + @ident + 237316 + + + @ellipsis + 141 + + + @intlit + 7683 + + + @floatlit + 27 + + + @charlit + 838 + + + @stringlit + 24892 + + + @funclit + 678 + + + @compositelit + 2704 + + + @parenexpr + 343 + + + @selectorexpr + 54353 + + + @indexexpr + 4581 + + + @sliceexpr + 836 + + + @typeassertexpr + 2127 + + + @callorconversionexpr + 32041 + + + @starexpr + 10360 + + + @keyvalueexpr + 5616 + + + @arraytypeexpr + 3465 + + + @structtypeexpr + 1207 + + + @functypeexpr + 6015 + + + @interfacetypeexpr + 509 + + + @maptypeexpr + 1013 + + + @minusexpr + 270 + + + @notexpr + 1190 + + + @complementexpr + 21 + + + @addressexpr + 1739 + + + @arrowexpr + 92 + + + @lorexpr + 612 + + + @landexpr + 1234 + + + @eqlexpr + 3244 + + + @neqexpr + 4103 + + + @lssexpr + 785 + + + @leqexpr + 248 + + + @gtrexpr + 619 + + + @geqexpr + 270 + + + @addexpr + 1272 + + + @subexpr + 557 + + + @orexpr + 146 + + + @xorexpr + 14 + + + @mulexpr + 207 + + + @quoexpr + 53 + + + @remexpr + 24 + + + @shlexpr + 164 + + + @shrexpr + 57 + + + @andexpr + 235 + + + @andnotexpr + 19 + + + @sendchantypeexpr + 7 + + + @recvchantypeexpr + 9 + + + @sendrcvchantypeexpr + 101 + + + @badexpr + 0 + + + @imaglit + 0 + + + @plusexpr + 0 + + + @derefexpr + 0 + + + @field + 19974 + + + @location_default + 539178 + + + @declstmt + 1454 + + + @labeledstmt + 49 + + + @exprstmt + 7605 + + + @sendstmt + 69 + + + @incstmt + 614 + + + @decstmt + 71 + + + @gostmt + 72 + + + @deferstmt + 358 + + + @returnstmt + 9225 + + + @breakstmt + 301 + + + @continuestmt + 606 + + + @gotostmt + 8 + + + @fallthroughstmt + 7 + + + @blockstmt + 19358 + + + @ifstmt + 9728 + + + @caseclause + 3476 + + + @exprswitchstmt + 378 + + + @typeswitchstmt + 400 + + + @commclause + 72 + + + @selectstmt + 35 + + + @forstmt + 654 + + + @rangestmt + 2135 + + + @assignstmt + 7478 + + + @definestmt + 9514 + + + @addassignstmt + 223 + + + @subassignstmt + 18 + + + @mulassignstmt + 5 + + + @quoassignstmt + 3 + + + @orassignstmt + 63 + + + @xorassignstmt + 3 + + + @shlassignstmt + 2 + + + @shrassignstmt + 3 + + + @andnotassignstmt + 3 + + + @badstmt + 0 + + + @emptystmt + 0 + + + @remassignstmt + 0 + + + @andassignstmt + 0 + + + @importdecl + 479 + + + @constdecl + 280 + + + @typedecl + 1349 + + + @vardecl + 1769 + + + @funcdecl + 4813 + + + @baddecl + 0 + + + @importspec + 3468 + + + @valuespec + 3056 + + + @typedefspec + 1349 + + + @aliasspec + 16 + + + @universescope + 1 + + + @packagescope + 346 + + + @localscope + 36428 + + + @pkgobject + 3468 + + + @decltypeobject + 3602 + + + @builtintypeobject + 20 + + + @declconstobject + 8857 + + + @builtinconstobject + 4 + + + @declvarobject + 51098 + + + @declfunctionobject + 17793 + + + @builtinfunctionobject + 18 + + + @labelobject + 49 + + + @invalidtype + 1 + + + @boolexprtype + 1 + + + @inttype + 1 + + + @int8type + 1 + + + @int16type + 1 + + + @int32type + 1 + + + @int64type + 1 + + + @uinttype + 1 + + + @uint8type + 1 + + + @uint16type + 1 + + + @uint32type + 1 + + + @uint64type + 1 + + + @uintptrtype + 1 + + + @float32type + 1 + + + @float64type + 1 + + + @complex64type + 1 + + + @complex128type + 1 + + + @stringexprtype + 1 + + + @unsafepointertype + 1 + + + @boolliteraltype + 1 + + + @intliteraltype + 1 + + + @runeliteraltype + 1 + + + @floatliteraltype + 1 + + + @stringliteraltype + 1 + + + @nilliteraltype + 1 + + + @arraytype + 293 + + + @slicetype + 637 + + + @structtype + 2409 + + + @pointertype + 1903 + + + @interfacetype + 247 + + + @tupletype + 559 + + + @signaturetype + 8010 + + + @maptype + 430 + + + @sendchantype + 13 + + + @recvchantype + 10 + + + @sendrcvchantype + 29 + + + @namedtype + 3567 + + + @complexliteraltype + 0 + + + @package + 346 + + + @modline + 6 + + + @modlineblock + 1 + + + @modlparen + 1 + + + @modrparen + 1 + + + @modcommentblock + 0 + + + @unknownerror + 0 + + + @listerror + 0 + + + @parseerror + 0 + + + @typeerror + 0 + + + + + duplicateCode + 0 + + + id + 0 + + + relativePath + 0 + + + equivClass + 0 + + + + + id + relativePath + + + 12 + + + 1 + 2 + 1 + + + + + + + id + equivClass + + + 12 + + + 1 + 2 + 1 + + + + + + + relativePath + id + + + 12 + + + + + + relativePath + equivClass + + + 12 + + + + + + equivClass + id + + + 12 + + + + + + equivClass + relativePath + + + 12 + + + + + + + + similarCode + 0 + + + id + 0 + + + relativePath + 0 + + + equivClass + 0 + + + + + id + relativePath + + + 12 + + + 1 + 2 + 1 + + + + + + + id + equivClass + + + 12 + + + 1 + 2 + 1 + + + + + + + relativePath + id + + + 12 + + + + + + relativePath + equivClass + + + 12 + + + + + + equivClass + id + + + 12 + + + + + + equivClass + relativePath + + + 12 + + + + + + + + tokens + 0 + + + id + 0 + + + offset + 0 + + + beginLine + 0 + + + beginColumn + 0 + + + endLine + 0 + + + endColumn + 0 + + + + + id + offset + + + 12 + + + + + + id + beginLine + + + 12 + + + + + + id + beginColumn + + + 12 + + + + + + id + endLine + + + 12 + + + + + + id + endColumn + + + 12 + + + + + + offset + id + + + 12 + + + + + + offset + beginLine + + + 12 + + + + + + offset + beginColumn + + + 12 + + + + + + offset + endLine + + + 12 + + + + + + offset + endColumn + + + 12 + + + + + + beginLine + id + + + 12 + + + + + + beginLine + offset + + + 12 + + + + + + beginLine + beginColumn + + + 12 + + + + + + beginLine + endLine + + + 12 + + + + + + beginLine + endColumn + + + 12 + + + + + + beginColumn + id + + + 12 + + + + + + beginColumn + offset + + + 12 + + + + + + beginColumn + beginLine + + + 12 + + + + + + beginColumn + endLine + + + 12 + + + + + + beginColumn + endColumn + + + 12 + + + + + + endLine + id + + + 12 + + + + + + endLine + offset + + + 12 + + + + + + endLine + beginLine + + + 12 + + + + + + endLine + beginColumn + + + 12 + + + + + + endLine + endColumn + + + 12 + + + + + + endColumn + id + + + 12 + + + + + + endColumn + offset + + + 12 + + + + + + endColumn + beginLine + + + 12 + + + + + + endColumn + beginColumn + + + 12 + + + + + + endColumn + endLine + + + 12 + + + + + + + + externalData + 0 + + + id + 0 + + + path + 0 + + + column + 0 + + + value + 0 + + + + + id + path + + + 12 + + + + + + id + column + + + 12 + + + + + + id + value + + + 12 + + + + + + path + id + + + 12 + + + + + + path + column + + + 12 + + + + + + path + value + + + 12 + + + + + + column + id + + + 12 + + + + + + column + path + + + 12 + + + + + + column + value + + + 12 + + + + + + value + id + + + 12 + + + + + + value + path + + + 12 + + + + + + value + column + + + 12 + + + + + + + + snapshotDate + 0 + + + snapshotDate + 0 + + + + + + sourceLocationPrefix + 1 + + + prefix + 1 + + + + + + xmlEncoding + 0 + + + id + 0 + + + encoding + 0 + + + + + id + encoding + + + 12 + + + 1 + 2 + 1 + + + + + + + encoding + id + + + 12 + + + + + + + + xmlDTDs + 0 + + + id + 0 + + + root + 0 + + + publicId + 0 + + + systemId + 0 + + + fileid + 0 + + + + + id + root + + + 12 + + + 1 + 2 + 1 + + + + + + + id + publicId + + + 12 + + + 1 + 2 + 1 + + + + + + + id + systemId + + + 12 + + + 1 + 2 + 1 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1 + + + + + + + root + id + + + 12 + + + + + + root + publicId + + + 12 + + + + + + root + systemId + + + 12 + + + + + + root + fileid + + + 12 + + + + + + publicId + id + + + 12 + + + + + + publicId + root + + + 12 + + + + + + publicId + systemId + + + 12 + + + + + + publicId + fileid + + + 12 + + + + + + systemId + id + + + 12 + + + + + + systemId + root + + + 12 + + + + + + systemId + publicId + + + 12 + + + + + + systemId + fileid + + + 12 + + + + + + fileid + id + + + 12 + + + + + + fileid + root + + + 12 + + + + + + fileid + publicId + + + 12 + + + + + + fileid + systemId + + + 12 + + + + + + + + xmlElements + 504 + + + id + 504 + + + name + 38 + + + parentid + 199 + + + idx + 86 + + + fileid + 14 + + + + + id + name + + + 12 + + + 1 + 2 + 504 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 504 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 504 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 504 + + + + + + + name + id + + + 12 + + + 1 + 2 + 11 + + + 2 + 3 + 3 + + + 3 + 4 + 4 + + + 4 + 6 + 3 + + + 7 + 12 + 3 + + + 12 + 14 + 2 + + + 14 + 16 + 3 + + + 16 + 22 + 3 + + + 27 + 40 + 3 + + + 55 + 101 + 3 + + + + + + + name + parentid + + + 12 + + + 1 + 2 + 15 + + + 2 + 3 + 4 + + + 3 + 4 + 4 + + + 4 + 5 + 3 + + + 5 + 6 + 1 + + + 6 + 7 + 3 + + + 7 + 18 + 3 + + + 18 + 22 + 3 + + + 29 + 76 + 2 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 12 + + + 2 + 3 + 4 + + + 3 + 4 + 5 + + + 4 + 5 + 1 + + + 5 + 6 + 3 + + + 6 + 9 + 3 + + + 10 + 11 + 2 + + + 13 + 15 + 3 + + + 15 + 17 + 3 + + + 17 + 41 + 2 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 18 + + + 2 + 3 + 7 + + + 3 + 4 + 3 + + + 4 + 5 + 1 + + + 5 + 6 + 4 + + + 7 + 11 + 3 + + + 11 + 14 + 2 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 116 + + + 2 + 3 + 37 + + + 3 + 4 + 22 + + + 4 + 8 + 15 + + + 8 + 61 + 9 + + + + + + + parentid + name + + + 12 + + + 1 + 2 + 160 + + + 2 + 3 + 23 + + + 3 + 8 + 16 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 116 + + + 2 + 3 + 37 + + + 3 + 4 + 22 + + + 4 + 8 + 15 + + + 8 + 61 + 9 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 199 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 54 + + + 2 + 3 + 4 + + + 3 + 4 + 11 + + + 4 + 6 + 6 + + + 6 + 21 + 7 + + + 40 + 141 + 4 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 54 + + + 2 + 3 + 5 + + + 3 + 4 + 11 + + + 4 + 5 + 6 + + + 5 + 12 + 7 + + + 14 + 26 + 3 + + + + + + + idx + parentid + + + 12 + + + 1 + 2 + 54 + + + 2 + 3 + 4 + + + 3 + 4 + 11 + + + 4 + 6 + 6 + + + 6 + 21 + 7 + + + 40 + 141 + 4 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 54 + + + 2 + 3 + 4 + + + 3 + 4 + 11 + + + 4 + 5 + 8 + + + 5 + 13 + 7 + + + 13 + 15 + 2 + + + + + + + fileid + id + + + 12 + + + 2 + 3 + 1 + + + 7 + 8 + 1 + + + 8 + 9 + 2 + + + 10 + 11 + 1 + + + 16 + 17 + 1 + + + 18 + 19 + 1 + + + 20 + 21 + 1 + + + 21 + 22 + 2 + + + 58 + 59 + 1 + + + 100 + 101 + 1 + + + 107 + 108 + 1 + + + 108 + 109 + 1 + + + + + + + fileid + name + + + 12 + + + 2 + 3 + 1 + + + 3 + 4 + 2 + + + 4 + 5 + 1 + + + 5 + 6 + 2 + + + 6 + 7 + 2 + + + 8 + 9 + 2 + + + 11 + 12 + 1 + + + 16 + 17 + 1 + + + 17 + 18 + 1 + + + 19 + 20 + 1 + + + + + + + fileid + parentid + + + 12 + + + 2 + 3 + 2 + + + 4 + 5 + 1 + + + 6 + 7 + 2 + + + 7 + 8 + 3 + + + 9 + 10 + 1 + + + 10 + 11 + 1 + + + 20 + 21 + 1 + + + 23 + 24 + 1 + + + 47 + 48 + 1 + + + 49 + 50 + 1 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 1 + + + 3 + 4 + 2 + + + 4 + 5 + 1 + + + 7 + 8 + 3 + + + 8 + 9 + 1 + + + 13 + 14 + 1 + + + 14 + 15 + 1 + + + 16 + 17 + 1 + + + 30 + 31 + 1 + + + 34 + 35 + 1 + + + 67 + 68 + 1 + + + + + + + + + xmlAttrs + 408 + + + id + 408 + + + elementid + 288 + + + name + 28 + + + value + 235 + + + idx + 6 + + + fileid + 14 + + + + + id + elementid + + + 12 + + + 1 + 2 + 408 + + + + + + + id + name + + + 12 + + + 1 + 2 + 408 + + + + + + + id + value + + + 12 + + + 1 + 2 + 408 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 408 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 408 + + + + + + + elementid + id + + + 12 + + + 1 + 2 + 195 + + + 2 + 3 + 69 + + + 3 + 4 + 23 + + + 6 + 7 + 1 + + + + + + + elementid + name + + + 12 + + + 1 + 2 + 195 + + + 2 + 3 + 69 + + + 3 + 4 + 23 + + + 6 + 7 + 1 + + + + + + + elementid + value + + + 12 + + + 1 + 2 + 195 + + + 2 + 3 + 70 + + + 3 + 4 + 22 + + + 4 + 5 + 1 + + + + + + + elementid + idx + + + 12 + + + 1 + 2 + 195 + + + 2 + 3 + 69 + + + 3 + 4 + 23 + + + 6 + 7 + 1 + + + + + + + elementid + fileid + + + 12 + + + 1 + 2 + 288 + + + + + + + name + id + + + 12 + + + 1 + 2 + 12 + + + 2 + 3 + 3 + + + 3 + 4 + 4 + + + 5 + 15 + 2 + + + 21 + 22 + 2 + + + 22 + 23 + 2 + + + 45 + 97 + 2 + + + 132 + 133 + 1 + + + + + + + name + elementid + + + 12 + + + 1 + 2 + 12 + + + 2 + 3 + 3 + + + 3 + 4 + 4 + + + 5 + 15 + 2 + + + 21 + 22 + 2 + + + 22 + 23 + 2 + + + 45 + 97 + 2 + + + 132 + 133 + 1 + + + + + + + name + value + + + 12 + + + 1 + 2 + 16 + + + 2 + 3 + 2 + + + 3 + 4 + 3 + + + 11 + 12 + 1 + + + 15 + 16 + 2 + + + 21 + 36 + 2 + + + 41 + 75 + 2 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 19 + + + 2 + 3 + 5 + + + 3 + 4 + 4 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 18 + + + 2 + 3 + 2 + + + 3 + 4 + 2 + + + 4 + 6 + 2 + + + 10 + 11 + 3 + + + 13 + 14 + 1 + + + + + + + value + id + + + 12 + + + 1 + 2 + 171 + + + 2 + 3 + 32 + + + 3 + 5 + 18 + + + 5 + 13 + 14 + + + + + + + value + elementid + + + 12 + + + 1 + 2 + 174 + + + 2 + 3 + 29 + + + 3 + 5 + 18 + + + 5 + 13 + 14 + + + + + + + value + name + + + 12 + + + 1 + 2 + 230 + + + 2 + 4 + 5 + + + + + + + value + idx + + + 12 + + + 1 + 2 + 224 + + + 2 + 4 + 11 + + + + + + + value + fileid + + + 12 + + + 1 + 2 + 193 + + + 2 + 3 + 32 + + + 3 + 7 + 10 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 3 + + + 24 + 25 + 1 + + + 93 + 94 + 1 + + + 288 + 289 + 1 + + + + + + + idx + elementid + + + 12 + + + 1 + 2 + 3 + + + 24 + 25 + 1 + + + 93 + 94 + 1 + + + 288 + 289 + 1 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 3 + + + 8 + 9 + 1 + + + 14 + 15 + 1 + + + 16 + 17 + 1 + + + + + + + idx + value + + + 12 + + + 1 + 2 + 3 + + + 23 + 24 + 1 + + + 64 + 65 + 1 + + + 157 + 158 + 1 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 3 + + + 6 + 7 + 1 + + + 12 + 13 + 1 + + + 14 + 15 + 1 + + + + + + + fileid + id + + + 12 + + + 2 + 3 + 1 + + + 4 + 5 + 1 + + + 10 + 11 + 2 + + + 11 + 12 + 1 + + + 12 + 13 + 1 + + + 17 + 18 + 1 + + + 18 + 19 + 1 + + + 19 + 20 + 1 + + + 22 + 23 + 1 + + + 48 + 49 + 1 + + + 73 + 74 + 2 + + + 89 + 90 + 1 + + + + + + + fileid + elementid + + + 12 + + + 1 + 2 + 1 + + + 4 + 5 + 1 + + + 8 + 9 + 2 + + + 9 + 10 + 1 + + + 11 + 12 + 1 + + + 12 + 13 + 2 + + + 16 + 17 + 1 + + + 17 + 18 + 1 + + + 18 + 19 + 1 + + + 42 + 43 + 1 + + + 63 + 64 + 1 + + + 67 + 68 + 1 + + + + + + + fileid + name + + + 12 + + + 2 + 3 + 2 + + + 3 + 4 + 2 + + + 4 + 5 + 4 + + + 5 + 6 + 1 + + + 6 + 7 + 2 + + + 7 + 8 + 2 + + + 23 + 24 + 1 + + + + + + + fileid + value + + + 12 + + + 2 + 3 + 1 + + + 3 + 4 + 1 + + + 6 + 7 + 1 + + + 8 + 9 + 2 + + + 9 + 10 + 1 + + + 10 + 11 + 1 + + + 13 + 14 + 1 + + + 14 + 15 + 1 + + + 18 + 19 + 1 + + + 32 + 33 + 1 + + + 54 + 55 + 1 + + + 60 + 61 + 1 + + + 61 + 62 + 1 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 2 + + + 2 + 3 + 6 + + + 3 + 4 + 5 + + + 6 + 7 + 1 + + + + + + + + + xmlNs + 0 + + + id + 0 + + + prefixName + 0 + + + URI + 0 + + + fileid + 0 + + + + + id + prefixName + + + 12 + + + + + + id + URI + + + 12 + + + + + + id + fileid + + + 12 + + + + + + prefixName + id + + + 12 + + + + + + prefixName + URI + + + 12 + + + + + + prefixName + fileid + + + 12 + + + + + + URI + id + + + 12 + + + + + + URI + prefixName + + + 12 + + + + + + URI + fileid + + + 12 + + + + + + fileid + id + + + 12 + + + + + + fileid + prefixName + + + 12 + + + + + + fileid + URI + + + 12 + + + + + + + + xmlHasNs + 0 + + + elementId + 0 + + + nsId + 0 + + + fileid + 0 + + + + + elementId + nsId + + + 12 + + + + + + elementId + fileid + + + 12 + + + + + + nsId + elementId + + + 12 + + + + + + nsId + fileid + + + 12 + + + + + + fileid + elementId + + + 12 + + + + + + fileid + nsId + + + 12 + + + + + + + + xmlComments + 30 + + + id + 30 + + + text + 18 + + + parentid + 20 + + + fileid + 10 + + + + + id + text + + + 12 + + + 1 + 2 + 30 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 30 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 30 + + + + + + + text + id + + + 12 + + + 1 + 2 + 13 + + + 2 + 3 + 3 + + + 4 + 5 + 1 + + + 7 + 8 + 1 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 14 + + + 2 + 3 + 2 + + + 4 + 5 + 1 + + + 7 + 8 + 1 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 15 + + + 2 + 3 + 2 + + + 7 + 8 + 1 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 15 + + + 2 + 3 + 3 + + + 4 + 5 + 1 + + + 5 + 6 + 1 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 15 + + + 2 + 3 + 3 + + + 3 + 4 + 1 + + + 5 + 6 + 1 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 20 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 6 + + + 2 + 3 + 1 + + + 4 + 5 + 1 + + + 8 + 9 + 1 + + + 10 + 11 + 1 + + + + + + + fileid + text + + + 12 + + + 1 + 2 + 6 + + + 2 + 3 + 1 + + + 4 + 5 + 1 + + + 5 + 6 + 1 + + + 9 + 10 + 1 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 7 + + + 3 + 4 + 1 + + + 5 + 6 + 2 + + + + + + + + + xmlChars + 869 + + + id + 869 + + + text + 427 + + + parentid + 432 + + + idx + 87 + + + isCDATA + 1 + + + fileid + 14 + + + + + id + text + + + 12 + + + 1 + 2 + 869 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 869 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 869 + + + + + + + id + isCDATA + + + 12 + + + 1 + 2 + 869 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 869 + + + + + + + text + id + + + 12 + + + 1 + 2 + 339 + + + 2 + 3 + 53 + + + 3 + 49 + 33 + + + 68 + 90 + 2 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 342 + + + 2 + 3 + 50 + + + 3 + 28 + 33 + + + 28 + 32 + 2 + + + + + + + text + idx + + + 12 + + + 1 + 2 + 400 + + + 2 + 58 + 27 + + + + + + + text + isCDATA + + + 12 + + + 1 + 2 + 427 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 380 + + + 2 + 4 + 36 + + + 4 + 11 + 11 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 302 + + + 2 + 3 + 53 + + + 3 + 4 + 28 + + + 4 + 7 + 34 + + + 7 + 60 + 15 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 314 + + + 2 + 3 + 67 + + + 3 + 5 + 37 + + + 5 + 26 + 14 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 302 + + + 2 + 3 + 53 + + + 3 + 4 + 28 + + + 4 + 7 + 34 + + + 7 + 60 + 15 + + + + + + + parentid + isCDATA + + + 12 + + + 1 + 2 + 432 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 432 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 3 + + + 3 + 4 + 11 + + + 4 + 7 + 7 + + + 8 + 28 + 7 + + + 41 + 408 + 4 + + + + + + + idx + text + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 3 + + + 3 + 4 + 12 + + + 4 + 7 + 7 + + + 7 + 28 + 7 + + + 44 + 251 + 3 + + + + + + + idx + parentid + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 3 + + + 3 + 4 + 11 + + + 4 + 7 + 7 + + + 8 + 28 + 7 + + + 41 + 408 + 4 + + + + + + + idx + isCDATA + + + 12 + + + 1 + 2 + 87 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 3 + + + 3 + 4 + 12 + + + 4 + 5 + 7 + + + 5 + 12 + 7 + + + 13 + 15 + 3 + + + + + + + isCDATA + id + + + 12 + + + 869 + 870 + 1 + + + + + + + isCDATA + text + + + 12 + + + 427 + 428 + 1 + + + + + + + isCDATA + parentid + + + 12 + + + 432 + 433 + 1 + + + + + + + isCDATA + idx + + + 12 + + + 87 + 88 + 1 + + + + + + + isCDATA + fileid + + + 12 + + + 14 + 15 + 1 + + + + + + + fileid + id + + + 12 + + + 5 + 6 + 1 + + + 13 + 14 + 1 + + + 14 + 15 + 2 + + + 17 + 18 + 1 + + + 28 + 29 + 1 + + + 30 + 31 + 1 + + + 34 + 35 + 1 + + + 35 + 36 + 1 + + + 36 + 37 + 1 + + + 80 + 81 + 1 + + + 177 + 178 + 1 + + + 191 + 192 + 1 + + + 195 + 196 + 1 + + + + + + + fileid + text + + + 12 + + + 3 + 4 + 1 + + + 7 + 8 + 2 + + + 9 + 10 + 1 + + + 13 + 14 + 1 + + + 15 + 16 + 1 + + + 18 + 19 + 1 + + + 24 + 25 + 1 + + + 25 + 26 + 1 + + + 26 + 27 + 1 + + + 49 + 50 + 1 + + + 100 + 101 + 1 + + + 105 + 106 + 1 + + + 118 + 119 + 1 + + + + + + + fileid + parentid + + + 12 + + + 3 + 4 + 1 + + + 7 + 8 + 1 + + + 9 + 10 + 2 + + + 10 + 11 + 1 + + + 14 + 15 + 1 + + + 15 + 16 + 2 + + + 18 + 19 + 1 + + + 20 + 21 + 1 + + + 33 + 34 + 1 + + + 88 + 89 + 1 + + + 95 + 96 + 1 + + + 96 + 97 + 1 + + + + + + + fileid + idx + + + 12 + + + 2 + 3 + 1 + + + 4 + 5 + 2 + + + 5 + 6 + 1 + + + 7 + 8 + 3 + + + 9 + 10 + 1 + + + 13 + 14 + 1 + + + 15 + 16 + 2 + + + 32 + 33 + 1 + + + 35 + 36 + 1 + + + 65 + 66 + 1 + + + + + + + fileid + isCDATA + + + 12 + + + 1 + 2 + 14 + + + + + + + + + xmllocations + 1825 + + + xmlElement + 1825 + + + location + 1825 + + + + + xmlElement + location + + + 12 + + + 1 + 2 + 1825 + + + + + + + location + xmlElement + + + 12 + + + 1 + 2 + 1825 + + + + + + + + + compilations + 1 + + + id + 1 + + + cwd + 1 + + + + + id + cwd + + + 12 + + + 1 + 2 + 1 + + + + + + + cwd + id + + + 12 + + + 1 + 2 + 1 + + + + + + + + + compilation_args + 3 + + + id + 1 + + + num + 3 + + + arg + 3 + + + + + id + num + + + 12 + + + 3 + 4 + 1 + + + + + + + id + arg + + + 12 + + + 3 + 4 + 1 + + + + + + + num + id + + + 12 + + + 1 + 2 + 3 + + + + + + + num + arg + + + 12 + + + 1 + 2 + 3 + + + + + + + arg + id + + + 12 + + + 1 + 2 + 3 + + + + + + + arg + num + + + 12 + + + 1 + 2 + 3 + + + + + + + + + compilation_time + 0 + + + id + 0 + + + num + 0 + + + kind + 0 + + + secs + 0 + + + + + id + num + + + 12 + + + + + + id + kind + + + 12 + + + + + + id + secs + + + 12 + + + + + + num + id + + + 12 + + + + + + num + kind + + + 12 + + + + + + num + secs + + + 12 + + + + + + kind + id + + + 12 + + + + + + kind + num + + + 12 + + + + + + kind + secs + + + 12 + + + + + + secs + id + + + 12 + + + + + + secs + num + + + 12 + + + + + + secs + kind + + + 12 + + + + + + + + diagnostic_for + 0 + + + diagnostic + 0 + + + compilation + 0 + + + file_number + 0 + + + file_number_diagnostic_number + 0 + + + + + diagnostic + compilation + + + 12 + + + 1 + 2 + 1 + + + + + + + diagnostic + file_number + + + 12 + + + 1 + 2 + 1 + + + + + + + diagnostic + file_number_diagnostic_number + + + 12 + + + 1 + 2 + 1 + + + + + + + compilation + diagnostic + + + 12 + + + + + + compilation + file_number + + + 12 + + + + + + compilation + file_number_diagnostic_number + + + 12 + + + + + + file_number + diagnostic + + + 12 + + + + + + file_number + compilation + + + 12 + + + + + + file_number + file_number_diagnostic_number + + + 12 + + + + + + file_number_diagnostic_number + diagnostic + + + 12 + + + + + + file_number_diagnostic_number + compilation + + + 12 + + + + + + file_number_diagnostic_number + file_number + + + 12 + + + + + + + + compilation_finished + 1 + + + id + 1 + + + cpu_seconds + 1 + + + elapsed_seconds + 1 + + + + + id + cpu_seconds + + + 12 + + + 1 + 2 + 1 + + + + + + + id + elapsed_seconds + + + 12 + + + 1 + 2 + 1 + + + + + + + cpu_seconds + id + + + 12 + + + 1 + 2 + 1 + + + + + + + cpu_seconds + elapsed_seconds + + + 12 + + + 1 + 2 + 1 + + + + + + + elapsed_seconds + id + + + 12 + + + 1 + 2 + 1 + + + + + + + elapsed_seconds + cpu_seconds + + + 12 + + + 1 + 2 + 1 + + + + + + + + + compilation_compiling_files + 515 + + + id + 1 + + + num + 515 + + + file + 515 + + + + + id + num + + + 12 + + + 515 + 516 + 1 + + + + + + + id + file + + + 12 + + + 515 + 516 + 1 + + + + + + + num + id + + + 12 + + + 1 + 2 + 515 + + + + + + + num + file + + + 12 + + + 1 + 2 + 515 + + + + + + + file + id + + + 12 + + + 1 + 2 + 515 + + + + + + + file + num + + + 12 + + + 1 + 2 + 515 + + + + + + + + + diagnostics + 0 + + + id + 0 + + + severity + 0 + + + error_tag + 0 + + + error_message + 0 + + + full_error_message + 0 + + + location + 0 + + + + + id + severity + + + 12 + + + 1 + 2 + 1 + + + + + + + id + error_tag + + + 12 + + + 1 + 2 + 1 + + + + + + + id + error_message + + + 12 + + + 1 + 2 + 1 + + + + + + + id + full_error_message + + + 12 + + + 1 + 2 + 1 + + + + + + + id + location + + + 12 + + + 1 + 2 + 1 + + + + + + + severity + id + + + 12 + + + + + + severity + error_tag + + + 12 + + + + + + severity + error_message + + + 12 + + + + + + severity + full_error_message + + + 12 + + + + + + severity + location + + + 12 + + + + + + error_tag + id + + + 12 + + + + + + error_tag + severity + + + 12 + + + + + + error_tag + error_message + + + 12 + + + + + + error_tag + full_error_message + + + 12 + + + + + + error_tag + location + + + 12 + + + + + + error_message + id + + + 12 + + + + + + error_message + severity + + + 12 + + + + + + error_message + error_tag + + + 12 + + + + + + error_message + full_error_message + + + 12 + + + + + + error_message + location + + + 12 + + + + + + full_error_message + id + + + 12 + + + + + + full_error_message + severity + + + 12 + + + + + + full_error_message + error_tag + + + 12 + + + + + + full_error_message + error_message + + + 12 + + + + + + full_error_message + location + + + 12 + + + + + + location + id + + + 12 + + + + + + location + severity + + + 12 + + + + + + location + error_tag + + + 12 + + + + + + location + error_message + + + 12 + + + + + + location + full_error_message + + + 12 + + + + + + + + locations_default + 539178 + + + id + 539178 + + + file + 529 + + + beginLine + 10312 + + + beginColumn + 211 + + + endLine + 10378 + + + endColumn + 274 + + + + + id + file + + + 12 + + + 1 + 2 + 539178 + + + + + + + id + beginLine + + + 12 + + + 1 + 2 + 539178 + + + + + + + id + beginColumn + + + 12 + + + 1 + 2 + 539178 + + + + + + + id + endLine + + + 12 + + + 1 + 2 + 539178 + + + + + + + id + endColumn + + + 12 + + + 1 + 2 + 539178 + + + + + + + file + id + + + 12 + + + 4 + 39 + 41 + + + 39 + 120 + 40 + + + 120 + 208 + 40 + + + 210 + 290 + 40 + + + 291 + 372 + 40 + + + 372 + 453 + 41 + + + 456 + 563 + 40 + + + 565 + 769 + 40 + + + 774 + 1007 + 40 + + + 1012 + 1339 + 42 + + + 1347 + 1700 + 40 + + + 1701 + 2804 + 40 + + + 2873 + 6918 + 40 + + + 8171 + 11207 + 5 + + + + + + + file + beginLine + + + 12 + + + 3 + 15 + 44 + + + 15 + 27 + 42 + + + 27 + 46 + 40 + + + 46 + 63 + 43 + + + 63 + 78 + 40 + + + 78 + 94 + 41 + + + 95 + 120 + 40 + + + 120 + 152 + 41 + + + 152 + 188 + 40 + + + 189 + 247 + 41 + + + 249 + 325 + 40 + + + 336 + 544 + 40 + + + 554 + 10233 + 37 + + + + + + + file + beginColumn + + + 12 + + + 3 + 16 + 40 + + + 16 + 34 + 40 + + + 34 + 44 + 40 + + + 45 + 51 + 44 + + + 51 + 58 + 41 + + + 58 + 63 + 47 + + + 63 + 68 + 44 + + + 68 + 73 + 43 + + + 73 + 80 + 47 + + + 80 + 86 + 43 + + + 86 + 98 + 42 + + + 98 + 115 + 42 + + + 115 + 157 + 16 + + + + + + + file + endLine + + + 12 + + + 3 + 16 + 41 + + + 16 + 31 + 40 + + + 31 + 52 + 40 + + + 52 + 73 + 43 + + + 73 + 92 + 42 + + + 92 + 111 + 40 + + + 111 + 139 + 40 + + + 139 + 180 + 40 + + + 180 + 219 + 40 + + + 223 + 293 + 40 + + + 294 + 370 + 40 + + + 373 + 616 + 40 + + + 617 + 1835 + 40 + + + 2166 + 10377 + 3 + + + + + + + file + endColumn + + + 12 + + + 4 + 21 + 42 + + + 22 + 45 + 41 + + + 46 + 59 + 43 + + + 59 + 65 + 40 + + + 65 + 71 + 42 + + + 71 + 76 + 47 + + + 76 + 81 + 40 + + + 81 + 85 + 48 + + + 85 + 91 + 41 + + + 91 + 97 + 42 + + + 97 + 105 + 41 + + + 105 + 119 + 42 + + + 119 + 166 + 20 + + + + + + + beginLine + id + + + 12 + + + 1 + 2 + 6869 + + + 2 + 7 + 843 + + + 7 + 20 + 796 + + + 20 + 80 + 780 + + + 80 + 698 + 774 + + + 699 + 1775 + 250 + + + + + + + beginLine + file + + + 12 + + + 1 + 2 + 6947 + + + 2 + 3 + 868 + + + 3 + 6 + 899 + + + 6 + 24 + 774 + + + 24 + 304 + 774 + + + 305 + 530 + 50 + + + + + + + beginLine + beginColumn + + + 12 + + + 1 + 2 + 6894 + + + 2 + 5 + 789 + + + 5 + 11 + 780 + + + 11 + 30 + 796 + + + 30 + 72 + 779 + + + 72 + 115 + 274 + + + + + + + beginLine + endLine + + + 12 + + + 1 + 2 + 7630 + + + 2 + 3 + 1017 + + + 3 + 6 + 779 + + + 6 + 21 + 792 + + + 21 + 315 + 94 + + + + + + + beginLine + endColumn + + + 12 + + + 1 + 2 + 6871 + + + 2 + 5 + 793 + + + 5 + 12 + 789 + + + 12 + 33 + 778 + + + 33 + 81 + 781 + + + 81 + 127 + 300 + + + + + + + beginColumn + id + + + 12 + + + 1 + 2 + 29 + + + 2 + 4 + 19 + + + 4 + 9 + 16 + + + 10 + 22 + 16 + + + 22 + 62 + 16 + + + 62 + 141 + 16 + + + 144 + 330 + 16 + + + 330 + 759 + 16 + + + 781 + 1804 + 16 + + + 1846 + 3757 + 16 + + + 4042 + 8613 + 16 + + + 8764 + 22092 + 16 + + + 28067 + 55590 + 3 + + + + + + + beginColumn + file + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 14 + + + 4 + 10 + 18 + + + 10 + 22 + 17 + + + 22 + 48 + 17 + + + 49 + 96 + 17 + + + 96 + 180 + 16 + + + 180 + 292 + 16 + + + 297 + 382 + 16 + + + 383 + 430 + 16 + + + 431 + 463 + 16 + + + 463 + 530 + 12 + + + + + + + beginColumn + beginLine + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 13 + + + 4 + 9 + 16 + + + 9 + 20 + 16 + + + 20 + 53 + 16 + + + 55 + 103 + 16 + + + 107 + 209 + 16 + + + 221 + 412 + 16 + + + 422 + 682 + 16 + + + 706 + 975 + 16 + + + 977 + 1410 + 16 + + + 1417 + 1983 + 16 + + + 2809 + 10184 + 2 + + + + + + + beginColumn + endLine + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 13 + + + 4 + 9 + 16 + + + 9 + 21 + 19 + + + 24 + 55 + 16 + + + 58 + 128 + 16 + + + 131 + 226 + 16 + + + 231 + 453 + 16 + + + 480 + 769 + 16 + + + 783 + 1037 + 16 + + + 1057 + 1521 + 16 + + + 1526 + 10180 + 15 + + + + + + + beginColumn + endColumn + + + 12 + + + 1 + 2 + 31 + + + 2 + 3 + 16 + + + 3 + 6 + 17 + + + 6 + 12 + 17 + + + 12 + 21 + 16 + + + 21 + 28 + 16 + + + 28 + 35 + 17 + + + 35 + 45 + 16 + + + 46 + 56 + 16 + + + 56 + 77 + 17 + + + 77 + 101 + 17 + + + 101 + 201 + 15 + + + + + + + endLine + id + + + 12 + + + 1 + 2 + 6731 + + + 2 + 6 + 903 + + + 6 + 16 + 817 + + + 16 + 58 + 785 + + + 58 + 457 + 779 + + + 458 + 1734 + 363 + + + + + + + endLine + file + + + 12 + + + 1 + 2 + 6847 + + + 2 + 3 + 810 + + + 3 + 5 + 787 + + + 5 + 14 + 802 + + + 14 + 104 + 780 + + + 105 + 530 + 352 + + + + + + + endLine + beginLine + + + 12 + + + 1 + 2 + 7766 + + + 2 + 3 + 956 + + + 3 + 7 + 860 + + + 7 + 27 + 785 + + + 27 + 31 + 11 + + + + + + + endLine + beginColumn + + + 12 + + + 1 + 2 + 6749 + + + 2 + 4 + 616 + + + 4 + 8 + 878 + + + 8 + 21 + 799 + + + 21 + 53 + 779 + + + 53 + 113 + 557 + + + + + + + endLine + endColumn + + + 12 + + + 1 + 2 + 6792 + + + 2 + 5 + 936 + + + 5 + 12 + 801 + + + 12 + 34 + 791 + + + 34 + 83 + 787 + + + 83 + 127 + 271 + + + + + + + endColumn + id + + + 12 + + + 1 + 2 + 33 + + + 2 + 3 + 60 + + + 3 + 9 + 23 + + + 9 + 40 + 21 + + + 43 + 111 + 21 + + + 121 + 347 + 21 + + + 369 + 1229 + 21 + + + 1267 + 3311 + 21 + + + 3642 + 7560 + 21 + + + 7682 + 12716 + 21 + + + 12740 + 20483 + 11 + + + + + + + endColumn + file + + + 12 + + + 1 + 2 + 94 + + + 2 + 6 + 19 + + + 6 + 16 + 21 + + + 16 + 45 + 21 + + + 45 + 110 + 21 + + + 123 + 281 + 21 + + + 290 + 393 + 21 + + + 395 + 445 + 21 + + + 446 + 468 + 21 + + + 470 + 530 + 14 + + + + + + + endColumn + beginLine + + + 12 + + + 1 + 2 + 94 + + + 2 + 6 + 19 + + + 6 + 21 + 21 + + + 21 + 52 + 21 + + + 54 + 154 + 21 + + + 157 + 449 + 21 + + + 455 + 808 + 21 + + + 814 + 1132 + 21 + + + 1145 + 1769 + 21 + + + 1792 + 2365 + 14 + + + + + + + endColumn + beginColumn + + + 12 + + + 1 + 2 + 39 + + + 2 + 3 + 56 + + + 3 + 7 + 23 + + + 7 + 18 + 21 + + + 18 + 27 + 24 + + + 27 + 37 + 22 + + + 37 + 49 + 23 + + + 49 + 63 + 22 + + + 63 + 74 + 20 + + + 74 + 102 + 21 + + + 103 + 172 + 3 + + + + + + + endColumn + endLine + + + 12 + + + 1 + 2 + 94 + + + 2 + 6 + 19 + + + 6 + 21 + 21 + + + 21 + 52 + 21 + + + 53 + 153 + 21 + + + 156 + 444 + 21 + + + 446 + 789 + 21 + + + 806 + 1121 + 21 + + + 1138 + 1726 + 21 + + + 1787 + 2357 + 14 + + + + + + + + + numlines + 514 + + + element_id + 514 + + + num_lines + 309 + + + num_code + 350 + + + num_comment + 150 + + + + + element_id + num_lines + + + 12 + + + 1 + 2 + 514 + + + + + + + element_id + num_code + + + 12 + + + 1 + 2 + 514 + + + + + + + element_id + num_comment + + + 12 + + + 1 + 2 + 514 + + + + + + + num_lines + element_id + + + 12 + + + 1 + 2 + 183 + + + 2 + 3 + 74 + + + 3 + 4 + 32 + + + 4 + 7 + 20 + + + + + + + num_lines + num_code + + + 12 + + + 1 + 2 + 187 + + + 2 + 3 + 82 + + + 3 + 4 + 23 + + + 4 + 7 + 17 + + + + + + + num_lines + num_comment + + + 12 + + + 1 + 2 + 188 + + + 2 + 3 + 79 + + + 3 + 4 + 28 + + + 4 + 7 + 14 + + + + + + + num_code + element_id + + + 12 + + + 1 + 2 + 252 + + + 2 + 3 + 65 + + + 3 + 5 + 28 + + + 6 + 18 + 5 + + + + + + + num_code + num_lines + + + 12 + + + 1 + 2 + 256 + + + 2 + 3 + 67 + + + 3 + 18 + 27 + + + + + + + num_code + num_comment + + + 12 + + + 1 + 2 + 259 + + + 2 + 3 + 63 + + + 3 + 7 + 27 + + + 17 + 18 + 1 + + + + + + + num_comment + element_id + + + 12 + + + 1 + 2 + 65 + + + 2 + 3 + 27 + + + 3 + 4 + 17 + + + 4 + 5 + 7 + + + 5 + 6 + 10 + + + 6 + 10 + 12 + + + 10 + 31 + 12 + + + + + + + num_comment + num_lines + + + 12 + + + 1 + 2 + 65 + + + 2 + 3 + 27 + + + 3 + 4 + 18 + + + 4 + 5 + 7 + + + 5 + 6 + 10 + + + 6 + 10 + 13 + + + 10 + 25 + 10 + + + + + + + num_comment + num_code + + + 12 + + + 1 + 2 + 66 + + + 2 + 3 + 27 + + + 3 + 4 + 17 + + + 4 + 5 + 6 + + + 5 + 6 + 10 + + + 6 + 9 + 12 + + + 9 + 24 + 12 + + + + + + + + + files + 529 + + + id + 529 + + + name + 529 + + + + + id + name + + + 12 + + + 1 + 2 + 529 + + + + + + + name + id + + + 12 + + + 1 + 2 + 529 + + + + + + + + + folders + 210 + + + id + 210 + + + name + 210 + + + + + id + name + + + 12 + + + 1 + 2 + 210 + + + + + + + name + id + + + 12 + + + 1 + 2 + 210 + + + + + + + + + containerparent + 738 + + + parent + 210 + + + child + 738 + + + + + parent + child + + + 12 + + + 1 + 2 + 115 + + + 2 + 3 + 32 + + + 3 + 4 + 12 + + + 4 + 6 + 19 + + + 6 + 12 + 16 + + + 13 + 38 + 16 + + + + + + + child + parent + + + 12 + + + 1 + 2 + 738 + + + + + + + + + has_location + 599339 + + + locatable + 599339 + + + location + 537353 + + + + + locatable + location + + + 12 + + + 1 + 2 + 599339 + + + + + + + location + locatable + + + 12 + + + 1 + 2 + 475682 + + + 2 + 3 + 61627 + + + 3 + 75 + 44 + + + + + + + + + comment_groups + 12083 + + + id + 12083 + + + parent + 509 + + + idx + 720 + + + + + id + parent + + + 12 + + + 1 + 2 + 12083 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 12083 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 44 + + + 2 + 3 + 45 + + + 3 + 4 + 32 + + + 4 + 5 + 27 + + + 5 + 7 + 38 + + + 7 + 10 + 47 + + + 10 + 13 + 34 + + + 13 + 17 + 47 + + + 17 + 23 + 40 + + + 23 + 29 + 40 + + + 29 + 38 + 39 + + + 38 + 70 + 39 + + + 70 + 721 + 37 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 44 + + + 2 + 3 + 45 + + + 3 + 4 + 32 + + + 4 + 5 + 27 + + + 5 + 7 + 38 + + + 7 + 10 + 47 + + + 10 + 13 + 34 + + + 13 + 17 + 47 + + + 17 + 23 + 40 + + + 23 + 29 + 40 + + + 29 + 38 + 39 + + + 38 + 70 + 39 + + + 70 + 721 + 37 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 429 + + + 2 + 3 + 53 + + + 3 + 8 + 66 + + + 8 + 16 + 57 + + + 16 + 44 + 54 + + + 44 + 311 + 54 + + + 323 + 510 + 7 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 429 + + + 2 + 3 + 53 + + + 3 + 8 + 66 + + + 8 + 16 + 57 + + + 16 + 44 + 54 + + + 44 + 311 + 54 + + + 323 + 510 + 7 + + + + + + + + + comments + 25724 + + + id + 25724 + + + kind + 2 + + + parent + 12083 + + + idx + 156 + + + text + 20683 + + + + + id + kind + + + 12 + + + 1 + 2 + 25724 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 25724 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 25724 + + + + + + + id + text + + + 12 + + + 1 + 2 + 25724 + + + + + + + kind + id + + + 12 + + + 846 + 847 + 1 + + + 24878 + 24879 + 1 + + + + + + + kind + parent + + + 12 + + + 846 + 847 + 1 + + + 11239 + 11240 + 1 + + + + + + + kind + idx + + + 12 + + + 2 + 3 + 1 + + + 156 + 157 + 1 + + + + + + + kind + text + + + 12 + + + 690 + 691 + 1 + + + 19993 + 19994 + 1 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 7828 + + + 2 + 3 + 1787 + + + 3 + 4 + 1289 + + + 4 + 11 + 937 + + + 11 + 157 + 242 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 12081 + + + 2 + 3 + 2 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 7828 + + + 2 + 3 + 1787 + + + 3 + 4 + 1289 + + + 4 + 11 + 937 + + + 11 + 157 + 242 + + + + + + + parent + text + + + 12 + + + 1 + 2 + 7828 + + + 2 + 3 + 1817 + + + 3 + 4 + 1275 + + + 4 + 10 + 937 + + + 10 + 131 + 226 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 13 + + + 4 + 5 + 16 + + + 5 + 7 + 12 + + + 7 + 9 + 12 + + + 9 + 11 + 6 + + + 12 + 14 + 13 + + + 14 + 24 + 13 + + + 26 + 52 + 12 + + + 59 + 218 + 12 + + + 242 + 12084 + 11 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 154 + + + 2 + 3 + 2 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 13 + + + 4 + 5 + 16 + + + 5 + 7 + 12 + + + 7 + 9 + 12 + + + 9 + 11 + 6 + + + 12 + 14 + 13 + + + 14 + 24 + 13 + + + 26 + 52 + 12 + + + 59 + 218 + 12 + + + 242 + 12084 + 11 + + + + + + + idx + text + + + 12 + + + 1 + 2 + 36 + + + 2 + 4 + 14 + + + 4 + 5 + 18 + + + 5 + 7 + 14 + + + 7 + 9 + 11 + + + 9 + 12 + 14 + + + 12 + 17 + 12 + + + 19 + 36 + 13 + + + 39 + 128 + 12 + + + 165 + 10500 + 12 + + + + + + + text + id + + + 12 + + + 1 + 2 + 19550 + + + 2 + 1935 + 1133 + + + + + + + text + kind + + + 12 + + + 1 + 2 + 20683 + + + + + + + text + parent + + + 12 + + + 1 + 2 + 19575 + + + 2 + 828 + 1108 + + + + + + + text + idx + + + 12 + + + 1 + 2 + 20523 + + + 2 + 107 + 160 + + + + + + + + + doc_comments + 4330 + + + node + 4330 + + + comment + 4330 + + + + + node + comment + + + 12 + + + 1 + 2 + 4330 + + + + + + + comment + node + + + 12 + + + 1 + 2 + 4330 + + + + + + + + + exprs + 414037 + + + id + 414037 + + + kind + 48 + + + parent + 219324 + + + idx + 5163 + + + + + id + kind + + + 12 + + + 1 + 2 + 414037 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 414037 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 414037 + + + + + + + kind + id + + + 12 + + + 7 + 20 + 4 + + + 21 + 54 + 4 + + + 57 + 142 + 4 + + + 146 + 236 + 4 + + + 248 + 344 + 4 + + + 509 + 620 + 4 + + + 678 + 839 + 4 + + + 1013 + 1235 + 4 + + + 1272 + 2705 + 4 + + + 3244 + 4582 + 4 + + + 5616 + 10361 + 4 + + + 24892 + 237317 + 4 + + + + + + + kind + parent + + + 12 + + + 7 + 20 + 4 + + + 21 + 54 + 4 + + + 57 + 142 + 4 + + + 144 + 207 + 4 + + + 233 + 324 + 4 + + + 509 + 613 + 4 + + + 676 + 790 + 4 + + + 1013 + 1226 + 4 + + + 1239 + 1949 + 4 + + + 2582 + 3985 + 4 + + + 4252 + 10115 + 4 + + + 14086 + 154744 + 4 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 3 + + + 2 + 3 + 8 + + + 3 + 4 + 10 + + + 4 + 5 + 6 + + + 5 + 7 + 4 + + + 7 + 8 + 4 + + + 8 + 14 + 3 + + + 15 + 22 + 4 + + + 23 + 34 + 4 + + + 1057 + 5164 + 2 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 65804 + + + 2 + 3 + 133334 + + + 3 + 5 + 17889 + + + 5 + 5144 + 2297 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 137263 + + + 2 + 3 + 75813 + + + 3 + 7 + 6248 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 65804 + + + 2 + 3 + 133334 + + + 3 + 5 + 17889 + + + 5 + 5144 + 2297 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 3910 + + + 2 + 3 + 183 + + + 3 + 4 + 782 + + + 4 + 180006 + 288 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 4087 + + + 2 + 3 + 1033 + + + 3 + 48 + 43 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 3910 + + + 2 + 3 + 183 + + + 3 + 4 + 782 + + + 4 + 180006 + 288 + + + + + + + + + literals + 270756 + + + expr + 270756 + + + value + 25795 + + + raw + 27594 + + + + + expr + value + + + 12 + + + 1 + 2 + 270756 + + + + + + + expr + raw + + + 12 + + + 1 + 2 + 270756 + + + + + + + value + expr + + + 12 + + + 1 + 2 + 14635 + + + 2 + 3 + 3291 + + + 3 + 4 + 1783 + + + 4 + 6 + 1931 + + + 6 + 12 + 1968 + + + 12 + 139 + 1935 + + + 139 + 6840 + 252 + + + + + + + value + raw + + + 12 + + + 1 + 2 + 24051 + + + 2 + 5 + 1744 + + + + + + + raw + expr + + + 12 + + + 1 + 2 + 16038 + + + 2 + 3 + 3521 + + + 3 + 4 + 1869 + + + 4 + 7 + 2553 + + + 7 + 18 + 2129 + + + 18 + 6833 + 1484 + + + + + + + raw + value + + + 12 + + + 1 + 2 + 27594 + + + + + + + + + constvalues + 43931 + + + expr + 43931 + + + value + 16896 + + + exact + 16897 + + + + + expr + value + + + 12 + + + 1 + 2 + 43931 + + + + + + + expr + exact + + + 12 + + + 1 + 2 + 43931 + + + + + + + value + expr + + + 12 + + + 1 + 2 + 14932 + + + 2 + 4 + 1388 + + + 4 + 6766 + 576 + + + + + + + value + exact + + + 12 + + + 1 + 2 + 16895 + + + 2 + 3 + 1 + + + + + + + exact + expr + + + 12 + + + 1 + 2 + 14933 + + + 2 + 4 + 1388 + + + 4 + 6766 + 576 + + + + + + + exact + value + + + 12 + + + 1 + 2 + 16897 + + + + + + + + + fields + 19974 + + + id + 19974 + + + parent + 9600 + + + idx + 57 + + + + + id + parent + + + 12 + + + 1 + 2 + 19974 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 19974 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 4790 + + + 2 + 3 + 2214 + + + 3 + 4 + 1363 + + + 4 + 5 + 653 + + + 5 + 53 + 580 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 4790 + + + 2 + 3 + 2214 + + + 3 + 4 + 1363 + + + 4 + 5 + 653 + + + 5 + 53 + 580 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 14 + + + 2 + 3 + 8 + + + 3 + 6 + 5 + + + 6 + 11 + 5 + + + 12 + 18 + 5 + + + 19 + 31 + 5 + + + 46 + 105 + 5 + + + 115 + 633 + 5 + + + 914 + 7063 + 5 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 14 + + + 2 + 3 + 8 + + + 3 + 6 + 5 + + + 6 + 11 + 5 + + + 12 + 18 + 5 + + + 19 + 31 + 5 + + + 46 + 105 + 5 + + + 115 + 633 + 5 + + + 914 + 7063 + 5 + + + + + + + + + stmts + 73990 + + + id + 73990 + + + kind + 33 + + + parent + 41543 + + + idx + 81 + + + + + id + kind + + + 12 + + + 1 + 2 + 73990 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 73990 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 73990 + + + + + + + kind + id + + + 12 + + + 2 + 3 + 1 + + + 3 + 4 + 4 + + + 5 + 9 + 3 + + + 18 + 50 + 3 + + + 63 + 72 + 3 + + + 72 + 224 + 3 + + + 301 + 379 + 3 + + + 400 + 615 + 3 + + + 654 + 2136 + 3 + + + 3476 + 7606 + 3 + + + 9225 + 9729 + 3 + + + 19358 + 19359 + 1 + + + + + + + kind + parent + + + 12 + + + 2 + 3 + 1 + + + 3 + 4 + 4 + + + 5 + 9 + 3 + + + 17 + 35 + 3 + + + 47 + 69 + 3 + + + 69 + 205 + 3 + + + 301 + 367 + 3 + + + 385 + 586 + 3 + + + 606 + 1154 + 3 + + + 1719 + 5672 + 3 + + + 5912 + 9226 + 3 + + + 18820 + 18821 + 1 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 1 + + + 2 + 3 + 5 + + + 3 + 5 + 2 + + + 5 + 8 + 3 + + + 8 + 9 + 3 + + + 9 + 13 + 3 + + + 13 + 16 + 3 + + + 16 + 17 + 2 + + + 17 + 27 + 3 + + + 27 + 33 + 3 + + + 44 + 47 + 3 + + + 55 + 82 + 2 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 29362 + + + 2 + 3 + 6137 + + + 3 + 5 + 3650 + + + 5 + 82 + 2394 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 31418 + + + 2 + 3 + 5760 + + + 3 + 5 + 3597 + + + 5 + 11 + 768 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 29362 + + + 2 + 3 + 6137 + + + 3 + 5 + 3650 + + + 5 + 82 + 2394 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 6 + + + 2 + 3 + 20 + + + 5 + 6 + 3 + + + 7 + 8 + 11 + + + 10 + 15 + 7 + + + 15 + 27 + 7 + + + 27 + 70 + 7 + + + 85 + 262 + 7 + + + 314 + 1279 + 7 + + + 1720 + 24879 + 6 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 12 + + + 2 + 3 + 22 + + + 3 + 5 + 7 + + + 5 + 6 + 6 + + + 6 + 7 + 4 + + + 7 + 9 + 7 + + + 9 + 13 + 7 + + + 13 + 18 + 7 + + + 20 + 28 + 6 + + + 29 + 34 + 3 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 6 + + + 2 + 3 + 20 + + + 5 + 6 + 3 + + + 7 + 8 + 11 + + + 10 + 15 + 7 + + + 15 + 27 + 7 + + + 27 + 70 + 7 + + + 85 + 262 + 7 + + + 314 + 1279 + 7 + + + 1720 + 24879 + 6 + + + + + + + + + decls + 8690 + + + id + 8690 + + + kind + 5 + + + parent + 1951 + + + idx + 226 + + + + + id + kind + + + 12 + + + 1 + 2 + 8690 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 8690 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 8690 + + + + + + + kind + id + + + 12 + + + 280 + 281 + 1 + + + 479 + 480 + 1 + + + 1349 + 1350 + 1 + + + 1769 + 1770 + 1 + + + 4813 + 4814 + 1 + + + + + + + kind + parent + + + 12 + + + 196 + 197 + 1 + + + 336 + 337 + 1 + + + 478 + 479 + 1 + + + 483 + 484 + 1 + + + 1566 + 1567 + 1 + + + + + + + kind + idx + + + 12 + + + 2 + 3 + 1 + + + 39 + 40 + 1 + + + 105 + 106 + 1 + + + 219 + 220 + 1 + + + 225 + 226 + 1 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 1460 + + + 2 + 6 + 149 + + + 6 + 12 + 155 + + + 12 + 36 + 147 + + + 36 + 227 + 40 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 1463 + + + 2 + 3 + 111 + + + 3 + 4 + 185 + + + 4 + 5 + 141 + + + 5 + 6 + 51 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 1460 + + + 2 + 6 + 149 + + + 6 + 12 + 155 + + + 12 + 36 + 147 + + + 36 + 227 + 40 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 4 + + + 2 + 3 + 30 + + + 3 + 4 + 18 + + + 4 + 5 + 66 + + + 5 + 6 + 2 + + + 6 + 7 + 31 + + + 7 + 11 + 17 + + + 11 + 31 + 17 + + + 31 + 65 + 17 + + + 67 + 275 + 17 + + + 323 + 1952 + 7 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 7 + + + 2 + 3 + 113 + + + 3 + 4 + 69 + + + 4 + 5 + 35 + + + 5 + 6 + 2 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 4 + + + 2 + 3 + 30 + + + 3 + 4 + 18 + + + 4 + 5 + 66 + + + 5 + 6 + 2 + + + 6 + 7 + 31 + + + 7 + 11 + 17 + + + 11 + 31 + 17 + + + 31 + 65 + 17 + + + 67 + 275 + 17 + + + 323 + 1952 + 7 + + + + + + + + + specs + 7889 + + + id + 7889 + + + kind + 4 + + + parent + 3877 + + + idx + 108 + + + + + id + kind + + + 12 + + + 1 + 2 + 7889 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 7889 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 7889 + + + + + + + kind + id + + + 12 + + + 16 + 17 + 1 + + + 1349 + 1350 + 1 + + + 3056 + 3057 + 1 + + + 3468 + 3469 + 1 + + + + + + + kind + parent + + + 12 + + + 16 + 17 + 1 + + + 479 + 480 + 1 + + + 1333 + 1334 + 1 + + + 2049 + 2050 + 1 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 1 + + + 14 + 15 + 1 + + + 36 + 37 + 1 + + + 108 + 109 + 1 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 3206 + + + 2 + 6 + 343 + + + 6 + 18 + 298 + + + 18 + 109 + 30 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 3877 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 3206 + + + 2 + 6 + 343 + + + 6 + 18 + 298 + + + 18 + 109 + 30 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 53 + + + 2 + 3 + 19 + + + 3 + 6 + 9 + + + 6 + 28 + 9 + + + 30 + 156 + 9 + + + 188 + 3878 + 9 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 72 + + + 2 + 3 + 22 + + + 3 + 4 + 13 + + + 4 + 5 + 1 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 53 + + + 2 + 3 + 19 + + + 3 + 6 + 9 + + + 6 + 28 + 9 + + + 30 + 156 + 9 + + + 188 + 3878 + 9 + + + + + + + + + scopes + 36775 + + + id + 36775 + + + kind + 3 + + + + + id + kind + + + 12 + + + 1 + 2 + 36775 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 1 + + + 346 + 347 + 1 + + + 36428 + 36429 + 1 + + + + + + + + + scopenesting + 36774 + + + inner + 36774 + + + outer + 21713 + + + + + inner + outer + + + 12 + + + 1 + 2 + 36774 + + + + + + + outer + inner + + + 12 + + + 1 + 2 + 16964 + + + 2 + 3 + 2474 + + + 3 + 7 + 1759 + + + 7 + 347 + 516 + + + + + + + + + scopenodes + 36428 + + + node + 36428 + + + scope + 36428 + + + + + node + scope + + + 12 + + + 1 + 2 + 36428 + + + + + + + scope + node + + + 12 + + + 1 + 2 + 36428 + + + + + + + + + objects + 84909 + + + id + 84909 + + + kind + 9 + + + name + 30576 + + + + + id + kind + + + 12 + + + 1 + 2 + 84909 + + + + + + + id + name + + + 12 + + + 1 + 2 + 84909 + + + + + + + kind + id + + + 12 + + + 4 + 5 + 1 + + + 18 + 19 + 1 + + + 20 + 21 + 1 + + + 49 + 50 + 1 + + + 3468 + 3469 + 1 + + + 3602 + 3603 + 1 + + + 8857 + 8858 + 1 + + + 17793 + 17794 + 1 + + + 51098 + 51099 + 1 + + + + + + + kind + name + + + 12 + + + 4 + 5 + 1 + + + 18 + 19 + 1 + + + 20 + 21 + 1 + + + 38 + 39 + 1 + + + 203 + 204 + 1 + + + 3004 + 3005 + 1 + + + 8418 + 8419 + 1 + + + 10132 + 10133 + 1 + + + 10913 + 10914 + 1 + + + + + + + name + id + + + 12 + + + 1 + 2 + 25286 + + + 2 + 3 + 2613 + + + 3 + 20 + 2304 + + + 20 + 2222 + 373 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 28809 + + + 2 + 6 + 1767 + + + + + + + + + objectscopes + 54774 + + + object + 54774 + + + scope + 13947 + + + + + object + scope + + + 12 + + + 1 + 2 + 54774 + + + + + + + scope + object + + + 12 + + + 1 + 2 + 7112 + + + 2 + 3 + 2972 + + + 3 + 4 + 1274 + + + 4 + 6 + 1264 + + + 6 + 15 + 1055 + + + 15 + 2694 + 270 + + + + + + + + + objecttypes + 84907 + + + object + 84907 + + + tp + 13462 + + + + + object + tp + + + 12 + + + 1 + 2 + 84907 + + + + + + + tp + object + + + 12 + + + 1 + 2 + 7893 + + + 2 + 3 + 2114 + + + 3 + 4 + 892 + + + 4 + 7 + 1190 + + + 7 + 25 + 1011 + + + 25 + 4267 + 362 + + + + + + + + + methodreceivers + 9873 + + + method + 9873 + + + receiver + 9873 + + + + + method + receiver + + + 12 + + + 1 + 2 + 9873 + + + + + + + receiver + method + + + 12 + + + 1 + 2 + 9873 + + + + + + + + + fieldstructs + 10934 + + + field + 10934 + + + struct + 2408 + + + + + field + struct + + + 12 + + + 1 + 2 + 10934 + + + + + + + struct + field + + + 12 + + + 1 + 2 + 260 + + + 2 + 3 + 677 + + + 3 + 4 + 468 + + + 4 + 5 + 292 + + + 5 + 6 + 194 + + + 6 + 8 + 208 + + + 8 + 13 + 199 + + + 13 + 65 + 110 + + + + + + + + + methodhosts + 838 + + + method + 699 + + + host + 258 + + + + + method + host + + + 12 + + + 1 + 2 + 625 + + + 2 + 3 + 56 + + + 3 + 16 + 18 + + + + + + + host + method + + + 12 + + + 1 + 2 + 99 + + + 2 + 3 + 56 + + + 3 + 4 + 37 + + + 4 + 5 + 20 + + + 5 + 6 + 15 + + + 6 + 11 + 21 + + + 11 + 53 + 10 + + + + + + + + + defs + 40703 + + + ident + 40703 + + + object + 40490 + + + + + ident + object + + + 12 + + + 1 + 2 + 40703 + + + + + + + object + ident + + + 12 + + + 1 + 2 + 40383 + + + 2 + 15 + 107 + + + + + + + + + uses + 195902 + + + ident + 195902 + + + object + 41616 + + + + + ident + object + + + 12 + + + 1 + 2 + 195902 + + + + + + + object + ident + + + 12 + + + 1 + 2 + 15493 + + + 2 + 3 + 9727 + + + 3 + 4 + 5056 + + + 4 + 5 + 2974 + + + 5 + 7 + 3203 + + + 7 + 14 + 3336 + + + 14 + 6833 + 1827 + + + + + + + + + types + 18132 + + + id + 18132 + + + kind + 37 + + + + + id + kind + + + 12 + + + 1 + 2 + 18132 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 25 + + + 10 + 30 + 3 + + + 247 + 431 + 3 + + + 559 + 1904 + 3 + + + 2409 + 8011 + 3 + + + + + + + + + type_of + 397965 + + + expr + 397965 + + + tp + 8687 + + + + + expr + tp + + + 12 + + + 1 + 2 + 397965 + + + + + + + tp + expr + + + 12 + + + 1 + 2 + 2019 + + + 2 + 3 + 967 + + + 3 + 4 + 711 + + + 4 + 5 + 388 + + + 5 + 7 + 780 + + + 7 + 10 + 772 + + + 10 + 15 + 734 + + + 15 + 23 + 700 + + + 23 + 43 + 652 + + + 43 + 143 + 652 + + + 143 + 46949 + 312 + + + + + + + + + typename + 3567 + + + tp + 3567 + + + name + 2983 + + + + + tp + name + + + 12 + + + 1 + 2 + 3567 + + + + + + + name + tp + + + 12 + + + 1 + 2 + 2660 + + + 2 + 4 + 267 + + + 4 + 17 + 56 + + + + + + + + + key_type + 430 + + + map + 430 + + + tp + 149 + + + + + map + tp + + + 12 + + + 1 + 2 + 430 + + + + + + + tp + map + + + 12 + + + 1 + 2 + 106 + + + 2 + 3 + 17 + + + 3 + 6 + 12 + + + 6 + 13 + 12 + + + 20 + 136 + 2 + + + + + + + + + element_type + 1412 + + + container + 1412 + + + tp + 916 + + + + + container + tp + + + 12 + + + 1 + 2 + 1412 + + + + + + + tp + container + + + 12 + + + 1 + 2 + 773 + + + 2 + 3 + 94 + + + 3 + 68 + 49 + + + + + + + + + base_type + 1903 + + + ptr + 1903 + + + tp + 1903 + + + + + ptr + tp + + + 12 + + + 1 + 2 + 1903 + + + + + + + tp + ptr + + + 12 + + + 1 + 2 + 1903 + + + + + + + + + underlying_type + 3567 + + + named + 3567 + + + tp + 2755 + + + + + named + tp + + + 12 + + + 1 + 2 + 3567 + + + + + + + tp + named + + + 12 + + + 1 + 2 + 2582 + + + 2 + 154 + 173 + + + + + + + + + component_types + 36474 + + + parent + 11221 + + + index + 74 + + + name + 5540 + + + tp + 4295 + + + + + parent + index + + + 12 + + + 1 + 2 + 1198 + + + 2 + 3 + 3864 + + + 3 + 4 + 2953 + + + 4 + 5 + 1446 + + + 5 + 6 + 780 + + + 6 + 13 + 860 + + + 13 + 65 + 120 + + + + + + + parent + name + + + 12 + + + 1 + 2 + 8936 + + + 2 + 3 + 733 + + + 3 + 6 + 1008 + + + 6 + 64 + 544 + + + + + + + parent + tp + + + 12 + + + 1 + 2 + 2194 + + + 2 + 3 + 4537 + + + 3 + 4 + 2475 + + + 4 + 5 + 1110 + + + 5 + 12 + 848 + + + 12 + 52 + 57 + + + + + + + index + parent + + + 12 + + + 1 + 2 + 15 + + + 2 + 4 + 6 + + + 4 + 7 + 4 + + + 8 + 13 + 6 + + + 13 + 18 + 6 + + + 18 + 28 + 6 + + + 29 + 49 + 6 + + + 52 + 82 + 6 + + + 89 + 193 + 6 + + + 232 + 824 + 6 + + + 1505 + 6458 + 6 + + + 10274 + 10275 + 1 + + + + + + + index + name + + + 12 + + + 1 + 2 + 22 + + + 2 + 6 + 6 + + + 6 + 9 + 6 + + + 9 + 16 + 4 + + + 16 + 24 + 6 + + + 24 + 37 + 6 + + + 39 + 61 + 6 + + + 69 + 116 + 6 + + + 153 + 379 + 6 + + + 475 + 1260 + 6 + + + + + + + index + tp + + + 12 + + + 1 + 2 + 15 + + + 2 + 4 + 6 + + + 4 + 7 + 6 + + + 7 + 11 + 5 + + + 11 + 14 + 5 + + + 15 + 19 + 6 + + + 20 + 27 + 5 + + + 29 + 44 + 6 + + + 45 + 72 + 6 + + + 86 + 161 + 6 + + + 224 + 1436 + 6 + + + 1878 + 2153 + 2 + + + + + + + name + parent + + + 12 + + + 1 + 2 + 3941 + + + 2 + 3 + 851 + + + 3 + 6 + 484 + + + 6 + 8917 + 264 + + + + + + + name + index + + + 12 + + + 1 + 2 + 4284 + + + 2 + 3 + 737 + + + 3 + 6 + 440 + + + 6 + 28 + 79 + + + + + + + name + tp + + + 12 + + + 1 + 2 + 4599 + + + 2 + 3 + 518 + + + 3 + 21 + 416 + + + 21 + 3014 + 7 + + + + + + + tp + parent + + + 12 + + + 1 + 2 + 2055 + + + 2 + 3 + 812 + + + 3 + 4 + 408 + + + 4 + 6 + 394 + + + 6 + 11 + 342 + + + 11 + 2187 + 284 + + + + + + + tp + index + + + 12 + + + 1 + 2 + 2111 + + + 2 + 3 + 859 + + + 3 + 4 + 580 + + + 4 + 5 + 352 + + + 5 + 10 + 328 + + + 10 + 51 + 65 + + + + + + + tp + name + + + 12 + + + 1 + 2 + 2897 + + + 2 + 3 + 865 + + + 3 + 5 + 343 + + + 5 + 738 + 190 + + + + + + + + + array_length + 293 + + + tp + 293 + + + len + 103 + + + + + tp + len + + + 12 + + + 1 + 2 + 293 + + + + + + + len + tp + + + 12 + + + 1 + 2 + 62 + + + 2 + 3 + 15 + + + 3 + 4 + 7 + + + 4 + 7 + 8 + + + 7 + 15 + 7 + + + 15 + 26 + 4 + + + + + + + + + type_objects + 3567 + + + tp + 3567 + + + object + 3567 + + + + + tp + object + + + 12 + + + 1 + 2 + 3567 + + + + + + + object + tp + + + 12 + + + 1 + 2 + 3567 + + + + + + + + + packages + 346 + + + id + 346 + + + name + 281 + + + path + 346 + + + scope + 346 + + + + + id + name + + + 12 + + + 1 + 2 + 346 + + + + + + + id + path + + + 12 + + + 1 + 2 + 346 + + + + + + + id + scope + + + 12 + + + 1 + 2 + 346 + + + + + + + name + id + + + 12 + + + 1 + 2 + 255 + + + 2 + 3 + 23 + + + 3 + 40 + 3 + + + + + + + name + path + + + 12 + + + 1 + 2 + 255 + + + 2 + 3 + 23 + + + 3 + 40 + 3 + + + + + + + name + scope + + + 12 + + + 1 + 2 + 255 + + + 2 + 3 + 23 + + + 3 + 40 + 3 + + + + + + + path + id + + + 12 + + + 1 + 2 + 346 + + + + + + + path + name + + + 12 + + + 1 + 2 + 346 + + + + + + + path + scope + + + 12 + + + 1 + 2 + 346 + + + + + + + scope + id + + + 12 + + + 1 + 2 + 346 + + + + + + + scope + name + + + 12 + + + 1 + 2 + 346 + + + + + + + scope + path + + + 12 + + + 1 + 2 + 346 + + + + + + + + + modexprs + 9 + + + id + 9 + + + kind + 4 + + + parent + 2 + + + idx + 6 + + + + + id + kind + + + 12 + + + 1 + 2 + 9 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 9 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 9 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 3 + + + 6 + 7 + 1 + + + + + + + kind + parent + + + 12 + + + 1 + 2 + 3 + + + 2 + 3 + 1 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 3 + + + 5 + 6 + 1 + + + + + + + parent + id + + + 12 + + + 3 + 4 + 1 + + + 6 + 7 + 1 + + + + + + + parent + kind + + + 12 + + + 2 + 3 + 1 + + + 3 + 4 + 1 + + + + + + + parent + idx + + + 12 + + + 3 + 4 + 1 + + + 6 + 7 + 1 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 3 + + + 2 + 3 + 3 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 4 + + + 2 + 3 + 2 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 3 + + + 2 + 3 + 3 + + + + + + + + + modtokens + 13 + + + token + 13 + + + parent + 7 + + + idx + 2 + + + + + token + parent + + + 12 + + + 1 + 2 + 13 + + + + + + + token + idx + + + 12 + + + 1 + 2 + 13 + + + + + + + parent + token + + + 12 + + + 1 + 2 + 1 + + + 2 + 3 + 6 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 1 + + + 2 + 3 + 6 + + + + + + + idx + token + + + 12 + + + 6 + 7 + 1 + + + 7 + 8 + 1 + + + + + + + idx + parent + + + 12 + + + 6 + 7 + 1 + + + 7 + 8 + 1 + + + + + + + + + errors + 0 + + + id + 0 + + + kind + 0 + + + msg + 0 + + + rawpos + 0 + + + file + 0 + + + line + 0 + + + col + 0 + + + package + 0 + + + idx + 0 + + + + + id + kind + + + 12 + + + 1 + 2 + 1 + + + + + + + id + msg + + + 12 + + + 1 + 2 + 1 + + + + + + + id + rawpos + + + 12 + + + 1 + 2 + 1 + + + + + + + id + file + + + 12 + + + 1 + 2 + 1 + + + + + + + id + line + + + 12 + + + 1 + 2 + 1 + + + + + + + id + col + + + 12 + + + 1 + 2 + 1 + + + + + + + id + package + + + 12 + + + 1 + 2 + 1 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 1 + + + + + + + kind + id + + + 12 + + + + + + kind + msg + + + 12 + + + + + + kind + rawpos + + + 12 + + + + + + kind + file + + + 12 + + + + + + kind + line + + + 12 + + + + + + kind + col + + + 12 + + + + + + kind + package + + + 12 + + + + + + kind + idx + + + 12 + + + + + + msg + id + + + 12 + + + + + + msg + kind + + + 12 + + + + + + msg + rawpos + + + 12 + + + + + + msg + file + + + 12 + + + + + + msg + line + + + 12 + + + + + + msg + col + + + 12 + + + + + + msg + package + + + 12 + + + + + + msg + idx + + + 12 + + + + + + rawpos + id + + + 12 + + + + + + rawpos + kind + + + 12 + + + + + + rawpos + msg + + + 12 + + + + + + rawpos + file + + + 12 + + + + + + rawpos + line + + + 12 + + + + + + rawpos + col + + + 12 + + + + + + rawpos + package + + + 12 + + + + + + rawpos + idx + + + 12 + + + + + + file + id + + + 12 + + + + + + file + kind + + + 12 + + + + + + file + msg + + + 12 + + + + + + file + rawpos + + + 12 + + + + + + file + line + + + 12 + + + + + + file + col + + + 12 + + + + + + file + package + + + 12 + + + + + + file + idx + + + 12 + + + + + + line + id + + + 12 + + + + + + line + kind + + + 12 + + + + + + line + msg + + + 12 + + + + + + line + rawpos + + + 12 + + + + + + line + file + + + 12 + + + + + + line + col + + + 12 + + + + + + line + package + + + 12 + + + + + + line + idx + + + 12 + + + + + + col + id + + + 12 + + + + + + col + kind + + + 12 + + + + + + col + msg + + + 12 + + + + + + col + rawpos + + + 12 + + + + + + col + file + + + 12 + + + + + + col + line + + + 12 + + + + + + col + package + + + 12 + + + + + + col + idx + + + 12 + + + + + + package + id + + + 12 + + + + + + package + kind + + + 12 + + + + + + package + msg + + + 12 + + + + + + package + rawpos + + + 12 + + + + + + package + file + + + 12 + + + + + + package + line + + + 12 + + + + + + package + col + + + 12 + + + + + + package + idx + + + 12 + + + + + + idx + id + + + 12 + + + + + + idx + kind + + + 12 + + + + + + idx + msg + + + 12 + + + + + + idx + rawpos + + + 12 + + + + + + idx + file + + + 12 + + + + + + idx + line + + + 12 + + + + + + idx + col + + + 12 + + + + + + idx + package + + + 12 + + + + + + + + has_ellipsis + 268 + + + id + 268 + + + + + + diff --git a/go/ql/lib/go.qll b/go/ql/lib/go.qll new file mode 100644 index 00000000000..7ebaa8a0626 --- /dev/null +++ b/go/ql/lib/go.qll @@ -0,0 +1,64 @@ +/** + * Provides classes for working with Go programs. + */ + +import Customizations +import semmle.go.Architectures +import semmle.go.AST +import semmle.go.Comments +import semmle.go.Concepts +import semmle.go.Decls +import semmle.go.Errors +import semmle.go.Expr +import semmle.go.Files +import semmle.go.GoMod +import semmle.go.HTML +import semmle.go.Locations +import semmle.go.Packages +import semmle.go.Scopes +import semmle.go.Stmt +import semmle.go.StringOps +import semmle.go.Types +import semmle.go.Util +import semmle.go.VariableWithFields +import semmle.go.controlflow.BasicBlocks +import semmle.go.controlflow.ControlFlowGraph +import semmle.go.controlflow.IR +import semmle.go.dataflow.DataFlow +import semmle.go.dataflow.DataFlow2 +import semmle.go.dataflow.GlobalValueNumbering +import semmle.go.dataflow.SSA +import semmle.go.dataflow.TaintTracking +import semmle.go.dataflow.TaintTracking2 +import semmle.go.frameworks.Beego +import semmle.go.frameworks.BeegoOrm +import semmle.go.frameworks.Chi +import semmle.go.frameworks.Couchbase +import semmle.go.frameworks.Echo +import semmle.go.frameworks.ElazarlGoproxy +import semmle.go.frameworks.Email +import semmle.go.frameworks.Encoding +import semmle.go.frameworks.EvanphxJsonPatch +import semmle.go.frameworks.Gin +import semmle.go.frameworks.Glog +import semmle.go.frameworks.GoRestfulHttp +import semmle.go.frameworks.K8sIoApimachineryPkgRuntime +import semmle.go.frameworks.K8sIoApiCoreV1 +import semmle.go.frameworks.K8sIoClientGo +import semmle.go.frameworks.Logrus +import semmle.go.frameworks.Macaron +import semmle.go.frameworks.Mux +import semmle.go.frameworks.NoSQL +import semmle.go.frameworks.Protobuf +import semmle.go.frameworks.Revel +import semmle.go.frameworks.Spew +import semmle.go.frameworks.SQL +import semmle.go.frameworks.Stdlib +import semmle.go.frameworks.SystemCommandExecutors +import semmle.go.frameworks.Testing +import semmle.go.frameworks.WebSocket +import semmle.go.frameworks.XNetHtml +import semmle.go.frameworks.XPath +import semmle.go.frameworks.Yaml +import semmle.go.frameworks.Zap +import semmle.go.security.FlowSources diff --git a/go/ql/lib/ideContextual.qll b/go/ql/lib/ideContextual.qll new file mode 100644 index 00000000000..b729aa81c8f --- /dev/null +++ b/go/ql/lib/ideContextual.qll @@ -0,0 +1,23 @@ +/** + * Provides classes and predicates related to contextual queries + * in the code viewer. + */ + +import go + +/** + * Returns the `File` matching the given source file name as encoded by the VS + * Code extension. + */ +cached +File getFileBySourceArchiveName(string name) { + // The name provided for a file in the source archive by the VS Code extension + // has some differences from the absolute path in the database: + // 1. colons are replaced by underscores + // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> + // "/C_/foo/bar" + // 3. double slashes in UNC prefixes are replaced with a single slash + // We can handle 2 and 3 together by unconditionally adding a leading slash + // before replacing double slashes. + name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") +} diff --git a/go/ql/lib/localDefinitions.ql b/go/ql/lib/localDefinitions.ql new file mode 100644 index 00000000000..0ef61cbfdd3 --- /dev/null +++ b/go/ql/lib/localDefinitions.ql @@ -0,0 +1,20 @@ +/** + * @name Jump-to-definition links + * @description Generates use-definition pairs that provide the data + * for jump-to-definition in the code viewer. + * @kind definitions + * @id go/ide-jump-to-definition + * @tags ide-contextual-queries/local-definitions + */ + +import go +import ideContextual + +external string selectedSourceFile(); + +from Ident def, Ident use, Entity e +where + use.uses(e) and + def.declares(e) and + use.getFile() = getFileBySourceArchiveName(selectedSourceFile()) +select use, def, "V" diff --git a/go/ql/lib/localReferences.ql b/go/ql/lib/localReferences.ql new file mode 100644 index 00000000000..c0ed61ddfce --- /dev/null +++ b/go/ql/lib/localReferences.ql @@ -0,0 +1,20 @@ +/** + * @name Find-references links + * @description Generates use-definition pairs that provide the data + * for find-references in the code viewer. + * @kind definitions + * @id go/ide-find-references + * @tags ide-contextual-queries/local-references + */ + +import go +import ideContextual + +external string selectedSourceFile(); + +from Ident def, Ident use, Entity e +where + use.uses(e) and + def.declares(e) and + def.getFile() = getFileBySourceArchiveName(selectedSourceFile()) +select use, def, "V" diff --git a/go/ql/lib/printAst.ql b/go/ql/lib/printAst.ql new file mode 100644 index 00000000000..9d6d5c2d7b9 --- /dev/null +++ b/go/ql/lib/printAst.ql @@ -0,0 +1,30 @@ +/** + * @name Print AST + * @description Outputs a representation of a file's Abstract Syntax Tree. This + * query is used by the VS Code extension. + * @id go/print-ast + * @kind graph + * @tags ide-contextual-queries/print-ast + */ + +import go +import semmle.go.PrintAst +import ideContextual + +/** + * The source file to generate an AST from. + */ +external string selectedSourceFile(); + +/** + * Hook to customize the functions printed by this query. + */ +class Cfg extends PrintAstConfiguration { + override predicate shouldPrintFunction(FuncDecl func) { shouldPrintFile(func.getFile()) } + + override predicate shouldPrintFile(File file) { + file = getFileBySourceArchiveName(selectedSourceFile()) + } + + override predicate shouldPrintComments(File file) { none() } +} diff --git a/go/ql/lib/qlpack.lock.yml b/go/ql/lib/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/go/ql/lib/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml new file mode 100644 index 00000000000..a4bdaa250f8 --- /dev/null +++ b/go/ql/lib/qlpack.yml @@ -0,0 +1,7 @@ +name: codeql/go-all +version: 0.1.3-dev +groups: go +dbscheme: go.dbscheme +extractor: go +library: true +upgrades: upgrades diff --git a/go/ql/lib/semmle/go/AST.qll b/go/ql/lib/semmle/go/AST.qll new file mode 100644 index 00000000000..a9862ea330f --- /dev/null +++ b/go/ql/lib/semmle/go/AST.qll @@ -0,0 +1,252 @@ +/** + * Provides classes for working with AST nodes. + */ + +import go + +/** + * An AST node. + */ +class AstNode extends @node, Locatable { + /** + * Gets the `i`th child node of this node. + * + * Note that the precise indices of child nodes are considered an implementation detail + * and are subject to change without notice. + */ + AstNode getChild(int i) { + result = this.(ExprParent).getChildExpr(i) or + result = this.(GoModExprParent).getChildGoModExpr(i) or + result = this.(StmtParent).getChildStmt(i) or + result = this.(DeclParent).getDecl(i) or + result = this.(GenDecl).getSpec(i) or + result = this.(FieldParent).getField(i) or + result = this.(File).getCommentGroup(i) or + result = this.(CommentGroup).getComment(i) + } + + /** + * Gets a child node of this node. + */ + AstNode getAChild() { result = getChild(_) } + + /** + * Gets the number of child nodes of this node. + */ + int getNumChild() { result = count(getAChild()) } + + /** + * Gets a child with the given index and of the given kind, if one exists. + * Note that a given parent can have multiple children with the same index but differing kind. + */ + private AstNode getChildOfKind(string kind, int i) { + kind = "expr" and result = this.(ExprParent).getChildExpr(i) + or + kind = "gomodexpr" and result = this.(GoModExprParent).getChildGoModExpr(i) + or + kind = "stmt" and result = this.(StmtParent).getChildStmt(i) + or + kind = "decl" and result = this.(DeclParent).getDecl(i) + or + kind = "spec" and result = this.(GenDecl).getSpec(i) + or + kind = "field" and result = this.(FieldParent).getField(i) + or + kind = "commentgroup" and result = this.(File).getCommentGroup(i) + or + kind = "comment" and result = this.(CommentGroup).getComment(i) + } + + /** + * Get an AstNode child, ordered by child kind and then by index. + */ + AstNode getUniquelyNumberedChild(int index) { + result = + rank[index + 1](AstNode child, string kind, int i | + child = getChildOfKind(kind, i) + | + child order by kind, i + ) + } + + /** Gets the parent node of this AST node, if any. */ + AstNode getParent() { this = result.getAChild() } + + /** Gets the parent node of this AST node, but without crossing function boundaries. */ + private AstNode parentInSameFunction() { + result = getParent() and + not this instanceof FuncDef + } + + /** Gets the innermost function definition to which this AST node belongs, if any. */ + FuncDef getEnclosingFunction() { result = getParent().parentInSameFunction*() } + + /** + * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. + */ + final string getPrimaryQlClasses() { result = concat(getAPrimaryQlClass(), ",") } + + /** + * Gets the name of a primary CodeQL class to which this node belongs. + * + * For most nodes, this is simply the most precise syntactic category to which they belong; + * for example, `AddExpr` is a primary class, but `BinaryExpr` is not. + * + * For identifiers and selector expressions, the class describing what kind of entity they refer + * to (for example `FunctionName` or `TypeName`) is also considered primary. For such nodes, + * this predicate has multiple values. + */ + string getAPrimaryQlClass() { result = "???" } + + override string toString() { result = "AST node" } +} + +/** + * An AST node whose children include expressions. + */ +class ExprParent extends @exprparent, AstNode { + /** + * Gets the `i`th child expression of this node. + * + * Note that the precise indices of child expressions are considered an implementation detail + * and are subject to change without notice. + */ + Expr getChildExpr(int i) { exprs(result, _, this, i) } + + /** + * Gets an expression that is a child node of this node in the AST. + */ + Expr getAChildExpr() { result = getChildExpr(_) } + + /** + * Gets the number of child expressions of this node. + */ + int getNumChildExpr() { result = count(getAChildExpr()) } +} + +/** + * An AST node whose children include go.mod expressions. + */ +class GoModExprParent extends @modexprparent, AstNode { + /** + * Gets the `i`th child expression of this node. + * + * Note that the precise indices of child expressions are considered an implementation detail + * and are subject to change without notice. + */ + GoModExpr getChildGoModExpr(int i) { modexprs(result, _, this, i) } + + /** + * Gets an expression that is a child node of this node in the AST. + */ + GoModExpr getAChildGoModExpr() { result = getChildGoModExpr(_) } + + /** + * Gets the number of child expressions of this node. + */ + int getNumChildGoModExpr() { result = count(getAChildGoModExpr()) } +} + +/** + * An AST node whose children include statements. + */ +class StmtParent extends @stmtparent, AstNode { + /** + * Gets the `i`th child statement of this node. + * + * Note that the precise indices of child statements are considered an implementation detail + * and are subject to change without notice. + */ + Stmt getChildStmt(int i) { stmts(result, _, this, i) } + + /** + * Gets a statement that is a child node of this node in the AST. + */ + Stmt getAChildStmt() { result = getChildStmt(_) } + + /** + * Gets the number of child statements of this node. + */ + int getNumChildStmt() { result = count(getAChildStmt()) } +} + +/** + * An AST node whose children include declarations. + */ +class DeclParent extends @declparent, AstNode { + /** + * Gets the `i`th child declaration of this node. + * + * Note that the precise indices of declarations are considered an implementation detail + * and are subject to change without notice. + */ + Decl getDecl(int i) { decls(result, _, this, i) } + + /** + * Gets a child declaration of this node in the AST. + */ + Decl getADecl() { result = getDecl(_) } + + /** + * Gets the number of child declarations of this node. + */ + int getNumDecl() { result = count(getADecl()) } +} + +/** + * An AST node whose children include fields. + */ +class FieldParent extends @fieldparent, AstNode { + /** + * Gets the `i`th field of this node. + * + * Note that the precise indices of fields are considered an implementation detail + * and are subject to change without notice. + */ + FieldBase getField(int i) { fields(result, this, i) } + + /** + * Gets a child field of this node in the AST. + */ + FieldBase getAField() { result = getField(_) } + + /** + * Gets the number of child fields of this node. + */ + int getNumFields() { result = count(getAField()) } +} + +/** + * An AST node whose children include type parameter declarations. + */ +class TypeParamDeclParent extends @typeparamdeclparent, AstNode { + /** + * Gets the `i`th type parameter declaration of this node. + * + * Note that the precise indices of type parameters are considered an implementation detail + * and are subject to change without notice. + */ + TypeParamDecl getTypeParameterDecl(int i) { typeparamdecls(result, this, i) } + + /** + * Gets a child field of this node in the AST. + */ + TypeParamDecl getATypeParameterDecl() { result = this.getTypeParameterDecl(_) } +} + +/** + * An AST node which may induce a scope. + * + * The following nodes may induce scopes: + * + * - files + * - block statements, `if` statements, `switch` statements, `case` clauses, comm clauses, loops + * - function type expressions + * + * Note that functions themselves do not induce a scope, it is their type declaration that induces + * the scope. + */ +class ScopeNode extends @scopenode, AstNode { + /** Gets the scope induced by this node, if any. */ + LocalScope getScope() { scopenodes(this, result) } +} diff --git a/go/ql/lib/semmle/go/Architectures.qll b/go/ql/lib/semmle/go/Architectures.qll new file mode 100644 index 00000000000..e509de4bc68 --- /dev/null +++ b/go/ql/lib/semmle/go/Architectures.qll @@ -0,0 +1,37 @@ +/** Provides classes for working with architectures. */ + +import go + +/** + * An architecture that is valid in a build constraint. + * + * Information obtained from + * https://github.com/golang/go/blob/e125ccd10ea191101dbc31f0dd39a98f9d3ab929/src/go/types/gccgosizes.go + * where the first field of the struct is 4 for 32-bit architectures + * and 8 for 64-bit architectures. + */ +class Architecture extends string { + int bitSize; + + Architecture() { + this in [ + "386", "amd64p32", "arm", "armbe", "m64k", "mips", "mipsle", "mips64p32", "mips64p32le", + "nios2", "ppc", "riscv", "s390", "sh", "shbe", "sparc" + ] and + bitSize = 32 + or + this in [ + "alpha", "amd64", "arm64", "arm64be", "ia64", "mips64", "mips64le", "ppc64", "ppc64le", + "riscv64", "s390x", "sparc64", "wasm" + ] and + bitSize = 64 + } + + /** + * Gets the integer and pointer type width for this architecture. + * + * As of the time of writing, this appears to always be identical -- there aren't + * Go architectures with 64-bit pointers but 32-bit ints, for example. + */ + int getBitSize() { result = bitSize } +} diff --git a/go/ql/lib/semmle/go/Comments.qll b/go/ql/lib/semmle/go/Comments.qll new file mode 100644 index 00000000000..5026047cc99 --- /dev/null +++ b/go/ql/lib/semmle/go/Comments.qll @@ -0,0 +1,226 @@ +/** + * Provides classes for working with code comments. + */ + +import go + +/** + * A code comment. + * + * Examples: + * + *
    + * // a line comment
    + * /* a block
    + *   comment */
    + * 
    + */ +class Comment extends @comment, AstNode { + /** + * Gets the text of this comment, not including delimiters. + */ + string getText() { comments(this, _, _, _, result) } + + /** + * Gets the comment group to which this comment belongs. + */ + CommentGroup getGroup() { this = result.getAComment() } + + override string toString() { result = "comment" } + + override string getAPrimaryQlClass() { result = "Comment" } +} + +/** + * A comment group, that is, a sequence of comments without any intervening tokens or + * empty lines. + * + * Examples: + * + *
    + * // a line comment
    + * // another line comment
    + *
    + * // a line comment
    + * /* a block
    + *   comment */
    + *
    + * /* a block
    + * comment */
    + * /* another block comment */
    + * 
    + */ +class CommentGroup extends @comment_group, AstNode { + /** + * Gets the file to which this comment group belongs. + */ + override File getParent() { this = result.getACommentGroup() } + + /** Gets the `i`th comment in this group (0-based indexing). */ + Comment getComment(int i) { comments(result, _, this, i, _) } + + /** Gets a comment in this group. */ + Comment getAComment() { result = this.getComment(_) } + + /** Gets the number of comments in this group. */ + int getNumComment() { result = count(this.getAComment()) } + + override string toString() { result = "comment group" } + + override string getAPrimaryQlClass() { result = "CommentGroup" } +} + +/** + * A program element to which a documentation comment group may be attached: + * a file, a field, a specifier, a generic declaration, a function declaration + * or a go.mod expression. + * + * Examples: + * + * ```go + * // function documentation + * func double(x int) int { return 2 * x } + * + * // generic declaration documentation + * const ( + * // specifier documentation + * size int64 = 1024 + * eof = -1 // not specifier documentation + * ) + * ``` + */ +class Documentable extends AstNode, @documentable { + /** Gets the documentation comment group attached to this element, if any. */ + DocComment getDocumentation() { this = result.getDocumentedElement() } +} + +/** + * A comment group that is attached to a program element as documentation. + * + * Examples: + * + * ```go + * // function documentation + * func double(x int) int { return 2 * x } + * + * // generic declaration documentation + * const ( + * // specifier documentation + * size int64 = 1024 + * eof = -1 // not specifier documentation + * ) + * ``` + */ +class DocComment extends CommentGroup { + Documentable node; + + DocComment() { doc_comments(node, this) } + + /** Gets the program element documented by this comment group. */ + Documentable getDocumentedElement() { result = node } + + override string getAPrimaryQlClass() { result = "DocComment" } +} + +/** + * A single-line comment starting with `//`. + * + * Examples: + * + * ```go + * // Single line comment + * ``` + */ +class SlashSlashComment extends @slashslashcomment, Comment { + override string getAPrimaryQlClass() { result = "SlashSlashComment" } +} + +/** + * A block comment starting with `/*` and ending with */. + * + * Examples: + * + *
    + * /* a block
    + *   comment */
    + * 
    + */ +class SlashStarComment extends @slashstarcomment, Comment { + override string getAPrimaryQlClass() { result = "SlashStarComment" } +} + +/** + * A single-line comment starting with `//`. + * + * Examples: + * + * ```go + * // Single line comment + * ``` + */ +class LineComment = SlashSlashComment; + +/** + * A block comment starting with `/*` and ending with */. + * + * Examples: + * + *
    + * /* a block
    + *   comment */
    + * 
    + */ +class BlockComment = SlashStarComment; + +/** Holds if `c` starts at `line`, `col` in `f`, and precedes the package declaration. */ +private predicate isInitialComment(Comment c, File f, int line, int col) { + c.hasLocationInfo(f.getAbsolutePath(), line, col, _, _) and + line < f.getPackageNameExpr().getLocation().getStartLine() +} + +/** Gets the `i`th initial comment in `f` (0-based). */ +private Comment getInitialComment(File f, int i) { + result = + rank[i + 1](Comment c, int line, int col | + isInitialComment(c, f, line, col) + | + c order by line, col + ) +} + +/** + * A build constraint comment of the form `// +build ...` or `//go:build ...`. + * + * Examples: + * + * ```go + * // +build darwin freebsd netbsd openbsd + * // +build !linux + * ``` + */ +class BuildConstraintComment extends LineComment { + BuildConstraintComment() { + // a line comment preceding the package declaration, itself only preceded by + // line comments + exists(File f, int i | + // correctness of the placement of the build constraint is not checked here; + // this is more lax than the actual rules for build constraints + this = getInitialComment(f, i) and + not getInitialComment(f, [0 .. i - 1]) instanceof BlockComment + ) and + ( + // comment text starts with `+build` or `go:build` + this.getText().regexpMatch("\\s*\\+build.*") + or + this.getText().regexpMatch("\\s*go:build.*") + ) + } + + override string getAPrimaryQlClass() { result = "BuildConstraintComment" } + + /** Gets the body of this build constraint. */ + string getConstraintBody() { result = this.getText().splitAt("build ", 1) } + + /** Gets a disjunct of this build constraint. */ + string getADisjunct() { result = this.getConstraintBody().splitAt(" ") } +} diff --git a/go/ql/lib/semmle/go/Concepts.qll b/go/ql/lib/semmle/go/Concepts.qll new file mode 100644 index 00000000000..f3920c2ec5c --- /dev/null +++ b/go/ql/lib/semmle/go/Concepts.qll @@ -0,0 +1,475 @@ +/** + * Provides abstract classes representing generic concepts such as file system + * access or system command execution, for which individual framework libraries + * provide concrete subclasses. + */ + +import go +import semmle.go.dataflow.FunctionInputsAndOutputs +import semmle.go.concepts.HTTP +import semmle.go.concepts.GeneratedFile + +/** + * A data-flow node that executes an operating system command, + * for instance by spawning a new process. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `SystemCommandExecution::Range` instead. + */ +class SystemCommandExecution extends DataFlow::Node { + SystemCommandExecution::Range self; + + SystemCommandExecution() { this = self } + + /** Gets the argument that specifies the command to be executed. */ + DataFlow::Node getCommandName() { result = self.getCommandName() } + + /** Holds if this node is sanitized whenever it follows `--` in an argument list. */ + predicate doubleDashIsSanitizing() { self.doubleDashIsSanitizing() } +} + +/** Provides a class for modeling new system-command execution APIs. */ +module SystemCommandExecution { + /** + * A data-flow node that executes an operating system command, + * for instance by spawning a new process. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `SystemCommandExecution` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the argument that specifies the command to be executed. */ + abstract DataFlow::Node getCommandName(); + + /** Holds if this node is sanitized whenever it follows `--` in an argument list. */ + predicate doubleDashIsSanitizing() { none() } + } +} + +/** + * An instantiation of a template; that is, a call which fills out a template with data. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `TemplateInstantiation::Range` instead. + */ +class TemplateInstantiation extends DataFlow::Node { + TemplateInstantiation::Range self; + + TemplateInstantiation() { this = self } + + /** + * Gets the argument to this template instantiation that is the template being + * instantiated. + */ + DataFlow::Node getTemplateArgument() { result = self.getTemplateArgument() } + + /** + * Gets an argument to this template instantiation that is data being inserted + * into the template. + */ + DataFlow::Node getADataArgument() { result = self.getADataArgument() } +} + +/** Provides a class for modeling new template-instantiation APIs. */ +module TemplateInstantiation { + /** + * An instantiation of a template; that is, a call which fills out a template with data. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `TemplateInstantiation` instead. + */ + abstract class Range extends DataFlow::Node { + /** + * Gets the argument to this template instantiation that is the template being + * instantiated. + */ + abstract DataFlow::Node getTemplateArgument(); + + /** + * Gets an argument to this template instantiation that is data being inserted + * into the template. + */ + abstract DataFlow::Node getADataArgument(); + } +} + +/** + * A data-flow node that performs a file system access, including reading and writing data, + * creating and deleting files and folders, checking and updating permissions, and so on. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `FileSystemAccess::Range` instead. + */ +class FileSystemAccess extends DataFlow::Node { + FileSystemAccess::Range self; + + FileSystemAccess() { this = self } + + /** Gets an argument to this file system access that is interpreted as a path. */ + DataFlow::Node getAPathArgument() { result = self.getAPathArgument() } +} + +/** Provides a class for modeling new file-system access APIs. */ +module FileSystemAccess { + /** + * A data-flow node that performs a file system access, including reading and writing data, + * creating and deleting files and folders, checking and updating permissions, and so on. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `FileSystemAccess` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets an argument to this file system access that is interpreted as a path. */ + abstract DataFlow::Node getAPathArgument(); + } +} + +/** A function that escapes meta-characters to prevent injection attacks. */ +class EscapeFunction extends Function { + EscapeFunction::Range self; + + EscapeFunction() { this = self } + + /** + * The context that this function escapes for. + * + * Currently, this can be "js", "html", or "url". + */ + string kind() { result = self.kind() } +} + +/** Provides a class for modeling new escape-function APIs. */ +module EscapeFunction { + /** + * A function that escapes meta-characters to prevent injection attacks. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `EscapeFunction' instead. + */ + abstract class Range extends Function { + /** + * The context that this function escapes for. + * + * Currently, this can be `js', `html', or `url'. + */ + abstract string kind(); + } +} + +/** + * A function that escapes a string so it can be safely included in a + * JavaScript string literal. + */ +class JsEscapeFunction extends EscapeFunction { + JsEscapeFunction() { self.kind() = "js" } +} + +/** + * A function that escapes a string so it can be safely included in an + * the body of an HTML element, for example, replacing `{}` in + * `

    {}

    `. + */ +class HtmlEscapeFunction extends EscapeFunction { + HtmlEscapeFunction() { self.kind() = "html" } +} + +/** + * A function that escapes a string so it can be safely included as part + * of a URL. + */ +class UrlEscapeFunction extends EscapeFunction { + UrlEscapeFunction() { self.kind() = "url" } +} + +/** + * A node whose value is interpreted as a part of a regular expression. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `RegexpPattern::Range` instead. + */ +class RegexpPattern extends DataFlow::Node { + RegexpPattern::Range self; + + RegexpPattern() { this = self } + + /** + * Gets the node where this pattern is parsed as a part of a regular + * expression. + */ + DataFlow::Node getAParse() { result = self.getAParse() } + + /** + * Gets this regexp pattern as a string. + */ + string getPattern() { result = self.getPattern() } + + /** + * Gets a use of this pattern, either as itself in an argument to a function or as a compiled + * regexp object. + */ + DataFlow::Node getAUse() { result = self.getAUse() } +} + +/** Provides a class for modeling new regular-expression APIs. */ +module RegexpPattern { + /** + * A node whose value is interpreted as a part of a regular expression. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `RegexpPattern' instead. + */ + abstract class Range extends DataFlow::Node { + /** + * Gets a node where the pattern of this node is parsed as a part of + * a regular expression. + */ + abstract DataFlow::Node getAParse(); + + /** + * Gets this regexp pattern as a string. + */ + abstract string getPattern(); + + /** + * Gets a use of this pattern, either as itself in an argument to a function or as a compiled + * regexp object. + */ + abstract DataFlow::Node getAUse(); + } +} + +/** + * A function that matches a regexp with a string or byte slice. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `RegexpMatchFunction::Range` instead. + */ +class RegexpMatchFunction extends Function { + RegexpMatchFunction::Range self; + + RegexpMatchFunction() { this = self } + + /** + * Gets the function input that is the regexp being matched. + */ + FunctionInput getRegexpArg() { result = self.getRegexpArg() } + + /** + * Gets the regexp pattern that is used in the call to this function `call`. + */ + RegexpPattern getRegexp(DataFlow::CallNode call) { + result.getAUse() = this.getRegexpArg().getNode(call) + } + + /** + * Gets the function input that is the string being matched against. + */ + FunctionInput getValue() { result = self.getValue() } + + /** + * Gets the function output that is the Boolean result of the match function. + */ + FunctionOutput getResult() { result = self.getResult() } +} + +/** Provides a class for modeling new regular-expression matcher APIs. */ +module RegexpMatchFunction { + /** + * A function that matches a regexp with a string or byte slice. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `RegexpPattern' instead. + */ + abstract class Range extends Function { + /** + * Gets the function input that is the regexp being matched. + */ + abstract FunctionInput getRegexpArg(); + + /** + * Gets the function input that is the string being matched against. + */ + abstract FunctionInput getValue(); + + /** + * Gets the Boolean result of the match function. + */ + abstract FunctionOutput getResult(); + } +} + +/** + * A function that uses a regexp to replace parts of a string or byte slice. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `RegexpReplaceFunction::Range` instead. + */ +class RegexpReplaceFunction extends Function { + RegexpReplaceFunction::Range self; + + RegexpReplaceFunction() { this = self } + + /** + * Gets the function input that is the regexp that matches text to replace. + */ + FunctionInput getRegexpArg() { result = self.getRegexpArg() } + + /** + * Gets the regexp pattern that is used to match patterns to replace in the call to this function + * `call`. + */ + RegexpPattern getRegexp(DataFlow::CallNode call) { + result.getAUse() = call.(DataFlow::MethodCallNode).getReceiver() + } + + /** + * Gets the function input corresponding to the source value, that is, the value that is having + * its contents replaced. + */ + FunctionInput getSource() { result = self.getSource() } + + /** + * Gets the function output corresponding to the result, that is, the value after replacement has + * occurred. + */ + FunctionOutput getResult() { result = self.getResult() } +} + +/** Provides a class for modeling new regular-expression replacer APIs. */ +module RegexpReplaceFunction { + /** + * A function that uses a regexp to replace parts of a string or byte slice. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `RegexpReplaceFunction' instead. + */ + abstract class Range extends Function { + /** + * Gets the function input that is the regexp that matches text to replace. + */ + abstract FunctionInput getRegexpArg(); + + /** + * Gets the function input corresponding to the source value, that is, the value that is having + * its contents replaced. + */ + abstract FunctionInput getSource(); + + /** + * Gets the function output corresponding to the result, that is, the value after replacement + * has occurred. + */ + abstract FunctionOutput getResult(); + } +} + +/** + * A call to a logging mechanism. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `LoggerCall::Range` instead. + */ +class LoggerCall extends DataFlow::Node { + LoggerCall::Range self; + + LoggerCall() { this = self } + + /** Gets a node that is a part of the logged message. */ + DataFlow::Node getAMessageComponent() { result = self.getAMessageComponent() } +} + +/** Provides a class for modeling new logging APIs. */ +module LoggerCall { + /** + * A call to a logging mechanism. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `LoggerCall` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets a node that is a part of the logged message. */ + abstract DataFlow::Node getAMessageComponent(); + } +} + +/** + * A function that encodes data into a binary or textual format. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `MarshalingFunction::Range` instead. + */ +class MarshalingFunction extends Function { + MarshalingFunction::Range self; + + MarshalingFunction() { this = self } + + /** Gets an input that is encoded by this function. */ + FunctionInput getAnInput() { result = self.getAnInput() } + + /** Gets the output that contains the encoded data produced by this function. */ + FunctionOutput getOutput() { result = self.getOutput() } + + /** Gets an identifier for the format this function encodes into, such as "JSON". */ + string getFormat() { result = self.getFormat() } +} + +/** Provides a class for modeling new marshaling APIs. */ +module MarshalingFunction { + /** + * A function that encodes data into a binary or textual format. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `MarshalingFunction` instead. + */ + abstract class Range extends Function { + /** Gets an input that is encoded by this function. */ + abstract FunctionInput getAnInput(); + + /** Gets the output that contains the encoded data produced by this function. */ + abstract FunctionOutput getOutput(); + + /** Gets an identifier for the format this function encodes into, such as "JSON". */ + abstract string getFormat(); + } +} + +/** + * A function that decodes data from a binary or textual format. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `UnmarshalingFunction::Range` instead. + */ +class UnmarshalingFunction extends Function { + UnmarshalingFunction::Range self; + + UnmarshalingFunction() { this = self } + + /** Gets an input that is decoded by this function. */ + FunctionInput getAnInput() { result = self.getAnInput() } + + /** Gets the output that contains the decoded data produced by this function. */ + FunctionOutput getOutput() { result = self.getOutput() } + + /** Gets an identifier for the format this function decodes from, such as "JSON". */ + string getFormat() { result = self.getFormat() } +} + +/** Provides a class for modeling new unmarshaling APIs. */ +module UnmarshalingFunction { + /** + * A function that decodes data from a binary or textual format. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `UnmarshalingFunction` instead. + */ + abstract class Range extends Function { + /** Gets an input that is decoded by this function. */ + abstract FunctionInput getAnInput(); + + /** Gets the output that contains the decoded data produced by this function. */ + abstract FunctionOutput getOutput(); + + /** Gets an identifier for the format this function decodes from, such as "JSON". */ + abstract string getFormat(); + } +} diff --git a/go/ql/lib/semmle/go/Decls.qll b/go/ql/lib/semmle/go/Decls.qll new file mode 100644 index 00000000000..0623aa1cc45 --- /dev/null +++ b/go/ql/lib/semmle/go/Decls.qll @@ -0,0 +1,664 @@ +/** + * Provides classes for working with declarations. + */ + +import go + +/** + * A declaration. + */ +class Decl extends @decl, ExprParent, StmtParent, FieldParent { + /** + * Gets the kind of this declaration, which is an integer value representing the declaration's + * node type. + * + * Note that the mapping from node types to integer kinds is considered an implementation detail + * and subject to change without notice. + */ + int getKind() { decls(this, result, _, _) } + + /** + * Holds if the execution of this statement may produce observable side effects. + * + * Memory allocation is not considered an observable side effect. + */ + predicate mayHaveSideEffects() { none() } +} + +/** + * A bad declaration, that is, a declaration that cannot be parsed. + */ +class BadDecl extends @baddecl, Decl { + override string toString() { result = "bad declaration" } + + override string getAPrimaryQlClass() { result = "BadDecl" } +} + +/** + * A generic declaration. + */ +class GenDecl extends @gendecl, Decl, Documentable { + /** Gets the `i`th declaration specifier in this declaration (0-based). */ + Spec getSpec(int i) { specs(result, _, this, i) } + + /** Gets a declaration specifier in this declaration. */ + Spec getASpec() { result = this.getSpec(_) } + + /** Gets the number of declaration specifiers in this declaration. */ + int getNumSpec() { result = count(this.getASpec()) } + + override predicate mayHaveSideEffects() { this.getASpec().mayHaveSideEffects() } + + override string getAPrimaryQlClass() { result = "GenDecl" } +} + +/** + * An import declaration. + */ +class ImportDecl extends @importdecl, GenDecl { + override string toString() { result = "import declaration" } + + override string getAPrimaryQlClass() { result = "ImportDecl" } +} + +/** + * A constant declaration. + */ +class ConstDecl extends @constdecl, GenDecl { + override string toString() { result = "constant declaration" } + + override string getAPrimaryQlClass() { result = "ConstDecl" } +} + +/** + * A type declaration. + */ +class TypeDecl extends @typedecl, GenDecl { + override string toString() { result = "type declaration" } + + override string getAPrimaryQlClass() { result = "TypeDecl" } +} + +/** + * A variable declaration. + */ +class VarDecl extends @vardecl, GenDecl { + override string toString() { result = "variable declaration" } + + override string getAPrimaryQlClass() { result = "VarDecl" } +} + +/** + * A function definition, that is, either a function declaration or + * a function literal. + */ +class FuncDef extends @funcdef, StmtParent, ExprParent { + /** Gets the body of the defined function, if any. */ + BlockStmt getBody() { none() } + + /** Gets the name of the defined function, if any. */ + string getName() { none() } + + /** Gets the expression denoting the type of this function. */ + FuncTypeExpr getTypeExpr() { none() } + + /** Gets the type of this function. */ + SignatureType getType() { none() } + + /** Gets the scope induced by this function. */ + FunctionScope getScope() { result.getFunction() = this } + + /** Gets a `defer` statement in this function. */ + DeferStmt getADeferStmt() { result.getEnclosingFunction() = this } + + /** Gets the `i`th result variable of this function. */ + ResultVariable getResultVar(int i) { result.isResultOf(this, i) } + + /** Gets a result variable of this function. */ + ResultVariable getAResultVar() { result.getFunction() = this } + + /** + * Gets the `i`th parameter of this function. + * + * The receiver variable, if any, is considered to be the -1st parameter. + */ + Parameter getParameter(int i) { result.isParameterOf(this, i) } + + /** Gets a parameter of this function. */ + Parameter getAParameter() { result.getFunction() = this } + + /** + * Gets the number of parameters of this function. + */ + int getNumParameter() { result = count(this.getAParameter()) } + + /** + * Gets a call to this function. + */ + DataFlow::CallNode getACall() { result.getACallee() = this } + + /** Holds if this function is variadic. */ + predicate isVariadic() { this.getType().isVariadic() } + + override string getAPrimaryQlClass() { result = "FuncDef" } +} + +/** + * A function declaration. + */ +class FuncDecl extends @funcdecl, Decl, Documentable, FuncDef, TypeParamDeclParent { + /** Gets the identifier denoting the name of this function. */ + Ident getNameExpr() { result = this.getChildExpr(0) } + + override string getName() { result = this.getNameExpr().getName() } + + override FuncTypeExpr getTypeExpr() { result = this.getChildExpr(1) } + + override SignatureType getType() { result = this.getNameExpr().getType() } + + /** Gets the body of this function, if any. */ + override BlockStmt getBody() { result = this.getChildStmt(2) } + + /** Gets the function declared by this function declaration. */ + DeclaredFunction getFunction() { this = result.getFuncDecl() } + + override string toString() { result = "function declaration" } + + override string getAPrimaryQlClass() { result = "FuncDecl" } +} + +/** + * A method declaration. + */ +class MethodDecl extends FuncDecl { + ReceiverDecl recv; + + MethodDecl() { recv.getFunction() = this } + + /** + * Gets the receiver declaration of this method. + * + * For example, the receiver declaration of + * + * ``` + * func (p *Rectangle) Area() float64 { ... } + * ``` + * + * is `p *Rectangle`. + */ + ReceiverDecl getReceiverDecl() { result = recv } + + /** + * Gets the receiver type of this method. + * + * For example, the receiver type of + * + * ``` + * func (p *Rectangle) Area() float64 { ... } + * ``` + * + * is `*Rectangle`. + */ + Type getReceiverType() { result = this.getReceiverDecl().getType() } + + /** + * Gets the receiver base type of this method. + * + * For example, the receiver base type of + * + * ``` + * func (p *Rectangle) Area() float64 { ... } + * ``` + * + * is `Rectangle`. + */ + NamedType getReceiverBaseType() { + result = this.getReceiverType() or + result = this.getReceiverType().(PointerType).getBaseType() + } + + /** + * Gets the receiver variable of this method. + * + * For example, the receiver variable of + * + * ``` + * func (p *Rectangle) Area() float64 { ... } + * ``` + * + * is the variable `p`. + */ + ReceiverVariable getReceiver() { result.getFunction() = this } + + override string getAPrimaryQlClass() { result = "MethodDecl" } +} + +/** + * A declaration specifier. + */ +class Spec extends @spec, ExprParent, Documentable { + /** Gets the declaration to which this specifier belongs */ + Decl getParentDecl() { specs(this, _, result, _) } + + /** + * Gets the kind of this specifier, which is an integer value representing the specifier's + * node type. + * + * Note that the mapping from node types to integer kinds is considered an implementation detail + * and subject to change without notice. + */ + int getKind() { specs(this, result, _, _) } + + /** + * Holds if the execution of this specifier may produce observable side effects. + * + * Memory allocation is not considered an observable side effect. + */ + predicate mayHaveSideEffects() { none() } + + override string getAPrimaryQlClass() { result = "Spec" } +} + +/** + * An import specifier. + */ +class ImportSpec extends @importspec, Spec { + /** Gets the identifier denoting the imported name. */ + Ident getNameExpr() { result = this.getChildExpr(0) } + + /** Gets the imported name. */ + string getName() { result = this.getNameExpr().getName() } + + /** Gets the string literal denoting the imported path. */ + StringLit getPathExpr() { result = this.getChildExpr(1) } + + /** Gets the imported path. */ + string getPath() { result = this.getPathExpr().getValue() } + + override string toString() { result = "import specifier" } + + override string getAPrimaryQlClass() { result = "ImportSpec" } +} + +/** + * A constant or variable declaration specifier. + */ +class ValueSpec extends @valuespec, Spec { + /** Gets the identifier denoting the `i`th name declared by this specifier (0-based). */ + Ident getNameExpr(int i) { + i >= 0 and + result = this.getChildExpr(-(i + 1)) + } + + /** Holds if this specifier is a part of a constant declaration. */ + predicate isConstSpec() { this.getParentDecl() instanceof ConstDecl } + + /** Gets an identifier denoting a name declared by this specifier. */ + Ident getANameExpr() { result = this.getNameExpr(_) } + + /** Gets the `i`th name declared by this specifier (0-based). */ + string getName(int i) { result = this.getNameExpr(i).getName() } + + /** Gets a name declared by this specifier. */ + string getAName() { result = this.getName(_) } + + /** Gets the number of names declared by this specifier. */ + int getNumName() { result = count(this.getANameExpr()) } + + /** Gets the expression denoting the type of the symbols declared by this specifier. */ + Expr getTypeExpr() { result = this.getChildExpr(0) } + + /** Gets the `i`th initializer of this specifier (0-based). */ + Expr getInit(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** Gets an initializer of this specifier. */ + Expr getAnInit() { result = this.getInit(_) } + + /** Gets the number of initializers of this specifier. */ + int getNumInit() { result = count(this.getAnInit()) } + + /** Gets the unique initializer of this specifier, if there is only one. */ + Expr getInit() { this.getNumInit() = 1 and result = this.getInit(0) } + + /** + * Gets the specifier that contains the initializers for this specifier. + * If this valuespec has initializers, the result is itself. Otherwise, it is the + * last specifier declared before this one that has initializers. + */ + private ValueSpec getEffectiveSpec() { + (exists(this.getAnInit()) or not this.isConstSpec()) and + result = this + or + not exists(this.getAnInit()) and + exists(ConstDecl decl, int idx | + decl = this.getParentDecl() and + decl.getSpec(idx) = this + | + result = decl.getSpec(idx - 1).(ValueSpec).getEffectiveSpec() + ) + } + + /** + * Gets the `i`th effective initializer of this specifier, that is, the expression + * that the `i`th name will get initialized to. This is the same as `getInit` + * if it exists, or `getInit` on the last specifier in the declaration that this + * is a child of. + */ + private Expr getEffectiveInit(int i) { result = this.getEffectiveSpec().getInit(i) } + + /** Holds if this specifier initializes `name` to the value of `init`. */ + predicate initializes(string name, Expr init) { + exists(int i | + name = this.getName(i) and + init = this.getEffectiveInit(i) + ) + } + + override predicate mayHaveSideEffects() { this.getAnInit().mayHaveSideEffects() } + + override string toString() { result = "value declaration specifier" } + + override string getAPrimaryQlClass() { result = "ValueSpec" } +} + +/** + * A type declaration specifier, which is either a type definition or an alias declaration. + * + * Examples: + * + * ``` + * type ( + * status int + * intlist = []int + * ) + * ``` + */ +class TypeSpec extends @typespec, Spec, TypeParamDeclParent { + /** Gets the identifier denoting the name of the declared type. */ + Ident getNameExpr() { result = this.getChildExpr(0) } + + /** Gets the name of the declared type. */ + string getName() { result = this.getNameExpr().getName() } + + /** + * Gets the expression denoting the underlying type to which the newly declared type is bound. + */ + Expr getTypeExpr() { result = this.getChildExpr(1) } + + override string toString() { result = "type declaration specifier" } + + override string getAPrimaryQlClass() { result = "TypeSpec" } +} + +/** + * An alias declaration specifier. + * + * Examples: + * + * ``` + * type intlist = []int + * ``` + */ +class AliasSpec extends @aliasspec, TypeSpec { } + +/** + * A type definition specifier. + * + * Examples: + * + * ``` + * type status int + * ``` + */ +class TypeDefSpec extends @typedefspec, TypeSpec { } + +/** + * A field declaration, of a struct, a function (in which case this is a parameter or result variable), + * or an interface (in which case this is a method or embedding spec). + */ +class FieldBase extends @field, ExprParent { + /** + * Gets the expression representing the type of the fields declared in this declaration. + */ + Expr getTypeExpr() { result = this.getChildExpr(0) } + + /** + * Gets the type of the fields declared in this declaration. + */ + Type getType() { result = this.getTypeExpr().getType() } +} + +/** + * A field declaration in a struct type. + */ +class FieldDecl extends FieldBase, Documentable, ExprParent { + StructTypeExpr st; + + FieldDecl() { this = st.getField(_) } + + /** + * Gets the expression representing the name of the `i`th field declared in this declaration + * (0-based). + */ + Expr getNameExpr(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** Gets the tag expression of this field declaration, if any. */ + Expr getTag() { result = this.getChildExpr(-1) } + + /** Gets the struct type expression to which this field declaration belongs. */ + StructTypeExpr getDeclaringStructTypeExpr() { result = st } + + /** Gets the struct type to which this field declaration belongs. */ + StructType getDeclaringType() { result = this.getDeclaringStructTypeExpr().getType() } + + override string toString() { result = "field declaration" } + + override string getAPrimaryQlClass() { result = "FieldDecl" } +} + +/** + * An embedded field declaration in a struct. + */ +class EmbeddedFieldDecl extends FieldDecl { + EmbeddedFieldDecl() { not exists(this.getNameExpr(_)) } + + override string getAPrimaryQlClass() { result = "EmbeddedFieldDecl" } +} + +/** + * A function parameter or result variable declaration. + */ +class ParameterOrResultDecl extends FieldBase, Documentable, ExprParent { + int rawIndex; + FuncTypeExpr ft; + + ParameterOrResultDecl() { this = ft.getField(rawIndex) } + + /** + * Gets the function type expression to which this declaration belongs. + */ + FuncTypeExpr getFunctionTypeExpr() { result = ft } + + /** + * Gets the function to which this declaration belongs. + */ + FuncDef getFunction() { result.getTypeExpr() = this.getFunctionTypeExpr() } + + /** + * Gets the expression representing the name of the `i`th variable declared in this declaration + * (0-based). + */ + Expr getNameExpr(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** + * Gets an expression representing the name of a variable declared in this declaration. + */ + Expr getANameExpr() { result = this.getNameExpr(_) } +} + +/** + * A parameter declaration. + */ +class ParameterDecl extends ParameterOrResultDecl { + ParameterDecl() { rawIndex >= 0 } + + /** + * Gets the index of this parameter declarations among all parameter declarations of + * its associated function type. + */ + int getIndex() { result = rawIndex } + + override string toString() { result = "parameter declaration" } + + override string getAPrimaryQlClass() { result = "ParameterDecl" } +} + +/** + * A receiver declaration in a function declaration. + */ +class ReceiverDecl extends FieldBase, Documentable, ExprParent { + FuncDecl fd; + + ReceiverDecl() { fd.getField(-1) = this } + + /** + * Gets the function declaration to which this receiver belongs. + */ + FuncDecl getFunction() { result = fd } + + /** + * Gets the expression representing the name of the receiver declared in this declaration. + */ + Expr getNameExpr() { result = this.getChildExpr(1) } + + override string toString() { result = "receiver declaration" } + + override string getAPrimaryQlClass() { result = "ReceiverDecl" } +} + +/** + * A result variable declaration. + */ +class ResultVariableDecl extends ParameterOrResultDecl { + ResultVariableDecl() { rawIndex < 0 } + + /** + * Gets the index of this result variable declaration among all result variable declarations of + * its associated function type. + */ + int getIndex() { result = -(rawIndex + 1) } + + override string toString() { result = "result variable declaration" } + + override string getAPrimaryQlClass() { result = "ResultVariableDecl" } +} + +/** + * A type parameter declaration in a type specification. + */ +class TypeParamDecl extends @typeparamdecl, Documentable, ExprParent { + TypeParamDecl() { typeparamdecls(this, _, _) } + + /** + * Gets the expression representing the type constraint of the type + * parameters in this declaration. + * + * If you want the type constraint type itself then use `getTypeConstraint`, + * as that wraps type set literals with implicit interface types. + */ + Expr getTypeConstraintExpr() { result = this.getChildExpr(0) } + + /** + * Gets the type constraint of the type parameters in this declaration. + * + * If the type constraint is a type set literal then it will be wrapped + * with an implicit interface type. + */ + Type getTypeConstraint() { + exists(Type t | t = this.getTypeConstraintExpr().getType() | + if t instanceof TypeSetLiteralType + then result = t.(TypeSetLiteralType).getInterfaceType() + else result = t + ) + } + + /** + * Gets the expression representing the name of the `i`th type parameter + * in this declaration (0-based). + */ + Expr getNameExpr(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** + * Gets the `i`th type parameter type in this declaration (0-based). + */ + TypeParamType getTypeParamType(int i) { + i >= 0 and + result = this.getNameExpr(i).getType() + } + + override string toString() { result = "type parameter declaration" } + + override string getAPrimaryQlClass() { result = "TypeParamDecl" } +} + +/** + * A method or embedding specification in an interface type expression. + */ +class InterfaceMemberSpec extends FieldBase, Documentable, ExprParent { + InterfaceTypeExpr ite; + int idx; + + InterfaceMemberSpec() { this = ite.getField(idx) } + + /** + * Gets the interface type expression to which this member specification belongs. + */ + InterfaceTypeExpr getInterfaceTypeExpr() { result = ite } + + /** + * Gets the index of this member specification among all member specifications of + * its associated interface type expression. + */ + int getIndex() { result = idx } +} + +/** + * A method specification in an interface. + */ +class MethodSpec extends InterfaceMemberSpec { + Expr name; + + MethodSpec() { name = this.getChildExpr(1) } + + /** + * Gets the expression representing the name of the method declared in this specification. + */ + Expr getNameExpr() { result = name } + + override string toString() { result = "method declaration" } + + override string getAPrimaryQlClass() { result = "MethodSpec" } +} + +/** + * An embedding specification in an interface. + */ +class EmbeddingSpec extends InterfaceMemberSpec { + EmbeddingSpec() { not exists(this.getChildExpr(1)) } + + override string toString() { result = "interface embedding" } + + override string getAPrimaryQlClass() { result = "EmbeddingSpec" } +} diff --git a/go/ql/lib/semmle/go/Errors.qll b/go/ql/lib/semmle/go/Errors.qll new file mode 100644 index 00000000000..cf83a87ff15 --- /dev/null +++ b/go/ql/lib/semmle/go/Errors.qll @@ -0,0 +1,53 @@ +/** Provides classes for working with Go frontend errors recorded during extraction. */ + +import go + +/** + * An error reported by the Go frontend during extraction. + */ +class Error extends @error { + /** Gets the message associated with this error. */ + string getMessage() { errors(this, _, result, _, _, _, _, _, _) } + + /** Gets the raw position reported by the frontend for this error. */ + string getRawPosition() { errors(this, _, _, result, _, _, _, _, _) } + + /** Gets the package in which this error was reported. */ + Package getPackage() { errors(this, _, _, _, _, _, _, result, _) } + + /** Gets the index of this error among all errors reported for the same package. */ + int getIndex() { errors(this, _, _, _, _, _, _, _, result) } + + /** Gets the file in which this error was reported, if it can be determined. */ + ExtractedOrExternalFile getFile() { hasLocationInfo(result.getAbsolutePath(), _, _, _, _) } + + /** + * 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`. + * For more information, see + * [LGTM locations](https://lgtm.com/help/ql/locations). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + errors(this, _, _, _, filepath, startline, startcolumn, _, _) and + endline = startline and + endcolumn = startcolumn + } + + /** Gets a textual representation of this error. */ + string toString() { result = getMessage() } +} + +/** An error reported by an unknown part of the Go frontend. */ +class UnknownError extends Error, @unknownerror { } + +/** An error reported by the Go frontend driver. */ +class ListError extends Error, @listerror { } + +/** An error reported by the Go parser. */ +class ParseError extends Error, @parseerror { } + +/** An error reported by the Go type checker. */ +class TypeError extends Error, @typeerror { } diff --git a/go/ql/lib/semmle/go/Expr.qll b/go/ql/lib/semmle/go/Expr.qll new file mode 100644 index 00000000000..d32d87287fe --- /dev/null +++ b/go/ql/lib/semmle/go/Expr.qll @@ -0,0 +1,2234 @@ +/** + * Provides classes for working with expressions. + */ + +import go + +/** + * An expression. + * + * Examples: + * + * ```go + * x + 1 + * y < 0 + * ``` + */ +class Expr extends @expr, ExprParent { + /** + * Gets the kind of this expression, which is an integer value representing the expression's + * node type. + * + * Note that the mapping from node types to integer kinds is considered an implementation detail + * and subject to change without notice. + */ + int getKind() { exprs(this, result, _, _) } + + /** Gets this expression, with any surrounding parentheses removed. */ + Expr stripParens() { result = this } + + /** + * Holds if this expression is constant, that is, if its value is determined at + * compile-time. + */ + predicate isConst() { constvalues(this, _, _) } + + /** + * Gets the boolean value this expression evalutes to, if any. + */ + boolean getBoolValue() { + this.getType().getUnderlyingType() instanceof BoolType and + exists(string val | constvalues(this, val, _) | + val = "true" and result = true + or + val = "false" and result = false + ) + } + + /** Gets the floating-point value this expression evaluates to, if any. */ + float getFloatValue() { + this.getType().getUnderlyingType() instanceof FloatType and + exists(string val | constvalues(this, val, _) | result = val.toFloat()) + } + + /** + * Gets the integer value this expression evaluates to, if any. + * + * Note that this does not have a result if the value is too large to fit in a + * 32-bit signed integer type. + */ + int getIntValue() { + this.getType().getUnderlyingType() instanceof IntegerType and + exists(string val | constvalues(this, val, _) | result = val.toInt()) + } + + /** Gets either `getFloatValue` or `getIntValue`. */ + float getNumericValue() { result = this.getFloatValue() or result = this.getIntValue() } + + /** + * Holds if the complex value this expression evaluates to has real part `real` and imaginary + * part `imag`. + */ + predicate hasComplexValue(float real, float imag) { + this.getType().getUnderlyingType() instanceof ComplexType and + exists(string val | constvalues(this, val, _) | + exists(string cmplxre | + cmplxre = "^\\((.+) \\+ (.+)i\\)$" and + real = val.regexpCapture(cmplxre, 1).toFloat() and + imag = val.regexpCapture(cmplxre, 2).toFloat() + ) + ) + } + + /** Gets the string value this expression evaluates to, if any. */ + string getStringValue() { + this.getType().getUnderlyingType() instanceof StringType and + constvalues(this, result, _) + } + + /** + * Gets the string representation of the exact value this expression + * evaluates to, if any. + * + * For example, for the constant 3.141592653589793238462, this will + * result in 1570796326794896619231/500000000000000000000 + */ + string getExactValue() { constvalues(this, _, result) } + + /** + * Holds if this expression has a constant value which is guaranteed not to depend on the + * platform where it is evaluated. + * + * This is a conservative approximation, that is, the predicate may fail to hold for expressions + * whose value is platform independent, but it will never hold for expressions whose value is not + * platform independent. + * + * Examples of platform-dependent constants include constants declared in files with build + * constraints, the value of `runtime.GOOS`, and the return value of `unsafe.Sizeof`. + */ + predicate isPlatformIndependentConstant() { none() } + + /** Gets the type of this expression. */ + Type getType() { + type_of(this, result) + or + not type_of(this, _) and + result instanceof InvalidType + } + + /** + * Gets the global value number of this expression. + * + * Expressions with the same global value number are guaranteed to have the same value at runtime. + * The converse does not hold in general, that is, expressions with different global value numbers + * may still have the same value at runtime. + */ + GVN getGlobalValueNumber() { result = globalValueNumber(DataFlow::exprNode(this)) } + + /** + * Holds if this expression may have observable side effects of its own (that is, independent + * of whether its sub-expressions may have side effects). + * + * Memory allocation is not considered an observable side effect. + */ + predicate mayHaveOwnSideEffects() { none() } + + /** + * Holds if the evaluation of this expression may produce observable side effects. + * + * Memory allocation is not considered an observable side effect. + */ + predicate mayHaveSideEffects() { + this.mayHaveOwnSideEffects() or this.getAChildExpr().mayHaveSideEffects() + } + + override string toString() { result = "expression" } +} + +/** + * A bad expression, that is, an expression that could not be parsed. + * + * Examples: + * + * ```go + * x + + * y < + * ``` + */ +class BadExpr extends @badexpr, Expr { + override string toString() { result = "bad expression" } + + override string getAPrimaryQlClass() { result = "BadExpr" } +} + +/** + * An identifier. + * + * Examples: + * + * ```go + * x + * ``` + */ +class Ident extends @ident, Expr { + /** Gets the name of this identifier. */ + string getName() { literals(this, result, _) } + + /** Holds if this identifier is a use of `e`. */ + predicate uses(Entity e) { uses(this, e) } + + /** Holds if this identifier is a definition or declaration of `e` */ + predicate declares(Entity e) { defs(this, e) } + + /** Holds if this identifier refers to (that is, uses, defines or declares) `e`. */ + predicate refersTo(Entity e) { this.uses(e) or this.declares(e) } + + override string toString() { result = this.getName() } + + override string getAPrimaryQlClass() { result = "Ident" } +} + +/** + * The blank identifier `_`. + * + * Examples: + * + * ```go + * _ + * ``` + */ +class BlankIdent extends Ident { + BlankIdent() { this.getName() = "_" } + + override string getAPrimaryQlClass() { result = "BlankIdent" } +} + +/** + * An ellipsis expression, representing either the `...` type in a parameter list or + * the `...` length in an array type. + * + * Examples: + * + * ```go + * ... + * ``` + */ +class Ellipsis extends @ellipsis, Expr { + /** Gets the operand of this ellipsis expression. */ + Expr getOperand() { result = this.getChildExpr(0) } + + override string toString() { result = "..." } + + override string getAPrimaryQlClass() { result = "Ellipsis" } +} + +/** + * A literal expression. + * + * Examples: + * + * ```go + * "hello" + * func(x, y int) int { return x + y } + * map[string]int{"A": 1, "B": 2} + * ``` + */ +class Literal extends Expr { + Literal() { + this instanceof @basiclit or this instanceof @funclit or this instanceof @compositelit + } +} + +/** + * A literal expression of basic type. + * + * Examples: + * + * ```go + * 1 + * "hello" + * ``` + */ +class BasicLit extends @basiclit, Literal { + /** Gets the value of this literal expressed as a string. */ + string getValue() { literals(this, result, _) } + + /** Gets the raw program text corresponding to this literal. */ + string getText() { literals(this, _, result) } + + override predicate isConst() { + // override to make sure literals are always considered constants even if we did not get + // information about constant values from the extractor (for example due to missing + // type information) + any() + } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = this.getText() } +} + +/** + * An integer literal. + * + * Examples: + * + * ```go + * 256 + * ``` + */ +class IntLit extends @intlit, BasicLit { + override string getAPrimaryQlClass() { result = "IntLit" } +} + +/** + * A floating-point literal. + * + * Examples: + * + * ```go + * 2.71828 + * ``` + */ +class FloatLit extends @floatlit, BasicLit { + override string getAPrimaryQlClass() { result = "FloatLit" } +} + +/** + * An imaginary literal. + * + * Examples: + * + * ```go + * 2i + * 2.7i + * ``` + */ +class ImagLit extends @imaglit, BasicLit { + override string getAPrimaryQlClass() { result = "ImagLit" } +} + +/** + * A rune literal. + * + * Examples: + * + * ```go + * 'a' + * 'ä' + * '本' + * '\377' + * '\xff' + * '\u12e4' + * '\U00101234' + * '\n' + * ``` + */ +class CharLit extends @charlit, BasicLit { + // use the constant value of the literal as the string value, as the value we get from the + // compiler is an integer, meaning we would not otherwise have a string value for rune literals + override string getStringValue() { result = this.getValue() } + + override string getAPrimaryQlClass() { result = "CharLit" } +} + +class RuneLit = CharLit; + +/** + * A string literal. + * + * Examples: + * + * ```go + * "hello world" + * ``` + */ +class StringLit extends @stringlit, BasicLit { + override string getAPrimaryQlClass() { result = "StringLit" } + + /** Holds if this string literal is a raw string literal. */ + predicate isRaw() { this.getText().matches("`%`") } +} + +/** + * A function literal. + * + * Examples: + * + * ```go + * func(x, y int) int { return x + y } + * ``` + */ +class FuncLit extends @funclit, Literal, StmtParent, FuncDef { + override FuncTypeExpr getTypeExpr() { result = this.getChildExpr(0) } + + override SignatureType getType() { result = Literal.super.getType() } + + /** Gets the body of this function literal. */ + override BlockStmt getBody() { result = this.getChildStmt(1) } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = "function literal" } + + override string getAPrimaryQlClass() { result = "FuncLit" } +} + +/** + * A composite literal + * + * Examples: + * + * ```go + * Point3D{0.5, -0.5, 0.5} + * map[string]int{"A": 1, "B": 2} + * ``` + */ +class CompositeLit extends @compositelit, Literal { + /** Gets the expression representing the type of this composite literal. */ + Expr getTypeExpr() { result = this.getChildExpr(0) } + + /** Gets the `i`th element of this composite literal (0-based). */ + Expr getElement(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** Gets an element of this composite literal. */ + Expr getAnElement() { result = this.getElement(_) } + + /** Gets the number of elements in this composite literal. */ + int getNumElement() { result = count(this.getAnElement()) } + + /** + * Gets the `i`th key expression in this literal. + * + * If the `i`th element of this literal has no key, this predicate is undefined for `i`. + */ + Expr getKey(int i) { result = this.getElement(i).(KeyValueExpr).getKey() } + + /** + * Gets the `i`th value expression in this literal. + */ + Expr getValue(int i) { + exists(Expr elt | elt = this.getElement(i) | + result = elt.(KeyValueExpr).getValue() + or + not elt instanceof KeyValueExpr and result = elt + ) + } + + override string toString() { result = "composite literal" } + + override string getAPrimaryQlClass() { result = "CompositeLit" } +} + +/** + * A map literal. + * + * Examples: + * + * ```go + * map[string]int{"A": 1, "B": 2} + * ``` + */ +class MapLit extends CompositeLit { + MapType mt; + + MapLit() { mt = this.getType().getUnderlyingType() } + + /** Gets the key type of this literal. */ + Type getKeyType() { result = mt.getKeyType() } + + /** Gets the value type of this literal. */ + Type getValueType() { result = mt.getValueType() } + + override string toString() { result = "map literal" } + + override string getAPrimaryQlClass() { result = "MapLit" } +} + +/** + * A struct literal. + * + * Examples: + * + * ```go + * Point3D{0.5, -0.5, 0.5} + * Point3D{y: 1} + * Point3D{} + * ``` + */ +class StructLit extends CompositeLit { + StructType st; + + StructLit() { st = this.getType().getUnderlyingType() } + + /** Gets the struct type underlying this literal. */ + StructType getStructType() { result = st } + + override string toString() { result = "struct literal" } + + override string getAPrimaryQlClass() { result = "StructLit" } +} + +/** + * An array or slice literal. + * + * Examples: + * + * ```go + * [10]string{} + * [6]int{1, 2, 3, 5} + * [...]string{"Sat", "Sun"} + * []int{1, 2, 3, 5} + * []string{"Sat", "Sun"} + * ``` + */ +class ArrayOrSliceLit extends CompositeLit { + CompositeType type; + + ArrayOrSliceLit() { + type = this.getType().getUnderlyingType() and + ( + type instanceof ArrayType + or + type instanceof SliceType + ) + } +} + +/** + * An array literal. + * + * Examples: + * + * ```go + * [10]string{} + * [6]int{1, 2, 3, 5} + * [...]string{"Sat", "Sun"} + * ``` + */ +class ArrayLit extends ArrayOrSliceLit { + override ArrayType type; + + /** Gets the array type underlying this literal. */ + ArrayType getArrayType() { result = type } + + override string toString() { result = "array literal" } + + override string getAPrimaryQlClass() { result = "ArrayLit" } +} + +/** + * A slice literal. + * + * Examples: + * + * ```go + * []int{1, 2, 3, 5} + * []string{"Sat", "Sun"} + * ``` + */ +class SliceLit extends ArrayOrSliceLit { + override SliceType type; + + /** Gets the slice type underlying this literal. */ + SliceType getSliceType() { result = type } + + override string toString() { result = "slice literal" } + + override string getAPrimaryQlClass() { result = "SliceLit" } +} + +/** + * A parenthesized expression. + * + * Examples: + * + * ```go + * (x + y) + * ``` + */ +class ParenExpr extends @parenexpr, Expr { + /** Gets the expression between parentheses. */ + Expr getExpr() { result = this.getChildExpr(0) } + + override Expr stripParens() { result = this.getExpr().stripParens() } + + override predicate isPlatformIndependentConstant() { + this.getExpr().isPlatformIndependentConstant() + } + + override string toString() { result = "(...)" } + + override string getAPrimaryQlClass() { result = "ParenExpr" } +} + +/** + * A selector expression, that is, a base expression followed by a selector. + * + * Examples: + * + * ```go + * x.f + * ``` + */ +class SelectorExpr extends @selectorexpr, Expr { + /** Gets the base of this selector expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + /** Gets the selector of this selector expression. */ + Ident getSelector() { result = this.getChildExpr(1) } + + /** Holds if this selector is a use of `e`. */ + predicate uses(Entity e) { this.getSelector().uses(e) } + + /** Holds if this selector is a definition of `e` */ + predicate declares(Entity e) { this.getSelector().declares(e) } + + /** Holds if this selector refers to (that is, uses, defines or declares) `e`. */ + predicate refersTo(Entity e) { this.getSelector().refersTo(e) } + + override predicate mayHaveOwnSideEffects() { any() } + + override string toString() { result = "selection of " + this.getSelector() } + + override string getAPrimaryQlClass() { result = "SelectorExpr" } +} + +/** + * A selector expression that refers to a promoted field or a promoted method. These + * selectors may implicitly address an embedded struct of their base type - for example, + * the selector `x.field` may implicitly address `x.Embedded.field`). Note they may also + * explicitly address `field`; being a `PromotedSelector` only indicates the addressed + * field or method may be promoted, not that it is promoted in this particular context. + */ +class PromotedSelector extends SelectorExpr { + PromotedSelector() { + exists(ValueEntity ve | this.refersTo(ve) | + ve instanceof PromotedField or ve instanceof PromotedMethod + ) + } + + /** + * Gets the underlying struct type of this selector's base. Note because this selector + * addresses a promoted field, the addressed field may not directly occur in the returned + * struct type. + */ + StructType getSelectedStructType() { + exists(Type baseType | baseType = this.getBase().getType().getUnderlyingType() | + pragma[only_bind_into](result) = + [baseType, baseType.(PointerType).getBaseType().getUnderlyingType()] + ) + } +} + +/** + * An index expression, that is, a base expression followed by an index. + * Expressions which represent generic type instantiations have been + * excluded. + * + * Examples: + * + * ```go + * array[i] + * arrayptr[i] + * slice[i] + * map[key] + * ``` + */ +class IndexExpr extends @indexexpr, Expr { + IndexExpr() { not isTypeExprBottomUp(this.getChildExpr(0)) } + + /** Gets the base of this index expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + /** Gets the index of this index expression. */ + Expr getIndex() { result = this.getChildExpr(1) } + + override predicate mayHaveOwnSideEffects() { any() } + + override string toString() { result = "index expression" } + + override string getAPrimaryQlClass() { result = "IndexExpr" } +} + +/** + * A generic function instantiation, that is, a base expression that represents + * a generic function, followed by a list of type arguments. + * + * Examples: + * + * ```go + * genericfunction[type] + * genericfunction[type1, type2] + * ``` + */ +class GenericFunctionInstantiationExpr extends @genericfunctioninstantiationexpr, Expr { + /** Gets the generic function expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + /** Gets the `i`th type argument. */ + Expr getTypeArgument(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + override predicate mayHaveOwnSideEffects() { any() } + + override string toString() { result = "generic function instantiation expression" } + + override string getAPrimaryQlClass() { result = "GenericFunctionInstantiationExpr" } +} + +/** + * A generic type instantiation, that is, a base expression that is a generic + * type followed by a list of type arguments. + * + * Examples: + * + * ```go + * generictype[type] + * generictype[type1, type2] + * ``` + */ +class GenericTypeInstantiationExpr extends Expr { + GenericTypeInstantiationExpr() { + this instanceof @generictypeinstantiationexpr + or + this instanceof @indexexpr and isTypeExprBottomUp(this.getChildExpr(0)) + } + + /** Gets the generic type expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + /** Gets the `i`th type argument. */ + Expr getTypeArgument(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + override predicate mayHaveOwnSideEffects() { any() } + + override string toString() { result = "generic type instantiation expression" } + + override string getAPrimaryQlClass() { result = "GenericTypeInstantiationExpr" } +} + +/** + * A slice expression, that is, a base expression followed by slice indices. + * + * Examples: + * + * ```go + * a[1:3] + * a[1:3:5] + * ``` + */ +class SliceExpr extends @sliceexpr, Expr { + /** Gets the base of this slice expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + /** Gets the lower bound of this slice expression. */ + Expr getLow() { result = this.getChildExpr(1) } + + /** Gets the upper bound of this slice expression. */ + Expr getHigh() { result = this.getChildExpr(2) } + + /** Gets the maximum of this slice expression, if any. */ + Expr getMax() { result = this.getChildExpr(3) } + + override string toString() { result = "slice expression" } + + override string getAPrimaryQlClass() { result = "SliceExpr" } +} + +/** + * A type assertion expression. + * + * Examples: + * + * ```go + * x.(T) + * ``` + */ +class TypeAssertExpr extends @typeassertexpr, Expr { + /** Gets the base expression whose type is being asserted. */ + Expr getExpr() { result = this.getChildExpr(0) } + + /** Gets the expression representing the asserted type. */ + Expr getTypeExpr() { result = this.getChildExpr(1) } + + override predicate mayHaveOwnSideEffects() { any() } + + override predicate isPlatformIndependentConstant() { + this.getExpr().isPlatformIndependentConstant() + } + + override string toString() { result = "type assertion" } + + override string getAPrimaryQlClass() { result = "TypeAssertExpr" } +} + +/** + * An expression that syntactically could either be a function call or a type + * conversion expression. + * + * In most cases, the subclasses `CallExpr` and `ConversionExpr` should be used + * instead. + * + * Examples: + * + * ```go + * f(x) + * g(a, b...) + * []byte("x") + * ``` + */ +class CallOrConversionExpr extends @callorconversionexpr, Expr { + override string getAPrimaryQlClass() { result = "CallOrConversionExpr" } +} + +/** + * A type conversion expression. + * + * Examples: + * + * ```go + * []byte("x") + * ``` + */ +class ConversionExpr extends CallOrConversionExpr { + ConversionExpr() { isTypeExprBottomUp(this.getChildExpr(0)) } + + /** Gets the type expression representing the target type of the conversion. */ + Expr getTypeExpr() { result = this.getChildExpr(0) } + + /** Gets the operand of the type conversion. */ + Expr getOperand() { result = this.getChildExpr(1) } + + override predicate isPlatformIndependentConstant() { + this.getOperand().isPlatformIndependentConstant() + } + + override string toString() { result = "type conversion" } + + override string getAPrimaryQlClass() { result = "ConversionExpr" } +} + +/** + * A function call expression. + * + * On snapshots with incomplete type information, type conversions may be misclassified + * as function call expressions. + * + * Examples: + * + * ```go + * f(x) + * g(a, b...) + * ``` + */ +class CallExpr extends CallOrConversionExpr { + CallExpr() { + exists(Expr callee | callee = this.getChildExpr(0) | not isTypeExprBottomUp(callee)) + or + // only calls can have an ellipsis after their last argument + has_ellipsis(this) + } + + /** Gets the expression representing the function being called. */ + Expr getCalleeExpr() { + if this.getChildExpr(0) instanceof GenericFunctionInstantiationExpr + then result = this.getChildExpr(0).(GenericFunctionInstantiationExpr).getBase() + else result = this.getChildExpr(0) + } + + /** Gets the `i`th argument expression of this call (0-based). */ + Expr getArgument(int i) { + i >= 0 and + result = this.getChildExpr(i + 1) + } + + /** Gets an argument expression of this call. */ + Expr getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of argument expressions of this call. */ + int getNumArgument() { result = count(this.getAnArgument()) } + + /** + * Gets the name of the invoked function, method or variable if it can be + * determined syntactically. + * + * Note that if a variable is being called then this gets the variable name + * rather than the name of the function or method that has been assigned to + * the variable. + */ + string getCalleeName() { + exists(Expr callee | callee = this.getCalleeExpr().stripParens() | + result = callee.(Ident).getName() + or + result = callee.(SelectorExpr).getSelector().getName() + ) + } + + /** Gets the declared target of this call. */ + Function getTarget() { this.getCalleeExpr() = result.getAReference() } + + /** Holds if this call has an ellipsis after its last argument. */ + predicate hasEllipsis() { has_ellipsis(this) } + + override predicate mayHaveOwnSideEffects() { + this.getTarget().mayHaveSideEffects() or + not exists(this.getTarget()) + } + + override string toString() { + result = "call to " + this.getCalleeName() + or + not exists(this.getCalleeName()) and + result = "function call" + } + + override string getAPrimaryQlClass() { result = "CallExpr" } +} + +/** + * A star expression. + * + * Examples: + * + * ```go + * *x + * ``` + */ +class StarExpr extends @starexpr, Expr { + /** Gets the base expression of this star expression. */ + Expr getBase() { result = this.getChildExpr(0) } + + override predicate mayHaveOwnSideEffects() { any() } + + override string toString() { result = "star expression" } + + override string getAPrimaryQlClass() { result = "StarExpr" } +} + +/** + * A key-value pair in a composite literal. + * + * Examples: + * + * ```go + * "A": 1 + * ``` + */ +class KeyValueExpr extends @keyvalueexpr, Expr { + /** Gets the key expression of this key-value pair. */ + Expr getKey() { result = this.getChildExpr(0) } + + /** Gets the value expression of this key-value pair. */ + Expr getValue() { result = this.getChildExpr(1) } + + /** Gets the composite literal to which this key-value pair belongs. */ + CompositeLit getLiteral() { this = result.getElement(_) } + + override string toString() { result = "key-value pair" } + + override string getAPrimaryQlClass() { result = "KeyValueExpr" } +} + +/** + * An expression representing an array type. + * + * Examples: + * + * ```go + * [5]int + * ``` + */ +class ArrayTypeExpr extends @arraytypeexpr, TypeExpr { + /** Gets the length expression of this array type. */ + Expr getLength() { result = this.getChildExpr(0) } + + /** Gets the expression representing the element type of this array type. */ + Expr getElement() { result = this.getChildExpr(1) } + + override string toString() { result = "array type" } + + override string getAPrimaryQlClass() { result = "ArrayTypeExpr" } +} + +/** + * An expression representing a struct type. + * + * Examples: + * + * ```go + * struct {x, y int; z float32} + * ``` + */ +class StructTypeExpr extends @structtypeexpr, TypeExpr, FieldParent { + override string toString() { result = "struct type" } + + override string getAPrimaryQlClass() { result = "StructTypeExpr" } +} + +/** + * An expression representing a function type. + * + * Examples: + * + * ```go + * func(a, b int, c float32) (float32, bool) + * ``` + */ +class FuncTypeExpr extends @functypeexpr, TypeExpr, ScopeNode, FieldParent { + /** Gets the `i`th parameter of this function type (0-based). */ + ParameterDecl getParameterDecl(int i) { result = this.getField(i) and i >= 0 } + + /** Gets a parameter of this function type. */ + ParameterDecl getAParameterDecl() { result = this.getParameterDecl(_) } + + /** Gets the number of parameters of this function type. */ + int getNumParameter() { result = count(this.getAParameterDecl()) } + + /** Gets the `i`th result of this function type (0-based). */ + ResultVariableDecl getResultDecl(int i) { result = this.getField(-(i + 1)) } + + /** Gets a result of this function type. */ + ResultVariableDecl getAResultDecl() { result = this.getResultDecl(_) } + + /** Gets the number of results of this function type. */ + int getNumResult() { result = count(this.getAResultDecl()) } + + /** Gets the result of this function type, if there is only one. */ + ResultVariableDecl getResultDecl() { this.getNumResult() = 1 and result = this.getAResultDecl() } + + override string toString() { result = "function type" } + + override string getAPrimaryQlClass() { result = "FuncTypeExpr" } + + /** Gets the `i`th child of this node, parameters first followed by results. */ + override AstNode getUniquelyNumberedChild(int i) { + if i < this.getNumParameter() + then result = this.getParameterDecl(i) + else result = this.getResultDecl(i - this.getNumParameter()) + } +} + +/** + * An expression representing an interface type. + * + * Examples: + * + * ```go + * interface { Read(p []byte) (n int, err error); Close() error} + * ``` + */ +class InterfaceTypeExpr extends @interfacetypeexpr, TypeExpr, FieldParent { + /** Gets the `i`th method specification of this interface type. */ + MethodSpec getMethod(int i) { result = this.getField(i) } + + /** Gets a method of this interface type. */ + MethodSpec getAMethod() { result = this.getMethod(_) } + + /** Gets the number of methods of this interface type. */ + int getNumMethod() { result = count(this.getAMethod()) } + + override string toString() { result = "interface type" } + + override string getAPrimaryQlClass() { result = "InterfaceTypeExpr" } +} + +/** + * An expression representing a map type. + * + * Examples: + * + * ```go + * map[string]int + * ``` + */ +class MapTypeExpr extends @maptypeexpr, TypeExpr { + /** Gets the expression representing the key type of this map type. */ + Expr getKeyTypeExpr() { result = this.getChildExpr(0) } + + /** Gets the key type of this map type. */ + Type getKeyType() { result = this.getKeyTypeExpr().getType() } + + /** Gets the expression representing the value type of this map type. */ + Expr getValueTypeExpr() { result = this.getChildExpr(1) } + + /** Gets the value type of this map type. */ + Type getValueType() { result = this.getValueTypeExpr().getType() } + + override string toString() { result = "map type" } + + override string getAPrimaryQlClass() { result = "MapTypeExpr" } +} + +/** + * An expression representing a type set literal. + * + * Examples: + * + * ```go + * ~string + * int64 | float64 + * ``` + */ +class TypeSetLiteralExpr extends @typesetliteralexpr, TypeExpr { + override string toString() { result = "type set literal" } + + override string getAPrimaryQlClass() { result = "TypeSetLiteralExpr" } +} + +/** + * An expression with a (unary or binary) operator. + * + * Examples: + * + * ```go + * a * b + * -c + * ``` + */ +class OperatorExpr extends @operatorexpr, Expr { + /** Gets the operator of this expression. */ + string getOperator() { none() } + + /** Gets an operand of this expression. */ + Expr getAnOperand() { none() } +} + +/** + * An expression with an arithmetic operator like `-` or `/`. + * + * Examples: + * + * ```go + * x - y + * u / v + * ``` + */ +class ArithmeticExpr extends @arithmeticexpr, OperatorExpr { } + +/** + * An expression with a logical operator like `!` or `&&`. + * + * Examples: + * + * ```go + * !a + * b && c + * ``` + */ +class LogicalExpr extends @logicalexpr, OperatorExpr { } + +/** + * An expression with a bitwise operator such as `^` or `|`. + * + * Examples: + * + * ```go + * x ^ y + * a | b + * ``` + */ +class BitwiseExpr extends @bitwiseexpr, OperatorExpr { } + +/** + * An expression with a unary operator. + * + * Examples: + * + * ```go + * +7 + * -2.5i + * !x + * ``` + */ +class UnaryExpr extends @unaryexpr, OperatorExpr { + /** Gets the operand of this unary expression. */ + Expr getOperand() { result = this.getChildExpr(0) } + + override Expr getAnOperand() { result = this.getOperand() } + + override predicate isPlatformIndependentConstant() { + this.getOperand().isPlatformIndependentConstant() + } + + override string toString() { result = this.getOperator() + "..." } +} + +/** + * An expression with a unary arithmetic operator, that is, unary `-` or `+`. + * + * Examples: + * + * ```go + * +7 + * -2.5i + * ``` + */ +class ArithmeticUnaryExpr extends @arithmeticunaryexpr, ArithmeticExpr, UnaryExpr { } + +/** + * An expression with a unary logical operator, that is, `!`. + * + * Examples: + * + * ```go + * !x + * ``` + */ +class LogicalUnaryExpr extends @logicalunaryexpr, LogicalExpr, UnaryExpr { } + +/** + * An expression with a unary bitwise operator, that is, `^`. + * + * Examples: + * + * ```go + * ^x + * ``` + */ +class BitwiseUnaryExpr extends @bitwiseunaryexpr, BitwiseExpr, UnaryExpr { } + +/** + * A unary plus expression using `+`. + * + * Examples: + * + * ```go + * +7 + * ``` + */ +class PlusExpr extends @plusexpr, ArithmeticUnaryExpr { + override string getOperator() { result = "+" } + + override string getAPrimaryQlClass() { result = "PlusExpr" } +} + +/** + * A unary minus expression using `-`. + * + * Examples: + * + * ```go + * -2.5i + * ``` + */ +class MinusExpr extends @minusexpr, ArithmeticUnaryExpr { + override string getOperator() { result = "-" } + + override string getAPrimaryQlClass() { result = "MinusExpr" } +} + +/** + * A unary "not" expression using `!`. + * + * Examples: + * + * ```go + * !x + * ``` + */ +class NotExpr extends @notexpr, LogicalUnaryExpr { + override string getOperator() { result = "!" } + + override string getAPrimaryQlClass() { result = "NotExpr" } +} + +/** + * A unary complement expression using `^`. + * + * Examples: + * + * ```go + * ^x + * ``` + */ +class ComplementExpr extends @complementexpr, BitwiseUnaryExpr { + override string getOperator() { result = "^" } + + override string getAPrimaryQlClass() { result = "ComplementExpr" } +} + +/** + * A unary pointer-dereference expression. + * + * This class exists for compatibility reasons only and should not normally be used directly. Use `StarExpr` instead. + */ +class DerefExpr extends @derefexpr, UnaryExpr { + override predicate mayHaveOwnSideEffects() { any() } + + override string getOperator() { result = "*" } + + override string getAPrimaryQlClass() { result = "DerefExpr" } +} + +/** + * A unary address-of expression using `&`. + * + * Examples: + * + * ```go + * &x + * ``` + */ +class AddressExpr extends @addressexpr, UnaryExpr { + override predicate mayHaveOwnSideEffects() { any() } + + override string getOperator() { result = "&" } + + override string getAPrimaryQlClass() { result = "AddressExpr" } +} + +/** + * A unary receive expression using `<-`. + * + * Examples: + * + * ```go + * <-chan + * ``` + */ +class RecvExpr extends @arrowexpr, UnaryExpr { + override predicate mayHaveOwnSideEffects() { any() } + + override string getOperator() { result = "<-" } + + override string getAPrimaryQlClass() { result = "RecvExpr" } +} + +/** + * A binary expression. + * + * Examples: + * + * ```go + * a * b + * a || b + * b != c + * ``` + */ +class BinaryExpr extends @binaryexpr, OperatorExpr { + /** Gets the left operand of this binary expression. */ + Expr getLeftOperand() { result = this.getChildExpr(0) } + + /** Gets the right operand of this binary expression. */ + Expr getRightOperand() { result = this.getChildExpr(1) } + + override Expr getAnOperand() { result = this.getChildExpr([0 .. 1]) } + + /** Holds if `e` and `f` (in either order) are the two operands of this binary expression. */ + predicate hasOperands(Expr e, Expr f) { + e = this.getAnOperand() and + f = this.getAnOperand() and + e != f + } + + override predicate isPlatformIndependentConstant() { + this.getLeftOperand().isPlatformIndependentConstant() and + this.getRightOperand().isPlatformIndependentConstant() + } + + override string toString() { result = "..." + this.getOperator() + "..." } +} + +/** + * A binary arithmetic expression, that is, `+`, `-`, `*`, `/` or `%`. + * + * Examples: + * + * ```go + * a * b + * ``` + */ +class ArithmeticBinaryExpr extends @arithmeticbinaryexpr, ArithmeticExpr, BinaryExpr { } + +/** + * A binary logical expression, that is, `&&` or `||`. + * + * Examples: + * + * ```go + * a || b + * ``` + */ +class LogicalBinaryExpr extends @logicalbinaryexpr, LogicalExpr, BinaryExpr { } + +/** + * A binary bitwise expression, that is, `<<`, `>>`, `|`, `^`, `&` or `&^`. + * + * Examples: + * + * ```go + * a << i + * b ^ c + * ``` + */ +class BitwiseBinaryExpr extends @bitwisebinaryexpr, BitwiseExpr, BinaryExpr { } + +/** + * A shift expression, that is, `<<` or `>>`. + * + * Examples: + * + * ```go + * a << i + * ``` + */ +class ShiftExpr extends @shiftexpr, BitwiseBinaryExpr { } + +/** + * A comparison expression, that is, `==`, `!=`, `<`, `<=`, `>=` or `>`. + * + * Examples: + * + * ```go + * a != b + * c > d + * ``` + */ +class ComparisonExpr extends @comparison, BinaryExpr { } + +/** + * An equality test, that is, `==` or `!=`. + * + * Examples: + * + * ```go + * a != b + * ``` + */ +class EqualityTestExpr extends @equalitytest, ComparisonExpr { + /** Gets the polarity of this equality test, that is, `true` for `==` and `false` for `!=`. */ + boolean getPolarity() { none() } +} + +/** + * A relational comparison, that is, `<`, `<=`, `>=` or `>`. + * + * Examples: + * + * ```go + * c > d + * ``` + */ +class RelationalComparisonExpr extends @relationalcomparison, ComparisonExpr { + /** Holds if this comparison is strict, that is, it implies inequality. */ + predicate isStrict() { none() } + + /** + * Gets the greater operand of this comparison, that is, the right operand for + * a `<` or `<=` comparison, and the left operand for `>=` or `>`. + */ + Expr getGreaterOperand() { none() } + + /** + * Gets the lesser operand of this comparison, that is, the left operand for + * a `<` or `<=` comparison, and the right operand for `>=` or `>`. + */ + Expr getLesserOperand() { none() } +} + +/** + * A logical-or expression using `||`. + * + * Examples: + * + * ```go + * a || b + * ``` + */ +class LorExpr extends @lorexpr, LogicalBinaryExpr { + override string getOperator() { result = "||" } + + override string getAPrimaryQlClass() { result = "LorExpr" } +} + +class LogOrExpr = LorExpr; + +/** + * A logical-and expression using `&&`. + * + * Examples: + * + * ```go + * a && b + * ``` + */ +class LandExpr extends @landexpr, LogicalBinaryExpr { + override string getOperator() { result = "&&" } + + override string getAPrimaryQlClass() { result = "LandExpr" } +} + +class LogAndExpr = LandExpr; + +/** + * An equality test using `==`. + * + * Examples: + * + * ```go + * a == b + * ``` + */ +class EqlExpr extends @eqlexpr, EqualityTestExpr { + override string getOperator() { result = "==" } + + override boolean getPolarity() { result = true } + + override string getAPrimaryQlClass() { result = "EqlExpr" } +} + +class EqExpr = EqlExpr; + +/** + * An inequality test using `!=`. + * + * Examples: + * + * ```go + * a != b + * ``` + */ +class NeqExpr extends @neqexpr, EqualityTestExpr { + override string getOperator() { result = "!=" } + + override boolean getPolarity() { result = false } + + override string getAPrimaryQlClass() { result = "NeqExpr" } +} + +/** + * A less-than test using `<`. + * + * Examples: + * + * ```go + * a < b + * ``` + */ +class LssExpr extends @lssexpr, RelationalComparisonExpr { + override string getOperator() { result = "<" } + + override predicate isStrict() { any() } + + override Expr getLesserOperand() { result = this.getLeftOperand() } + + override Expr getGreaterOperand() { result = this.getRightOperand() } + + override string getAPrimaryQlClass() { result = "LssExpr" } +} + +class LTExpr = LssExpr; + +/** + * A less-than-or-equal test using `<=`. + * + * Examples: + * + * ```go + * a <= b + * ``` + */ +class LeqExpr extends @leqexpr, RelationalComparisonExpr { + override string getOperator() { result = "<=" } + + override Expr getLesserOperand() { result = this.getLeftOperand() } + + override Expr getGreaterOperand() { result = this.getRightOperand() } + + override string getAPrimaryQlClass() { result = "LeqExpr" } +} + +class LEExpr = LeqExpr; + +/** + * A greater-than test using `>`. + * + * Examples: + * + * ```go + * a > b + * ``` + */ +class GtrExpr extends @gtrexpr, RelationalComparisonExpr { + override string getOperator() { result = ">" } + + override predicate isStrict() { any() } + + override Expr getLesserOperand() { result = this.getRightOperand() } + + override Expr getGreaterOperand() { result = this.getLeftOperand() } + + override string getAPrimaryQlClass() { result = "GtrExpr" } +} + +class GTExpr = GtrExpr; + +/** + * A greater-than-or-equal test using `>=`. + * + * Examples: + * + * ```go + * a >= b + * ``` + */ +class GeqExpr extends @geqexpr, RelationalComparisonExpr { + override string getOperator() { result = ">=" } + + override Expr getLesserOperand() { result = this.getRightOperand() } + + override Expr getGreaterOperand() { result = this.getLeftOperand() } + + override string getAPrimaryQlClass() { result = "GeqExpr" } +} + +class GEExpr = GeqExpr; + +/** + * An addition expression using `+`. + * + * Examples: + * + * ```go + * a + b + * ``` + */ +class AddExpr extends @addexpr, ArithmeticBinaryExpr { + override string getOperator() { result = "+" } + + override string getAPrimaryQlClass() { result = "AddExpr" } +} + +/** + * A subtraction expression using `-`. + * + * Examples: + * + * ```go + * a - b + * ``` + */ +class SubExpr extends @subexpr, ArithmeticBinaryExpr { + override string getOperator() { result = "-" } + + override string getAPrimaryQlClass() { result = "SubExpr" } +} + +/** + * A bitwise or expression using `|`. + * + * Examples: + * + * ```go + * a | b + * ``` + */ +class OrExpr extends @orexpr, BitwiseBinaryExpr { + override string getOperator() { result = "|" } + + override string getAPrimaryQlClass() { result = "OrExpr" } +} + +class BitOrExpr = OrExpr; + +/** + * An exclusive-or expression using `^`. + * + * Examples: + * + * ```go + * a ^ b + * ``` + */ +class XorExpr extends @xorexpr, BitwiseBinaryExpr { + override string getOperator() { result = "^" } + + override string getAPrimaryQlClass() { result = "XorExpr" } +} + +/** + * A multiplication expression using `*`. + * + * Examples: + * + * ```go + * a * b + * ``` + */ +class MulExpr extends @mulexpr, ArithmeticBinaryExpr { + override string getOperator() { result = "*" } + + override string getAPrimaryQlClass() { result = "MulExpr" } +} + +/** + * A divison or quotient expression using `/`. + * + * Examples: + * + * ```go + * a / b + * ``` + */ +class QuoExpr extends @quoexpr, ArithmeticBinaryExpr { + override predicate mayHaveOwnSideEffects() { any() } + + override string getOperator() { result = "/" } + + override string getAPrimaryQlClass() { result = "QuoExpr" } +} + +class DivExpr = QuoExpr; + +/** + * A remainder or modulo expression using `%`. + * + * Examples: + * + * ```go + * a % b + * ``` + */ +class RemExpr extends @remexpr, ArithmeticBinaryExpr { + override string getOperator() { result = "%" } + + override string getAPrimaryQlClass() { result = "RemExpr" } +} + +class ModExpr = RemExpr; + +/** + * A left-shift expression using `<<`. + * + * Examples: + * + * ```go + * a << i + * ``` + */ +class ShlExpr extends @shlexpr, ShiftExpr { + override string getOperator() { result = "<<" } + + override string getAPrimaryQlClass() { result = "ShlExpr" } +} + +class LShiftExpr = ShlExpr; + +/** + * A right-shift expression using `>>`. + * + * Examples: + * + * ```go + * a >> i + * ``` + */ +class ShrExpr extends @shrexpr, ShiftExpr { + override string getOperator() { result = ">>" } + + override string getAPrimaryQlClass() { result = "ShrExpr" } +} + +class RShiftExpr = ShrExpr; + +/** + * A bitwise and-expression using `&`. + * + * Examples: + * + * ```go + * a & b + * ``` + */ +class AndExpr extends @andexpr, BitwiseBinaryExpr { + override string getOperator() { result = "&" } + + override string getAPrimaryQlClass() { result = "AndExpr" } +} + +class BitAndExpr = AndExpr; + +/** + * A bitwise and-not expression using `&^`. + * + * Examples: + * + * ```go + * a &^ b + * ``` + */ +class AndNotExpr extends @andnotexpr, BitwiseBinaryExpr { + override string getOperator() { result = "&^" } + + override string getAPrimaryQlClass() { result = "AndNotExpr" } +} + +/** + * An expression representing a channel type. + * + * Examples: + * + * ```go + * chan float64 + * chan<- bool + * <-chan int + * ``` + */ +class ChanTypeExpr extends @chantypeexpr, TypeExpr { + /** + * Gets the expression representing the type of values flowing through the channel. + */ + Expr getValueTypeExpr() { result = this.getChildExpr(0) } + + /** Holds if this channel can send data. */ + predicate canSend() { none() } + + /** Holds if this channel can receive data. */ + predicate canReceive() { none() } + + override string toString() { result = "channel type" } + + override string getAPrimaryQlClass() { result = "ChanTypeExpr" } +} + +/** + * An expression representing a send-only channel type. + * + * Examples: + * + * ```go + * chan<- bool + * ``` + */ +class SendChanTypeExpr extends @sendchantypeexpr, ChanTypeExpr { + override predicate canSend() { any() } + + override string getAPrimaryQlClass() { result = "SendChanTypeExpr" } +} + +/** + * An expression representing a receive-only channel type. + * + * Examples: + * + * ```go + * <-chan int + * ``` + */ +class RecvChanTypeExpr extends @recvchantypeexpr, ChanTypeExpr { + override predicate canReceive() { any() } + + override string getAPrimaryQlClass() { result = "RecvChanTypeExpr" } +} + +/** + * An expression representing a duplex channel type that can both send and receive data. + * + * Examples: + * + * ```go + * chan float64 + * ``` + */ +class SendRecvChanTypeExpr extends @sendrcvchantypeexpr, ChanTypeExpr { + override predicate canSend() { any() } + + override predicate canReceive() { any() } + + override string getAPrimaryQlClass() { result = "SendRecvChanTypeExpr" } +} + +/** + * A (possibly qualified) name referring to a package, type, constant, variable, function or label. + * + * Examples: + * + * ```go + * Println + * fmt.Println + * fmt + * int + * T + * x + * Outerloop + * ``` + */ +class Name extends Expr { + Entity target; + + Name() { this.(Ident).refersTo(target) or this.(SelectorExpr).refersTo(target) } + + /** Gets the entity this name refers to. */ + Entity getTarget() { result = target } +} + +/** + * A simple (that is, unqualified) name. + * + * Examples: + * + * ```go + * Println + * ``` + */ +class SimpleName extends Name, Ident { } + +/** + * A qualified name. + * + * Examples: + * + * ```go + * fmt.Println + * ``` + */ +class QualifiedName extends Name, SelectorExpr { } + +/** + * A name referring to an imported package. + * + * Examples: + * + * ```go + * fmt + * ``` + */ +class PackageName extends Name { + override PackageEntity target; + + /** Gets the package this name refers to. */ + override PackageEntity getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "PackageName" } +} + +/** + * A name referring to a type. + * + * Examples: + * + * ```go + * int + * T + * ``` + */ +class TypeName extends Name { + override TypeEntity target; + + /** Gets the type this name refers to. */ + override TypeEntity getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "TypeName" } +} + +/** + * A name referring to a value, that is, a constant, variable or function. + * + * Examples: + * + * ```go + * c + * f + * x + * ``` + */ +class ValueName extends Name { + override ValueEntity target; + + /** Gets the constant, variable or function this name refers to. */ + override ValueEntity getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "ValueName" } +} + +/** + * A name referring to a constant. + * + * Examples: + * + * ```go + * c + * ``` + */ +class ConstantName extends ValueName { + override Constant target; + + /** Gets the constant this name refers to. */ + override Constant getTarget() { result = target } + + override predicate isPlatformIndependentConstant() { + target = Builtin::bool(_) + or + target = Builtin::iota() + or + target = Builtin::nil() + or + exists(DeclaredConstant c | c = target | + not c.getSpec().getFile().hasBuildConstraints() and + c.getInit().isPlatformIndependentConstant() + ) + } + + override string getAPrimaryQlClass() { result = "ConstantName" } +} + +/** + * A name referring to a variable. + * + * Examples: + * + * ```go + * x + * ``` + */ +class VariableName extends ValueName { + override Variable target; + + /** Gets the variable this name refers to. */ + override Variable getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "VariableName" } +} + +/** + * A name referring to a function. + * + * Examples: + * + * ```go + * f + * ``` + */ +class FunctionName extends ValueName { + override Function target; + + /** Gets the function this name refers to. */ + override Function getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "FunctionName" } +} + +/** + * A name referring to a statement label. + * + * Examples: + * + * ```go + * Outerloop + * ``` + */ +class LabelName extends Name { + override Label target; + + /** Gets the label this name refers to. */ + override Label getTarget() { result = target } + + override string getAPrimaryQlClass() { result = "LabelName" } +} + +/** + * Holds if `e` is a type expression, as determined by a bottom-up syntactic + * analysis starting with `TypeName`s. + * + * On a snapshot with full type information, this predicate covers all type + * expressions. However, if type information is missing then not all type names + * may be identified as such, so not all type expressions can be determined by + * a bottom-up analysis. In such cases, `isTypeExprTopDown` below is useful. + */ +private predicate isTypeExprBottomUp(Expr e) { + e instanceof TypeName + or + e instanceof @arraytypeexpr + or + e instanceof @structtypeexpr + or + e instanceof @functypeexpr + or + e instanceof @interfacetypeexpr + or + e instanceof @maptypeexpr + or + e instanceof @chantypeexpr + or + e instanceof @typesetliteralexpr + or + e instanceof @generictypeinstantiationexpr + or + e instanceof @indexexpr and isTypeExprBottomUp(e.getChildExpr(0)) + or + isTypeExprBottomUp(e.(ParenExpr).getExpr()) + or + isTypeExprBottomUp(e.(StarExpr).getBase()) + or + isTypeExprBottomUp(e.(Ellipsis).getOperand()) +} + +/** + * Holds if `e` must be a type expression because it either occurs in a syntactic + * position where a type is expected, or it is part of a larger type expression. + * + * This predicate is only needed on snapshots for which type information is + * incomplete. It is an underapproximation; in cases where it is syntactically ambiguous + * whether an expression refers to a type or a value, we conservatively assume that + * it may be the latter and so this predicate does not consider the expression to be + * a type expression. + */ +private predicate isTypeExprTopDown(Expr e) { + e = any(CompositeLit cl).getTypeExpr() + or + e = any(TypeAssertExpr ta).getTypeExpr() + or + e = any(ArrayTypeExpr ae).getElement() + or + e = any(FieldDecl f).getTypeExpr() + or + e = any(ParameterDecl pd).getTypeExpr() + or + e = any(TypeParamDecl tpd).getTypeConstraintExpr() + or + e = any(TypeParamDecl tpd).getNameExpr(_) + or + e = any(ReceiverDecl rd).getTypeExpr() + or + e = any(ResultVariableDecl rvd).getTypeExpr() + or + e = any(MethodSpec md).getTypeExpr() + or + e = any(MapTypeExpr mt).getKeyTypeExpr() + or + e = any(MapTypeExpr mt).getValueTypeExpr() + or + e = any(ChanTypeExpr ct).getValueTypeExpr() + or + e = any(ValueSpec s).getTypeExpr() + or + e = any(TypeSpec s).getTypeExpr() + or + e = any(GenericTypeInstantiationExpr gtie).getBase() + or + e = any(GenericTypeInstantiationExpr gtie).getTypeArgument(_) + or + e = any(TypeSwitchStmt s).getACase().getExpr(_) and + // special case: `nil` is allowed in a type case but isn't a type + not e = Builtin::nil().getAReference() + or + e = any(SelectorExpr sel | isTypeExprTopDown(sel)).getBase() + or + e = any(ParenExpr pe | isTypeExprTopDown(pe)).getExpr() + or + e = any(StarExpr se | isTypeExprTopDown(se)).getBase() + or + e = any(Ellipsis ell | isTypeExprTopDown(ell)).getOperand() +} + +/** + * An expression referring to a type. + * + * Examples: + * + * ```go + * int + * func + * ``` + */ +class TypeExpr extends Expr { + TypeExpr() { + isTypeExprBottomUp(this) or + isTypeExprTopDown(this) + } +} + +/** + * An expression referring to a memory location. + * + * Examples: + * + * ```go + * a[i] + * *p + * ``` + */ +class ReferenceExpr extends Expr { + ReferenceExpr() { + (this instanceof Ident or this instanceof SelectorExpr) and + not (this instanceof PackageName or this instanceof TypeName or this instanceof LabelName) and + not this instanceof TypeExpr and + not this = any(ImportSpec is).getNameExpr() and + not this = any(File f).getPackageNameExpr() and + not this = any(LabeledStmt ls).getLabelExpr() and + not this = any(BranchStmt bs).getLabelExpr() and + not this = any(FieldDecl f).getNameExpr(_) and + not this = any(ParameterDecl pd).getNameExpr(_) and + not this = any(ReceiverDecl rd).getNameExpr() and + not this = any(ResultVariableDecl rvd).getNameExpr(_) and + not this = any(MethodSpec md).getNameExpr() and + not this = any(StructLit sl).getKey(_) + or + this.(ParenExpr).getExpr() instanceof ReferenceExpr + or + this.(StarExpr).getBase() instanceof ReferenceExpr + or + this instanceof DerefExpr + or + this instanceof IndexExpr + } + + /** Holds if this reference expression occurs in a position where it is being assigned to. */ + predicate isLvalue() { + this = any(Assignment assgn).getLhs(_) + or + this = any(IncDecStmt ids).getOperand() + or + exists(RangeStmt rs | + this = rs.getKey() or + this = rs.getValue() + ) + or + exists(ValueSpec spec, int i | this = spec.getNameExpr(i)) + or + exists(FuncDecl fd | this = fd.getNameExpr()) + } + + /** Holds if this reference expression occurs in a position where it is evaluated to a value. */ + predicate isRvalue() { + not this.isLvalue() + or + this = any(CompoundAssignStmt cmp).getLhs(_) + or + this = any(IncDecStmt ids).getOperand() + } +} + +/** + * An expression that refers to a value (as opposed to a package, a type or a statement label). + * + * Examples: + * + * ```go + * x + y + * f(x) + * ``` + */ +class ValueExpr extends Expr { + ValueExpr() { + this.(ReferenceExpr).isRvalue() or + this instanceof BasicLit or + this instanceof FuncLit or + this instanceof CompositeLit or + this.(ParenExpr).getExpr() instanceof ValueExpr or + this instanceof SliceExpr or + this instanceof TypeAssertExpr or + this instanceof CallOrConversionExpr or + this.(StarExpr).getBase() instanceof ValueExpr or + this instanceof OperatorExpr + } +} diff --git a/go/ql/lib/semmle/go/Files.qll b/go/ql/lib/semmle/go/Files.qll new file mode 100644 index 00000000000..825b40f8b44 --- /dev/null +++ b/go/ql/lib/semmle/go/Files.qll @@ -0,0 +1,288 @@ +/** Provides classes for working with files and folders. */ + +import go + +/** A file or folder. */ +abstract class Container extends @container { + /** + * Gets the absolute, canonical path of this container, using forward slashes + * as path separator. + * + * The path starts with a _root prefix_ followed by zero or more _path + * segments_ separated by forward slashes. + * + * The root prefix is of one of the following forms: + * + * 1. A single forward slash `/` (Unix-style) + * 2. An upper-case drive letter followed by a colon and a forward slash, + * such as `C:/` (Windows-style) + * 3. Two forward slashes, a computer name, and then another forward slash, + * such as `//FileServer/` (UNC-style) + * + * Path segments are never empty (that is, absolute paths never contain two + * contiguous slashes, except as part of a UNC-style root prefix). Also, path + * segments never contain forward slashes, and no path segment is of the + * form `.` (one dot) or `..` (two dots). + * + * Note that an absolute path never ends with a forward slash, except if it is + * a bare root prefix, that is, the path has no path segments. A container + * whose absolute path has no segments is always a `Folder`, not a `File`. + */ + abstract string getAbsolutePath(); + + /** + * Gets a URL representing the location of this container. + * + * For more information see https://lgtm.com/help/ql/locations#providing-urls. + */ + abstract string getURL(); + + /** + * Gets the relative path of this file or folder from the root folder of the + * analyzed source location. The relative path of the root folder itself is + * the empty string. + * + * This has no result if the container is outside the source root, that is, + * if the root folder is not a reflexive, transitive parent of this container. + */ + string getRelativePath() { + exists(string absPath, string pref | + absPath = this.getAbsolutePath() and sourceLocationPrefix(pref) + | + absPath = pref and result = "" + or + absPath = pref.regexpReplaceAll("/$", "") + "/" + result and + not result.matches("/%") + ) + } + + /** + * Gets the base name of this container including extension, that is, the last + * segment of its absolute path, or the empty string if it has no segments. + * + * Here are some examples of absolute paths and the corresponding base names + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + * + *
    Absolute pathBase name
    "/tmp/tst.go""tst.go"
    "C:/Program Files (x86)""Program Files (x86)"
    "/"""
    "C:/"""
    "D:/"""
    "//FileServer/"""
    + */ + string getBaseName() { + result = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", 1) + } + + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathExtension
    "/tmp/tst.go""go"
    "/tmp/.classpath""classpath"
    "/bin/bash"not defined
    "/tmp/tst2."""
    "/tmp/x.tar.gz""gz"
    + */ + string getExtension() { + result = this.getAbsolutePath().regexpCapture(".*/([^/]*?)(\\.([^.]*))?", 3) + } + + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathStem
    "/tmp/tst.go""tst"
    "/tmp/.classpath"""
    "/bin/bash""bash"
    "/tmp/tst2.""tst2"
    "/tmp/x.tar.gz""x.tar"
    + */ + string getStem() { + result = this.getAbsolutePath().regexpCapture(".*/([^/]*?)(?:\\.([^.]*))?", 1) + } + + /** Gets the parent container of this file or folder, if any. */ + Container getParentContainer() { containerparent(result, this) } + + /** Gets a file or sub-folder in this container. */ + Container getAChildContainer() { this = result.getParentContainer() } + + /** Gets a file in this container. */ + File getAFile() { result = this.getAChildContainer() } + + /** Gets the file in this container that has the given `baseName`, if any. */ + File getFile(string baseName) { + result = this.getAFile() and + result.getBaseName() = baseName + } + + /** Gets a sub-folder in this container. */ + Folder getAFolder() { result = this.getAChildContainer() } + + /** Gets the sub-folder in this container that has the given `baseName`, if any. */ + Folder getFolder(string baseName) { + result = this.getAFolder() and + result.getBaseName() = baseName + } + + /** + * Gets a textual representation of the path of this container. + * + * This is the absolute path of the container. + */ + string toString() { result = this.getAbsolutePath() } +} + +/** A folder. */ +class Folder extends Container, @folder { + override string getAbsolutePath() { folders(this, result) } + + /** Gets the file or subfolder in this folder that has the given `name`, if any. */ + Container getChildContainer(string name) { + result = this.getAChildContainer() and + result.getBaseName() = name + } + + /** Gets the file in this folder that has the given `stem` and `extension`, if any. */ + File getFile(string stem, string extension) { + result = this.getAChildContainer() and + result.getStem() = stem and + result.getExtension() = extension + } + + /** Gets a subfolder contained in this folder. */ + Folder getASubFolder() { result = this.getAChildContainer() } + + /** Gets the URL of this folder. */ + override string getURL() { result = "folder://" + this.getAbsolutePath() } +} + +/** Any file, including files that have not been extracted but are referred to as locations for errors. */ +class ExtractedOrExternalFile extends Container, @file, Documentable, ExprParent, GoModExprParent, + DeclParent, ScopeNode { + override Location getLocation() { has_location(this, result) } + + override string getAbsolutePath() { files(this, result) } + + /** Gets the number of lines in this file. */ + int getNumberOfLines() { numlines(this, result, _, _) } + + /** Gets the number of lines containing code in this file. */ + int getNumberOfLinesOfCode() { numlines(this, _, result, _) } + + /** Gets the number of lines containing comments in this file. */ + int getNumberOfLinesOfComments() { numlines(this, _, _, result) } + + /** Gets the package name as specified in the package clause of this file. */ + Ident getPackageNameExpr() { result = this.getChildExpr(0) } + + /** Gets the name of the package to which this file belongs. */ + string getPackageName() { result = this.getPackageNameExpr().getName() } + + /** Holds if this file contains at least one build constraint. */ + pragma[noinline] + predicate hasBuildConstraints() { exists(BuildConstraintComment bc | this = bc.getFile()) } + + /** + * Holds if this file contains build constraints that ensure that it + * is only built on architectures of bit size `bitSize`, which can be + * 32 or 64. + */ + predicate constrainsIntBitSize(int bitSize) { + this.explicitlyConstrainsIntBitSize(bitSize) or + this.implicitlyConstrainsIntBitSize(bitSize) + } + + /** + * Holds if this file contains explicit build constraints that ensure + * that it is only built on an architecture of bit size `bitSize`, + * which can be 32 or 64. + */ + predicate explicitlyConstrainsIntBitSize(int bitSize) { + exists(BuildConstraintComment bcc | this = bcc.getFile() | + forex(string disjunct | disjunct = bcc.getADisjunct() | + disjunct.splitAt(",").(Architecture).getBitSize() = bitSize + or + disjunct.splitAt("/").(Architecture).getBitSize() = bitSize + ) + ) + } + + /** + * Holds if this file has a name which acts as an implicit build + * constraint that ensures that it is only built on an + * architecture of bit size `bitSize`, which can be 32 or 64. + */ + predicate implicitlyConstrainsIntBitSize(int bitSize) { + exists(Architecture arch | arch.getBitSize() = bitSize | + this.getStem().regexpMatch("(?i).*_\\Q" + arch + "\\E(_test)?") + ) + } + + override string toString() { result = Container.super.toString() } + + /** Gets the URL of this file. */ + override string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } + + /** Gets the `i`th child comment group. */ + CommentGroup getCommentGroup(int i) { comment_groups(result, this, i) } + + /** Gets a child comment group. */ + CommentGroup getACommentGroup() { result = this.getCommentGroup(_) } + + /** Gets the number of child comment groups of this file. */ + int getNumCommentGroups() { result = count(this.getACommentGroup()) } + + override string getAPrimaryQlClass() { result = "ExtractedOrExternalFile" } +} + +/** A file that has been extracted. */ +class File extends ExtractedOrExternalFile { + File() { + // getAChild is specifically for the Go AST and so does not apply to non-go files + // we care about all non-go extracted files, as only go files can have `@file` entries due to requiring a file entry for diagnostic errors + not this.getExtension() = "go" + or + exists(this.getAChild()) + } + + override string getAPrimaryQlClass() { result = "File" } +} + +/** A Go file. */ +class GoFile extends File { + GoFile() { this.getExtension() = "go" } + + override string getAPrimaryQlClass() { result = "GoFile" } +} + +/** An HTML file. */ +class HtmlFile extends File { + HtmlFile() { this.getExtension().regexpMatch("x?html?") } + + override string getAPrimaryQlClass() { result = "HtmlFile" } +} diff --git a/go/ql/lib/semmle/go/GoMod.qll b/go/ql/lib/semmle/go/GoMod.qll new file mode 100644 index 00000000000..119339c18eb --- /dev/null +++ b/go/ql/lib/semmle/go/GoMod.qll @@ -0,0 +1,231 @@ +/** + * Provides classes for working with go.mod files. + */ + +import go + +/** A go.mod file. */ +class GoModFile extends File { + GoModFile() { this.getBaseName() = "go.mod" } + + /** + * Gets the module declaration of this file, that is, the line declaring the path of this module. + */ + GoModModuleLine getModuleDeclaration() { result.getFile() = this } + + override string getAPrimaryQlClass() { result = "GoModFile" } +} + +/** + * An expression in a go.mod file, which is used to declare dependencies. + */ +class GoModExpr extends @modexpr, GoModExprParent { + /** + * Gets the kind of this expression, which is an integer value representing the expression's + * node type. + * + * Note that the mapping from node types to integer kinds is considered an implementation detail + * and subject to change without notice. + */ + int getKind() { modexprs(this, result, _, _) } + + /** + * Get the comment group associated with this expression. + */ + DocComment getComments() { result.getDocumentedElement() = this } + + override GoModFile getFile() { result = GoModExprParent.super.getFile() } + + /** Gets path of the module of this go.mod expression. */ + string getModulePath() { result = this.getFile().getModuleDeclaration().getPath() } + + override string toString() { result = "go.mod expression" } + + override string getAPrimaryQlClass() { result = "GoModExpr" } +} + +/** + * A top-level block of comments separate from any rule. + */ +class GoModCommentBlock extends @modcommentblock, GoModExpr { + override string getAPrimaryQlClass() { result = "GoModCommentBlock" } +} + +/** + * A single line of tokens. + */ +class GoModLine extends @modline, GoModExpr { + /** + * Gets the `i`th token on this line, 0-based. + * + * Generally, one should use `getToken`, as that accounts for lines inside of line blocks. + */ + string getRawToken(int i) { modtokens(result, this, i) } + + /** + * Gets the `i`th token of `line`, including the token in the line block declaration, if it there is + * one, 0-based. + * + * This compensates for the fact that lines in line blocks have their 0th token in the line block + * declaration, and makes dealing with lines more uniform. + * + * For example, `.getToken(1)` will result in the dependency path (`github.com/github/codeql-go`) + * for both lines for normal require lines like `require "github.com/github/codeql-go" v1.2.3` and + * in a line block like + * + * ``` + * require ( + * "github.com/github/codeql-go" v1.2.3 + * ... + * ) + * ``` + * + * As a special case, when `i` is `0` and the line is in a line block, the result will be the + * token from the line block. + */ + string getToken(int i) { + i = 0 and result = this.getParent().(GoModLineBlock).getRawToken(0) + or + if this.getParent() instanceof GoModLineBlock + then result = this.getRawToken(i - 1) + else result = this.getRawToken(i) + } + + override string toString() { result = "go.mod line" } + + override string getAPrimaryQlClass() { result = "GoModLine" } +} + +/** + * A factored block of lines, for example: + * ``` + * require ( + * "github.com/github/codeql-go" v1.2.3 + * "golang.org/x/tools" v3.2.1 + * ) + * ``` + */ +class GoModLineBlock extends @modlineblock, GoModExpr { + /** + * Gets the `i`th token of this line block, 0-based. + * + * Usually one should not have to use this, as `GoModLine.getToken(0)` will get the token from its + * parent line block, if any. + */ + string getRawToken(int i) { modtokens(result, this, i) } + + override string toString() { result = "go.mod line block" } + + override string getAPrimaryQlClass() { result = "GoModLineBlock" } +} + +/** + * A line that contains the module's package path, for example `module github.com/github/codeql-go`. + */ +class GoModModuleLine extends GoModLine { + GoModModuleLine() { this.getToken(0) = "module" } + + /** + * Get the path of the module being declared. + */ + string getPath() { result = this.getToken(1) } + + override string toString() { result = "go.mod module line" } + + override string getAPrimaryQlClass() { result = "GoModModuleLine" } +} + +/** + * A line that declares the Go version to be used, for example `go 1.14`. + */ +class GoModGoLine extends GoModLine { + GoModGoLine() { this.getToken(0) = "go" } + + /** Gets the Go version declared. */ + string getVersion() { result = this.getToken(1) } + + override string toString() { result = "go.mod go line" } + + override string getAPrimaryQlClass() { result = "GoModGoLine" } +} + +/** + * A line that declares a requirement, for example `require "github.com/github/codeql-go" v1.2.3`. + */ +class GoModRequireLine extends GoModLine { + GoModRequireLine() { this.getToken(0) = "require" } + + /** Gets the path of the dependency. */ + string getPath() { result = this.getToken(1) } + + /** Gets the version of the dependency. */ + string getVersion() { result = this.getToken(2) } + + override string toString() { result = "go.mod require line" } + + override string getAPrimaryQlClass() { result = "GoModRequireLine" } +} + +/** + * A line that declares a dependency version to exclude, for example + * `exclude "github.com/github/codeql-go" v1.2.3`. + */ +class GoModExcludeLine extends GoModLine { + GoModExcludeLine() { this.getToken(0) = "exclude" } + + /** Gets the path of the dependency to exclude a version of. */ + string getPath() { result = this.getToken(1) } + + /** Gets the excluded version. */ + string getVersion() { result = this.getToken(2) } + + override string toString() { result = "go.mod exclude line" } + + override string getAPrimaryQlClass() { result = "GoModExcludeLine" } +} + +/** + * A line that specifies a dependency to use instead of another one, for example + * `replace "golang.org/x/tools" => "github.com/golang/tools" v1.2.3`. + */ +class GoModReplaceLine extends GoModLine { + GoModReplaceLine() { this.getToken(0) = "replace" } + + /** Gets the path of the dependency to be replaced. */ + string getOriginalPath() { result = this.getToken(1) } + + /** Gets the path of the dependency to be replaced, if any. */ + string getOriginalVersion() { result = this.getToken(2) and not result = "=>" } + + /** Gets the path of the replacement dependency. */ + string getReplacementPath() { + if exists(this.getOriginalVersion()) + then result = this.getToken(4) + else result = this.getToken(3) + } + + /** Gets the version of the replacement dependency. */ + string getReplacementVersion() { + if exists(this.getOriginalVersion()) + then result = this.getToken(5) + else result = this.getToken(4) + } + + override string toString() { result = "go.mod replace line" } + + override string getAPrimaryQlClass() { result = "GoModReplaceLine" } +} + +/** A left parenthesis for a line block. */ +class GoModLParen extends @modlparen, GoModExpr { + override string toString() { result = "go.mod (" } + + override string getAPrimaryQlClass() { result = "GoModLParen" } +} + +/** A right parenthesis for a line block. */ +class GoModRParen extends @modrparen, GoModExpr { + override string toString() { result = "go.mod )" } + + override string getAPrimaryQlClass() { result = "GoModRParen" } +} diff --git a/go/ql/lib/semmle/go/HTML.qll b/go/ql/lib/semmle/go/HTML.qll new file mode 100644 index 00000000000..f4fb773ca8e --- /dev/null +++ b/go/ql/lib/semmle/go/HTML.qll @@ -0,0 +1,207 @@ +/** Provides classes for working with HTML documents. */ + +import go + +module HTML { + /** + * An HTML element. + * + * Example: + * + * ``` + * Semmle + * ``` + */ + class Element extends Locatable, @xmlelement { + Element() { exists(HtmlFile f | xmlElements(this, _, _, _, f)) } + + override Location getLocation() { xmllocations(this, result) } + + /** + * Gets the name of this HTML element. + * + * For example, the name of `
    ` is `br`. + */ + string getName() { xmlElements(this, result, _, _, _) } + + /** + * Gets the parent element of this element, if any. + */ + Element getParent() { xmlElements(this, _, result, _, _) } + + /** + * Holds if this is a toplevel element, that is, if it does not have a parent element. + */ + predicate isTopLevel() { not exists(getParent()) } + + /** + * Gets the root HTML document element in which this element is contained. + */ + DocumentElement getDocument() { result = getRoot() } + + /** + * Gets the root element in which this element is contained. + */ + Element getRoot() { if isTopLevel() then result = this else result = getParent().getRoot() } + + /** + * Gets the `i`th child element (0-based) of this element. + */ + Element getChild(int i) { xmlElements(result, _, this, i, _) } + + /** + * Gets a child element of this element. + */ + Element getChild() { result = getChild(_) } + + /** + * Gets the `i`th attribute (0-based) of this element. + */ + Attribute getAttribute(int i) { xmlAttrs(result, this, _, _, i, _) } + + /** + * Gets an attribute of this element. + */ + Attribute getAnAttribute() { result = getAttribute(_) } + + /** + * Gets an attribute of this element that has the given name. + */ + Attribute getAttributeByName(string name) { + result = getAnAttribute() and + result.getName() = name + } + + /** + * Gets the text node associated with this element. + */ + TextNode getTextNode() { result.getParent() = this } + + override string toString() { result = "<" + getName() + ">..." } + } + + /** + * An attribute of an HTML element. + * + * Examples: + * + * ``` + * + * target=_blank + * >Semmle + * ``` + */ + class Attribute extends Locatable, @xmlattribute { + Attribute() { xmlAttrs(this, _, _, _, _, any(HtmlFile f)) } + + override Location getLocation() { xmllocations(this, result) } + + /** + * Gets the element to which this attribute belongs. + */ + Element getElement() { xmlAttrs(this, result, _, _, _, _) } + + /** + * Gets the root element in which the element to which this attribute + * belongs is contained. + */ + Element getRoot() { result = getElement().getRoot() } + + /** + * Gets the name of this attribute. + */ + string getName() { xmlAttrs(this, _, result, _, _, _) } + + /** + * Gets the value of this attribute. + * + * For attributes without an explicitly specified value, the + * result is the empty string. + */ + string getValue() { xmlAttrs(this, _, _, result, _, _) } + + override string toString() { result = getName() + "=" + getValue() } + } + + /** + * An HTML `` element. + * + * Example: + * + * ``` + * + * + * This is a test. + * + * + * ``` + */ + class DocumentElement extends Element { + DocumentElement() { getName() = "html" } + } + + /** + * An HTML text node. + * + * Example: + * + * ``` + *
    + * This text is represented as a text node. + *
    + * ``` + */ + class TextNode extends Locatable, @xmlcharacters { + TextNode() { exists(HtmlFile f | xmlChars(this, _, _, _, _, f)) } + + override string toString() { result = getText() } + + /** + * Gets the content of this text node. + * + * Note that entity expansion has been performed already. + */ + string getText() { xmlChars(this, result, _, _, _, _) } + + /** + * Gets the parent this text. + */ + Element getParent() { xmlChars(this, _, result, _, _, _) } + + /** + * Gets the child index number of this text node. + */ + int getIndex() { xmlChars(this, _, _, result, _, _) } + + /** + * Holds if this text node is inside a `CDATA` tag. + */ + predicate isCData() { xmlChars(this, _, _, _, 1, _) } + + override Location getLocation() { xmllocations(this, result) } + } + + /** + * An HTML comment. + * + * Example: + * + * ``` + * + * ``` + */ + class CommentNode extends Locatable, @xmlcomment { + CommentNode() { exists(HtmlFile f | xmlComments(this, _, _, f)) } + + /** Gets the element in which this comment occurs. */ + Element getParent() { xmlComments(this, _, result, _) } + + /** Gets the text of this comment, not including delimiters. */ + string getText() { result = toString().regexpCapture("(?s)", 1) } + + override string toString() { xmlComments(this, result, _, _) } + + override Location getLocation() { xmllocations(this, result) } + } +} diff --git a/go/ql/lib/semmle/go/Locations.qll b/go/ql/lib/semmle/go/Locations.qll new file mode 100644 index 00000000000..4fb69be21c1 --- /dev/null +++ b/go/ql/lib/semmle/go/Locations.qll @@ -0,0 +1,81 @@ +/** Provides classes for working with locations and program elements that have locations. */ + +import go + +/** + * A location as given by a file, a start line, a start column, + * an end line, and an end column. + * + * For more information about locations see [LGTM locations](https://lgtm.com/help/ql/locations). + */ +class Location extends @location { + /** Gets the file for this location. */ + File getFile() { locations_default(this, result, _, _, _, _) } + + /** Gets the 1-based line number (inclusive) where this location starts. */ + int getStartLine() { locations_default(this, _, result, _, _, _) } + + /** Gets the 1-based column number (inclusive) where this location starts. */ + int getStartColumn() { locations_default(this, _, _, result, _, _) } + + /** Gets the 1-based line number (inclusive) where this location ends. */ + int getEndLine() { locations_default(this, _, _, _, result, _) } + + /** Gets the 1-based column number (inclusive) where this location ends. */ + int getEndColumn() { locations_default(this, _, _, _, _, result) } + + /** Gets the number of lines covered by this location. */ + int getNumLines() { result = getEndLine() - getStartLine() + 1 } + + /** Gets a textual representation of this element. */ + string toString() { + exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | + hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and + result = filepath + "@" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } + + /** + * 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`. + * For more information, see + * [LGTM locations](https://lgtm.com/help/ql/locations). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(File f | + locations_default(this, f, startline, startcolumn, endline, endcolumn) and + filepath = f.getAbsolutePath() + ) + } +} + +/** A program element with a location. */ +class Locatable extends @locatable { + /** Gets the file this program element comes from. */ + File getFile() { result = getLocation().getFile() } + + /** Gets this element's location. */ + Location getLocation() { has_location(this, result) } + + /** Gets the number of lines covered by this element. */ + int getNumLines() { result = getLocation().getNumLines() } + + /** + * 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`. + * For more information, see + * [LGTM locations](https://lgtm.com/help/ql/locations). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets a textual representation of this element. */ + string toString() { result = "locatable element" } +} diff --git a/go/ql/lib/semmle/go/Packages.qll b/go/ql/lib/semmle/go/Packages.qll new file mode 100644 index 00000000000..bc51911da27 --- /dev/null +++ b/go/ql/lib/semmle/go/Packages.qll @@ -0,0 +1,41 @@ +/** + * Provides classes for working with packages. + */ + +import go + +/** + * A package. + */ +class Package extends @package { + /** Gets the name of this package. */ + string getName() { packages(this, result, _, _) } + + /** Gets the path of this package. */ + string getPath() { + exists(string fullPath | packages(this, _, fullPath, _) | + result = fullPath.regexpReplaceAll("^.*/vendor/", "") + ) + } + + /** Gets the scope of this package. */ + PackageScope getScope() { packages(this, _, _, result) } + + /** Gets a textual representation of this element. */ + string toString() { result = "package " + getPath() } +} + +/** + * Gets an import path that identifies a package in module `mod` with the given path, + * possibly modulo [semantic import versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning). + * + * For example, `package("github.com/go-pg/pg", "types")` gets an import path that can + * refer to `"github.com/go-pg/pg/types"`, but also to `"github.com/go-pg/pg/v10/types"`. + */ +bindingset[mod, path] +string package(string mod, string path) { + // "\Q" and "\E" start and end a quoted section of a regular expression. Anything like "." or "*" that + // "*" that comes between them is not interpreted as it would normally be in a regular expression. + result.regexpMatch("\\Q" + mod + "\\E([/.]v[^/]+)?($|/)\\Q" + path + "\\E") and + result = any(Package p).getPath() +} diff --git a/go/ql/lib/semmle/go/PrintAst.ql b/go/ql/lib/semmle/go/PrintAst.ql new file mode 100644 index 00000000000..23b6b123b06 --- /dev/null +++ b/go/ql/lib/semmle/go/PrintAst.ql @@ -0,0 +1,20 @@ +/** + * @name Print AST + * @description Outputs a representation of the Abstract Syntax Tree. + * @id go/print-ast + * @kind graph + */ + +import go +import PrintAst + +/** + * Hook to customize the functions printed by this query. + */ +class Cfg extends PrintAstConfiguration { + override predicate shouldPrintFunction(FuncDecl func) { any() } + + override predicate shouldPrintFile(File file) { any() } + + override predicate shouldPrintComments(File file) { any() } +} diff --git a/go/ql/lib/semmle/go/PrintAst.qll b/go/ql/lib/semmle/go/PrintAst.qll new file mode 100644 index 00000000000..cf28be44f49 --- /dev/null +++ b/go/ql/lib/semmle/go/PrintAst.qll @@ -0,0 +1,271 @@ +/** + * Provides queries to pretty-print a Go AST as a graph. + */ + +import go + +/** + * Hook to customize the files and functions printed by this module. + * + * For an AstNode to be printed, it always requires `shouldPrintFile(f)` to hold + * for its containing file `f`, and additionally requires `shouldPrintFunction(fun)` + * to hold if it is, or is a child of, function `fun`. + */ +class PrintAstConfiguration extends string { + /** + * Restrict to a single string, making this a singleton type. + */ + PrintAstConfiguration() { this = "PrintAstConfiguration" } + + /** + * Holds if the AST for `func` should be printed. By default, holds for all + * functions. + */ + predicate shouldPrintFunction(FuncDecl func) { any() } + + /** + * Holds if the AST for `file` should be printed. By default, holds for all + * files. + */ + predicate shouldPrintFile(File file) { any() } + + /** + * Holds if the AST for `file` should include comments. By default, holds for all + * files. + */ + predicate shouldPrintComments(File file) { any() } +} + +private predicate shouldPrintFunction(FuncDef func) { + exists(PrintAstConfiguration config | config.shouldPrintFunction(func)) +} + +private predicate shouldPrintFile(File file) { + exists(PrintAstConfiguration config | config.shouldPrintFile(file)) +} + +private predicate shouldPrintComments(File file) { + exists(PrintAstConfiguration config | config.shouldPrintComments(file)) +} + +private FuncDecl getEnclosingFunctionDecl(AstNode n) { result = n.getParent*() } + +/** + * An AST node that should be printed. + */ +private newtype TPrintAstNode = + TAstNode(AstNode ast) { + shouldPrintFile(ast.getFile()) and + // Do print ast nodes without an enclosing function, e.g. file headers, that are not otherwise excluded + forall(FuncDecl f | f = getEnclosingFunctionDecl(ast) | shouldPrintFunction(f)) and + ( + shouldPrintComments(ast.getFile()) + or + not ast instanceof Comment and not ast instanceof CommentGroup + ) + } + +/** + * A node in the output tree. + */ +class PrintAstNode extends TPrintAstNode { + /** + * Gets a textual representation of this node. + */ + abstract string toString(); + + /** + * Gets the child node at index `childIndex`. Child indices must be unique, + * but need not be contiguous. + */ + abstract PrintAstNode getChild(int childIndex); + + /** + * Holds if this node should be printed in the output. By default, all nodes + * within a function are printed, but the query can override + * `PrintAstConfiguration.shouldPrintFunction` to filter the output. + */ + predicate shouldPrint() { exists(getLocation()) } + + /** + * Gets a child of this node. + */ + PrintAstNode getAChild() { result = getChild(_) } + + /** + * Gets the location of this node in the source code. + */ + abstract Location getLocation(); + + /** + * Gets the value of the property of this node, where the name of the property + * is `key`. + */ + string getProperty(string key) { + key = "semmle.label" and + result = toString() + } + + /** + * Gets the label for the edge from this node to the specified child. By + * default, this is just the index of the child, but subclasses can override + * this. + */ + string getChildEdgeLabel(int childIndex) { + exists(getChild(childIndex)) and + result = childIndex.toString() + } + + /** + * Gets the `FuncDef` that contains this node. + */ + abstract FuncDef getEnclosingFunction(); +} + +/** + * Gets a pretty-printed representation of the QL class(es) for entity `el`. + */ +private string qlClass(AstNode el) { + // This version shows all non-overridden QL classes: + // result = "[" + concat(el.getAQlClass(), ", ") + "] " + // Normally we prefer to show just the canonical class: + result = "[" + concat(el.getAPrimaryQlClass(), ", ") + "] " +} + +/** + * A graph node representing a real AST node. + */ +class BaseAstNode extends PrintAstNode, TAstNode { + AstNode ast; + + BaseAstNode() { this = TAstNode(ast) } + + override BaseAstNode getChild(int childIndex) { + // Note a node can have several results for getChild(n) because some + // nodes have multiple different types of child (e.g. a File has a + // child expression, the package name, and child declarations whose + // indices may clash), so we renumber them: + result = TAstNode(ast.getUniquelyNumberedChild(childIndex)) + } + + override string toString() { result = qlClass(ast) + ast } + + final override Location getLocation() { result = ast.getLocation() } + + final override FuncDef getEnclosingFunction() { + result = ast or result = ast.getEnclosingFunction() + } +} + +/** + * A node representing an `Expr`. + */ +class ExprNode extends BaseAstNode { + override Expr ast; + + override string getProperty(string key) { + result = super.getProperty(key) + or + key = "Value" and + result = qlClass(ast) + ast.getExactValue() + or + key = "Type" and + not ast.getType() instanceof InvalidType and + result = ast.getType().pp() + } +} + +/** + * A node representing a `File` + */ +class FileNode extends BaseAstNode { + override File ast; + + private string getRelativePath() { result = ast.getRelativePath() } + + private int getSortOrder() { + rank[result](FileNode fn | any() | fn order by fn.getRelativePath()) = this + } + + override string getProperty(string key) { + result = super.getProperty(key) + or + key = "semmle.order" and + result = getSortOrder().toString() + } + + /** + * Gets a child of this node, renumbering `packageNode`, our parent's + * `oldPackageIndex`th child, as the first child and moving others accordingly. + */ + private BaseAstNode getChildPackageFirst( + int childIndex, BaseAstNode packageNode, int oldPackageIndex + ) { + super.getChild(oldPackageIndex) = packageNode and + ( + childIndex = 0 and result = packageNode + or + result = + rank[childIndex](BaseAstNode node, int i | + node = super.getChild(i) and i != oldPackageIndex + | + node order by i + ) + ) + } + + /** + * Gets a child of this node, moving the package-name expression to the front + * of the list if one exists. + */ + override BaseAstNode getChild(int childIndex) { + if exists(ast.getPackageNameExpr()) + then result = getChildPackageFirst(childIndex, TAstNode(ast.getPackageNameExpr()), _) + else result = super.getChild(childIndex) + } + + /** + * Gets the label for the edge from this node to the specified child. The package name + * expression is named 'package'; others are numbered as per our parent's implementation + * of this method. + */ + override string getChildEdgeLabel(int childIndex) { + if getChild(childIndex) = TAstNode(ast.getPackageNameExpr()) + then result = "package" + else result = super.getChildEdgeLabel(childIndex) + } + + /** + * Gets the string representation of this File. Note explicitly using a relative path + * like this rather than absolute as per default for the File class is a workaround for + * a bug with codeql run test, which should replace absolute paths but currently does not. + */ + override string toString() { result = qlClass(ast) + ast.getRelativePath() } +} + +/** Holds if `node` belongs to the output tree, and its property `key` has the given `value`. */ +query predicate nodes(PrintAstNode node, string key, string value) { + node.shouldPrint() and + value = node.getProperty(key) +} + +/** + * Holds if `target` is a child of `source` in the AST, and property `key` of the edge has the + * given `value`. + */ +query predicate edges(PrintAstNode source, PrintAstNode target, string key, string value) { + exists(int childIndex | + source.shouldPrint() and + target.shouldPrint() and + target = source.getChild(childIndex) + | + key = "semmle.label" and value = source.getChildEdgeLabel(childIndex) + or + key = "semmle.order" and value = childIndex.toString() + ) +} + +/** Holds if property `key` of the graph has the given `value`. */ +query predicate graphProperties(string key, string value) { + key = "semmle.graphKind" and value = "tree" +} diff --git a/go/ql/lib/semmle/go/Scopes.qll b/go/ql/lib/semmle/go/Scopes.qll new file mode 100644 index 00000000000..02ead4b9468 --- /dev/null +++ b/go/ql/lib/semmle/go/Scopes.qll @@ -0,0 +1,818 @@ +/** + * Provides classes for working with scopes and declared objects. + */ + +import go + +/** + * A scope. + */ +class Scope extends @scope { + /** Gets the enclosing scope of this scope, if any. */ + Scope getOuterScope() { scopenesting(this, result) } + + /** Gets a scope nested inside this scope. */ + Scope getAnInnerScope() { this = result.getOuterScope() } + + /** Looks up the entity with the given name in this scope. */ + Entity getEntity(string name) { + result.getName() = name and + result.getScope() = this + } + + /** Gets a textual representation of this scope. */ + string toString() { result = "scope" } +} + +/** Provides helper predicates for working with scopes. */ +module Scope { + /** Gets the universe scope. */ + UniverseScope universe() { any() } +} + +/** + * The universe scope. + */ +class UniverseScope extends @universescope, Scope { + override string toString() { result = "universe scope" } +} + +/** A package scope. */ +class PackageScope extends @packagescope, Scope { + /** Gets the package whose scope this is. */ + Package getPackage() { this = result.getScope() } + + override string toString() { result = "package scope" } +} + +/** A local scope. */ +class LocalScope extends @localscope, Scope, Locatable { + /** Gets the AST node inducing this scope. */ + ScopeNode getNode() { this = result.getScope() } + + /** + * Gets the function scope in which this scope is nested. + * + * For function scopes, this is the scope itself. + */ + FunctionScope getEnclosingFunctionScope() { + result = this.getOuterScope().(LocalScope).getEnclosingFunctionScope() + } + + override string toString() { result = "local scope" } +} + +/** A local scope induced by a file. */ +class FileScope extends LocalScope { + FileScope() { this.getNode() instanceof File } +} + +/** A local scope induced by a function definition. */ +class FunctionScope extends LocalScope { + FuncDef f; + + FunctionScope() { this.getNode() = f.getTypeExpr() } + + /** Gets the function inducing this scope. */ + FuncDef getFunction() { result = f } + + override FunctionScope getEnclosingFunctionScope() { result = this } + + override string toString() { result = "function scope" } +} + +/** + * A declared or built-in entity (that is, package, type, constant, variable, function or label) + */ +class Entity extends @object { + /** + * Gets the name of this entity. + * + * Anonymous entities (such as the receiver variables of interface methods) have the empty string as their name. + */ + string getName() { objects(this, _, result) } + + /** Gets the package in which this entity is declared, if any. */ + Package getPackage() { result.getScope() = this.getScope() } + + /** Holds if this entity is declared in a package with path `pkg` and has the given `name`. */ + predicate hasQualifiedName(string pkg, string name) { + pkg = this.getPackage().getPath() and + name = this.getName() + } + + /** Gets the qualified name of this entity, if any. */ + string getQualifiedName() { + exists(string pkg, string name | this.hasQualifiedName(pkg, name) | result = pkg + "." + name) + } + + /** + * Gets the scope in which this entity is declared, if any. + * + * Entities corresponding to fields and methods do not have a scope. + */ + Scope getScope() { objectscopes(this, result) } + + /** Gets the declaring identifier for this entity. */ + Ident getDeclaration() { result.declares(this) } + + /** Gets a reference to this entity. */ + Name getAReference() { result.getTarget() = this } + + /** Gets the type of this entity. */ + Type getType() { objecttypes(this, result) } + + /** Gets a textual representation of this entity. */ + string toString() { result = this.getName() } + + /** + * 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`. + * For more information, see + * [LGTM locations](https://lgtm.com/help/ql/locations). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + // take the location of the declaration if there is one + this.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + // otherwise fall back on dummy location + not exists(this.getDeclaration()) and + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } +} + +/** A declared entity (that is, type, constant, variable or function). */ +class DeclaredEntity extends Entity, @declobject { + /** Gets the expression to which this entity is initialized, if any. */ + Expr getInit() { + exists(ValueSpec spec, int i | + spec.getNameExpr(i) = this.getDeclaration() and + spec.getInit(i) = result + ) + } +} + +/** A built-in entity (that is, type, constant or function). */ +class BuiltinEntity extends Entity, @builtinobject { } + +/** An imported package. */ +class PackageEntity extends Entity, @pkgobject { } + +/** A built-in or declared named type. */ +class TypeEntity extends Entity, @typeobject { } + +/** A declared named type. */ +class DeclaredType extends TypeEntity, DeclaredEntity, @decltypeobject { + /** Gets the declaration specifier declaring this type. */ + TypeSpec getSpec() { result.getNameExpr() = this.getDeclaration() } +} + +/** A built-in named type. */ +class BuiltinType extends TypeEntity, BuiltinEntity, @builtintypeobject { } + +/** A built-in or declared constant, variable, field, method or function. */ +class ValueEntity extends Entity, @valueobject { + /** Gets a data-flow node that reads the value of this entity. */ + Read getARead() { result.reads(this) } + + /** Gets a control-flow node that updates the value of this entity. */ + Write getAWrite() { result.writes(this, _) } +} + +/** A built-in or declared constant. */ +class Constant extends ValueEntity, @constobject { } + +/** A declared constant. */ +class DeclaredConstant extends Constant, DeclaredEntity, @declconstobject { + /** Gets the declaration specifier declaring this constant. */ + ValueSpec getSpec() { result.getANameExpr() = this.getDeclaration() } +} + +/** A built-in constant. */ +class BuiltinConstant extends Constant, BuiltinEntity, @builtinconstobject { } + +/** + * A built-in or declared variable. + * + * Note that Go currently does not have any built-in variables, so this class is effectively + * an alias for `DeclaredVariable`. + */ +class Variable extends ValueEntity, @varobject { } + +/** A declared variable. */ +class DeclaredVariable extends Variable, DeclaredEntity, @declvarobject { + /** Gets the declaration specifier declaring this variable. */ + ValueSpec getSpec() { result.getANameExpr() = this.getDeclaration() } +} + +/** A variable declared in a local scope (as opposed to a package scope or the universal scope). */ +class LocalVariable extends DeclaredVariable { + LocalVariable() { this.getScope() instanceof LocalScope } + + /** Gets the innermost function containing the scope of this variable, if any. */ + FuncDef getDeclaringFunction() { + result = this.getScope().(LocalScope).getEnclosingFunctionScope().getFunction() + } + + /** Holds if this variable is referenced inside a nested function. */ + predicate isCaptured() { + this.getDeclaringFunction() != this.getAReference().getEnclosingFunction() + } +} + +/** + * A (named) function parameter. + * + * Note that receiver variables are considered parameters. + */ +class Parameter extends DeclaredVariable { + FuncDef f; + int index; + + Parameter() { + f.(MethodDecl).getReceiverDecl().getNameExpr() = this.getDeclaration() and + index = -1 + or + exists(FuncTypeExpr tp | tp = f.getTypeExpr() | + this = + rank[index + 1](DeclaredVariable parm, int j, int k | + parm.getDeclaration() = tp.getParameterDecl(j).getNameExpr(k) + | + parm order by j, k + ) + ) + } + + /** Gets the function to which this parameter belongs. */ + FuncDef getFunction() { result = f } + + /** + * Gets the index of this parameter among all parameters of the function. + * + * The receiver is considered to have index -1. + */ + int getIndex() { result = index } + + /** Holds if this is the `i`th parameter of function `fd`. */ + predicate isParameterOf(FuncDef fd, int i) { fd = f and i = index } +} + +/** The receiver variable of a method. */ +class ReceiverVariable extends Parameter { + override MethodDecl f; + + ReceiverVariable() { index = -1 } + + /** Holds if this is the receiver variable of method `m`. */ + predicate isReceiverOf(MethodDecl m) { m = f } +} + +/** A (named) function result variable. */ +class ResultVariable extends DeclaredVariable { + FuncDef f; + int index; + + ResultVariable() { + exists(FuncTypeExpr tp | tp = f.getTypeExpr() | + this = + rank[index + 1](DeclaredVariable parm, int j, int k | + parm.getDeclaration() = tp.getResultDecl(j).getNameExpr(k) + | + parm order by j, k + ) + ) + } + + /** Gets the function to which this result variable belongs. */ + FuncDef getFunction() { result = f } + + /** Gets the index of this result among all results of the function. */ + int getIndex() { result = index } + + /** Holds if this is the `i`th result of function `fd`. */ + predicate isResultOf(FuncDef fd, int i) { fd = f and i = index } +} + +/** + * A struct field. + * + * Note that field identity is determined by type identity: if two struct types are identical in + * the sense of the Go language specification (https://golang.org/ref/spec#Type_identity), then + * any of their fields that have the same name are also identical. This, in turn, means that a + * field can have two or more declarations. + * + * For example, consider the following two type declarations: + * + * ```go + * type T1 struct { x int } + * type T2 struct { x int } + * ``` + * + * Types `T1` and `T2` are different, but their underlying struct types are identical. Hence + * the two declarations of `x` refer to the same field. + */ +class Field extends Variable { + StructType declaringType; + + Field() { fieldstructs(this, declaringType) } + + /** Gets the struct type declaring this field. */ + StructType getDeclaringType() { result = declaringType } + + override Package getPackage() { + exists(Type tp | tp.getUnderlyingType() = declaringType | result = tp.getPackage()) + } + + /** + * Holds if this field has name `f` and it belongs to a type with qualified name `tp`. + * + * Note that due to field embedding the same field may have multiple qualified names. + */ + override predicate hasQualifiedName(string tp, string f) { + exists(Type base | + tp = base.getQualifiedName() and + this = base.getField(f) + ) + } + + /** + * Holds if this field has name `f` and it belongs to a type `tp` declared in package `pkg`. + * + * Note that due to field embedding the same field may belong to multiple types. + */ + predicate hasQualifiedName(string pkg, string tp, string f) { + exists(Type base | + base.hasQualifiedName(pkg, tp) and + this = base.getField(f) + ) + } +} + +/** + * A field that belongs to a struct that may be embedded within another struct. + * + * When a selector addresses such a field, it is possible it is implicitly addressing a nested struct. + */ +class PromotedField extends Field { + PromotedField() { this = any(StructType t).getFieldOfEmbedded(_, _, _, _) } +} + +/** A built-in or declared function. */ +class Function extends ValueEntity, @functionobject { + /** + * Gets a call to this function. + * + * This includes calls that target this function indirectly, by calling an + * interface method that this function implements. + */ + pragma[nomagic] + DataFlow::CallNode getACall() { this = result.getACalleeIncludingExternals().asFunction() } + + /** Gets the declaration of this function, if any. */ + FuncDecl getFuncDecl() { none() } + + /** Holds if this function is variadic. */ + predicate isVariadic() { none() } + + /** Holds if this function has no observable side effects. */ + predicate mayHaveSideEffects() { none() } + + /** + * Holds if this function may return without panicking, exiting the process, or looping forever. + * + * This predicate is an over-approximation: it may hold for functions that can never + * return normally, but it never fails to hold for functions that can. + * + * Note this is declared here and not in `DeclaredFunction` so that library models can override this + * by extending `Function` rather than having to remember to extend `DeclaredFunction`. + */ + predicate mayReturnNormally() { + not this.mustPanic() and + (ControlFlow::mayReturnNormally(this.getFuncDecl()) or not exists(this.getBody())) + } + + /** + * Holds if calling this function may cause a runtime panic. + * + * This predicate is an over-approximation: it may hold for functions that can never + * cause a runtime panic, but it never fails to hold for functions that can. + */ + predicate mayPanic() { any() } + + /** + * Holds if calling this function always causes a runtime panic. + * + * This predicate is an over-approximation: it may not hold for functions that do + * cause a runtime panic, but it never holds for functions that do not. + */ + predicate mustPanic() { none() } + + /** Gets the number of parameters of this function. */ + int getNumParameter() { result = this.getType().(SignatureType).getNumParameter() } + + /** Gets the type of the `i`th parameter of this function. */ + Type getParameterType(int i) { result = this.getType().(SignatureType).getParameterType(i) } + + /** Gets the number of results of this function. */ + int getNumResult() { result = this.getType().(SignatureType).getNumResult() } + + /** Gets the type of the `i`th result of this function. */ + Type getResultType(int i) { result = this.getType().(SignatureType).getResultType(i) } + + /** Gets the body of this function, if any. */ + BlockStmt getBody() { result = this.getFuncDecl().getBody() } + + /** Gets the `i`th parameter of this function. */ + Parameter getParameter(int i) { result.isParameterOf(this.getFuncDecl(), i) } + + /** Gets a parameter of this function. */ + Parameter getAParameter() { result = this.getParameter(_) } + + /** Gets the `i`th reslt variable of this function. */ + ResultVariable getResult(int i) { result.isResultOf(this.getFuncDecl(), i) } + + /** Gets a result variable of this function. */ + ResultVariable getAResult() { result = this.getResult(_) } +} + +/** + * A method, that is, a function with a receiver variable, or a function declared in an interface. + * + * Note that method identity is determined by receiver type identity: if two methods have the same + * name and their receiver types are identical in the sense of the Go language specification + * (https://golang.org/ref/spec#Type_identity), then the two methods are identical as well. + */ +class Method extends Function { + Variable receiver; + + Method() { methodreceivers(this, receiver) } + + override Package getPackage() { + // a method doesn't have a scope, so manually associate it with its receiver's + // package. + result = this.getReceiverType().getPackage() + } + + /** Holds if this method is declared in an interface. */ + predicate isInterfaceMethod() { + this.getReceiverType().getUnderlyingType() instanceof InterfaceType + } + + /** Gets the receiver variable of this method. */ + Variable getReceiver() { result = receiver } + + /** Gets the type of the receiver variable of this method. */ + Type getReceiverType() { result = receiver.getType() } + + /** + * Gets the receiver base type of this method, that is, either the base type of the receiver type + * if it is a pointer type, or the receiver type itself if it is not a pointer type. + */ + Type getReceiverBaseType() { + exists(Type recv | recv = this.getReceiverType() | + if recv instanceof PointerType + then result = recv.(PointerType).getBaseType() + else result = recv + ) + } + + /** Holds if this method has name `m` and belongs to the method set of type `tp` or `*tp`. */ + private predicate isIn(NamedType tp, string m) { + this = tp.getMethod(m) or + this = tp.getPointerType().getMethod(m) + } + + /** + * Holds if this method has name `m` and belongs to the method set of a type `T` or `*T` where + * `T` has qualified name `tp`. + * + * Note that `meth.hasQualifiedName(tp, m)` is almost, but not quite, equivalent to + * `exists(Type t | tp = t.getQualifiedName() and meth = t.getMethod(m))`: the latter + * distinguishes between the method sets of `T` and `*T`, while the former does not. + */ + override predicate hasQualifiedName(string tp, string m) { + exists(NamedType t | + this.isIn(t, m) and + tp = t.getQualifiedName() + ) + } + + /** + * Holds if this method has name `m` and belongs to the method set of a type `T` or `*T` where + * `T` is declared in package `pkg` and has name `tp`. + * + * Note that `meth.hasQualifiedName(pkg, tp, m)` is almost, but not quite, equivalent to + * `exists(Type t | t.hasQualifiedName(pkg, tp) and meth = t.getMethod(m))`: the latter + * distinguishes between the method sets of `T` and `*T`, while the former does not. + */ + predicate hasQualifiedName(string pkg, string tp, string m) { + exists(NamedType t | + this.isIn(t, m) and + t.hasQualifiedName(pkg, tp) + ) + } + + /** + * Holds if this method implements the method `m`, that is, if `m` is a method + * on an interface, and this is a method with the same name on a type that + * implements that interface. + * + * Note that all methods implement themselves, and interface methods _only_ + * implement themselves. + */ + predicate implements(Method m) { + this = m + or + not this.isInterfaceMethod() and + exists(Type t | + this = t.getMethod(m.getName()) and + t.implements(m.getReceiverType().getUnderlyingType()) + ) + } + + /** + * Holds if this method implements the method that has qualified name `pkg.tp.name`, that is, if + * `pkg.tp.name` is a method on an interface, and this is a method with the same name on a type + * that implements that interface. + */ + predicate implements(string pkg, string tp, string name) { + exists(Method m | m.hasQualifiedName(pkg, tp, name) | this.implements(m)) + } +} + +/** + * A method whose receiver may be embedded within a struct. + * + * When a selector addresses such a method, it is possible it is implicitly addressing a nested struct. + */ +class PromotedMethod extends Method { + PromotedMethod() { this = any(StructType t).getMethodOfEmbedded(_, _, _) } +} + +/** A declared function. */ +class DeclaredFunction extends Function, DeclaredEntity, @declfunctionobject { + override FuncDecl getFuncDecl() { result.getNameExpr() = this.getDeclaration() } + + override predicate mayHaveSideEffects() { + not exists(this.getBody()) + or + exists(BlockStmt body | body = this.getBody() | + body.mayHaveSideEffects() + or + // functions declared in files with build constraints may be defined differently + // for different platforms, so allow them to avoid false positives + body.getFile().hasBuildConstraints() + ) + } + + override predicate isVariadic() { this.getType().(SignatureType).isVariadic() } +} + +/** A built-in function. */ +class BuiltinFunction extends Function, BuiltinEntity, @builtinfunctionobject { + override predicate mayHaveSideEffects() { builtinFunction(this.getName(), false, _, _, _) } + + override predicate mayPanic() { builtinFunction(this.getName(), _, true, _, _) } + + override predicate mustPanic() { builtinFunction(this.getName(), _, _, true, _) } + + override predicate isVariadic() { builtinFunction(this.getName(), _, _, _, true) } + + /** + * Holds if this function is pure, that is, it has no observable side effects and + * no non-determinism. + */ + predicate isPure() { not this.mayHaveSideEffects() } +} + +private newtype TCallable = + TFunctionCallable(Function f) or + TFuncLitCallable(FuncLit l) + +/** + * This is either a `Function` or a `FuncLit`, because of limitations of both + * `Function` and `FuncDef`: + * - `Function` is an entity, and therefore does not include function literals, and + * - `FuncDef` is an AST node, and so is not extracted for functions from external libraries. + */ +class Callable extends TCallable { + /** Gets a textual representation of this callable. */ + string toString() { result = [this.asFunction().toString(), this.asFuncLit().toString()] } + + /** Gets this callable as a function, if it is one. */ + Function asFunction() { this = TFunctionCallable(result) } + + /** Gets this callable as a function literal, if it is one. */ + FuncLit asFuncLit() { this = TFuncLitCallable(result) } + + /** Gets this function's definition, if it exists. */ + FuncDef getFuncDef() { result = [this.asFuncLit().(FuncDef), this.asFunction().getFuncDecl()] } + + /** Gets the type of this callable. */ + SignatureType getType() { + result = this.asFunction().getType() or + result = this.asFuncLit().getType() + } + + /** Gets the name of this callable. */ + string getName() { + result = this.asFunction().getName() or + result = this.asFuncLit().getName() + } + + /** + * Holds if this element is at the specified location. + * The location spans column `sc` of line `sl` to + * column `ec` of line `el` in file `fp`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ + predicate hasLocationInfo(string fp, int sl, int sc, int el, int ec) { + this.asFunction().hasLocationInfo(fp, sl, sc, el, ec) or + this.asFuncLit().hasLocationInfo(fp, sl, sc, el, ec) + } +} + +/** A statement label. */ +class Label extends Entity, @labelobject { } + +/** + * Holds if `name` is a built-in function, where + * + * - `pure` is true if the function has no observable side effects, and false otherwise; + * - `mayPanic` is true if calling this function may cause a panic, and false otherwise; + * - `mustPanic` is true if calling this function always causes a panic, and false otherwise; + * - `variadic` is true if this function is variadic, and false otherwise. + * + * Allocating memory is not considered an observable side effect. + */ +private predicate builtinFunction( + string name, boolean pure, boolean mayPanic, boolean mustPanic, boolean variadic +) { + name = "append" and pure = false and mayPanic = false and mustPanic = false and variadic = true + or + name = "cap" and pure = true and mayPanic = false and mustPanic = false and variadic = false + or + name = "close" and pure = false and mayPanic = true and mustPanic = false and variadic = false + or + name = "complex" and pure = true and mayPanic = true and mustPanic = false and variadic = false + or + name = "copy" and pure = false and mayPanic = true and mustPanic = false and variadic = false + or + name = "delete" and pure = false and mayPanic = false and mustPanic = false and variadic = false + or + name = "imag" and pure = true and mayPanic = false and mustPanic = false and variadic = false + or + name = "len" and pure = true and mayPanic = false and mustPanic = false and variadic = false + or + name = "make" and pure = true and mayPanic = true and mustPanic = false and variadic = true + or + name = "new" and pure = true and mayPanic = false and mustPanic = false and variadic = false + or + name = "panic" and pure = false and mayPanic = true and mustPanic = true and variadic = false + or + name = "print" and pure = false and mayPanic = false and mustPanic = false and variadic = true + or + name = "println" and pure = false and mayPanic = false and mustPanic = false and variadic = true + or + name = "real" and pure = true and mayPanic = false and mustPanic = false and variadic = false + or + name = "recover" and pure = false and mayPanic = false and mustPanic = false and variadic = false +} + +/** Provides helper predicates for working with built-in objects from the universe scope. */ +module Builtin { + // built-in types + /** Gets the built-in type `bool`. */ + BuiltinType bool() { result.getName() = "bool" } + + /** Gets the built-in type `byte`. */ + BuiltinType byte() { result.getName() = "byte" } + + /** Gets the built-in type `complex64`. */ + BuiltinType complex64() { result.getName() = "complex64" } + + /** Gets the built-in type `complex128`. */ + BuiltinType complex128() { result.getName() = "complex128" } + + /** Gets the built-in type `error`. */ + BuiltinType error() { result.getName() = "error" } + + /** Gets the built-in type `float32`. */ + BuiltinType float32() { result.getName() = "float32" } + + /** Gets the built-in type `float64`. */ + BuiltinType float64() { result.getName() = "float64" } + + /** Gets the built-in type `int`. */ + BuiltinType int_() { result.getName() = "int" } + + /** Gets the built-in type `int8`. */ + BuiltinType int8() { result.getName() = "int8" } + + /** Gets the built-in type `int16`. */ + BuiltinType int16() { result.getName() = "int16" } + + /** Gets the built-in type `int32`. */ + BuiltinType int32() { result.getName() = "int32" } + + /** Gets the built-in type `int64`. */ + BuiltinType int64() { result.getName() = "int64" } + + /** Gets the built-in type `rune`. */ + BuiltinType rune() { result.getName() = "rune" } + + /** Gets the built-in type `string`. */ + BuiltinType string_() { result.getName() = "string" } + + /** Gets the built-in type `uint`. */ + BuiltinType uint() { result.getName() = "uint" } + + /** Gets the built-in type `uint8`. */ + BuiltinType uint8() { result.getName() = "uint8" } + + /** Gets the built-in type `uint16`. */ + BuiltinType uint16() { result.getName() = "uint16" } + + /** Gets the built-in type `uint32`. */ + BuiltinType uint32() { result.getName() = "uint32" } + + /** Gets the built-in type `uint64`. */ + BuiltinType uint64() { result.getName() = "uint64" } + + /** Gets the built-in type `uintptr`. */ + BuiltinType uintptr() { result.getName() = "uintptr" } + + // built-in constants + /** Gets the built-in constant `true`. */ + BuiltinConstant true_() { result.getName() = "true" } + + /** Gets the built-in constant `false`. */ + BuiltinConstant false_() { result.getName() = "false" } + + /** Gets the built-in constant corresponding to `b`. */ + BuiltinConstant bool(boolean b) { + b = true and result = true_() + or + b = false and result = false_() + } + + /** Gets the built-in constant `iota`. */ + BuiltinConstant iota() { result.getName() = "iota" } + + // built-in zero value + /** Gets the built-in zero-value `nil`. */ + BuiltinConstant nil() { result.getName() = "nil" } + + /** Gets the built-in function `append`. */ + BuiltinFunction append() { result.getName() = "append" } + + /** Gets the built-in function `cap`. */ + BuiltinFunction cap() { result.getName() = "cap" } + + /** Gets the built-in function `close`. */ + BuiltinFunction close() { result.getName() = "close" } + + /** Gets the built-in function `complex`. */ + BuiltinFunction complex() { result.getName() = "complex" } + + /** Gets the built-in function `copy`. */ + BuiltinFunction copy() { result.getName() = "copy" } + + /** Gets the built-in function `delete`. */ + BuiltinFunction delete() { result.getName() = "delete" } + + /** Gets the built-in function `imag`. */ + BuiltinFunction imag() { result.getName() = "imag" } + + /** Gets the built-in function `len`. */ + BuiltinFunction len() { result.getName() = "len" } + + /** Gets the built-in function `make`. */ + BuiltinFunction make() { result.getName() = "make" } + + /** Gets the built-in function `new`. */ + BuiltinFunction new() { result.getName() = "new" } + + /** Gets the built-in function `panic`. */ + BuiltinFunction panic() { result.getName() = "panic" } + + /** Gets the built-in function `print`. */ + BuiltinFunction print() { result.getName() = "print" } + + /** Gets the built-in function `println`. */ + BuiltinFunction println() { result.getName() = "println" } + + /** Gets the built-in function `real`. */ + BuiltinFunction real() { result.getName() = "real" } + + /** Gets the built-in function `recover`. */ + BuiltinFunction recover() { result.getName() = "recover" } +} diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll new file mode 100644 index 00000000000..9873bf1db17 --- /dev/null +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -0,0 +1,1135 @@ +/** + * Provides classes for working with statements. + */ + +import go + +/** + * A statement. + * + * Examples: + * + * ```go + * a = 0 + * + * if x := f(); x < y { + * return y - x + * } else { + * return x - y + * } + * ``` + */ +class Stmt extends @stmt, ExprParent, StmtParent { + /** + * Gets the kind of this statement, which is an integer value representing the statement's + * node type. + * + * Note that the mapping from node types to integer kinds is considered an implementation detail + * and subject to change without notice. + */ + int getKind() { stmts(this, result, _, _) } + + /** + * Holds if the execution of this statement may produce observable side effects. + * + * Memory allocation is not considered an observable side effect. + */ + predicate mayHaveSideEffects() { none() } + + /** Gets the first control-flow node in this statement. */ + ControlFlow::Node getFirstControlFlowNode() { result.isFirstNodeOf(this) } +} + +/** + * A bad statement, that is, a statement that could not be parsed. + * + * Examples: + * + * ```go + * go fmt.Println + * defer int + * ``` + */ +class BadStmt extends @badstmt, Stmt { + override string toString() { result = "bad statement" } + + override string getAPrimaryQlClass() { result = "BadStmt" } +} + +/** + * A declaration statement. + * + * Examples: + * + * ```go + * var i int + * const pi = 3.14159 + * type Printer interface{ Print() } + * ``` + */ +class DeclStmt extends @declstmt, Stmt, DeclParent { + /** Gets the declaration in this statement. */ + Decl getDecl() { result = getDecl(0) } + + override predicate mayHaveSideEffects() { getDecl().mayHaveSideEffects() } + + override string toString() { result = "declaration statement" } + + override string getAPrimaryQlClass() { result = "DeclStmt" } +} + +/** + * An empty statement. + * + * Examples: + * + * ```go + * ; + * ``` + */ +class EmptyStmt extends @emptystmt, Stmt { + override string toString() { result = "empty statement" } + + override string getAPrimaryQlClass() { result = "EmptyStmt" } +} + +/** + * A labeled statement. + * + * Examples: + * + * ```go + * Error: log.Panic("error encountered") + * ``` + */ +class LabeledStmt extends @labeledstmt, Stmt { + /** Gets the identifier representing the label. */ + Ident getLabelExpr() { result = getChildExpr(0) } + + /** Gets the label. */ + string getLabel() { result = getLabelExpr().getName() } + + /** Gets the statement that is being labeled. */ + Stmt getStmt() { result = getChildStmt(1) } + + override predicate mayHaveSideEffects() { getStmt().mayHaveSideEffects() } + + override string toString() { result = "labeled statement" } + + override string getAPrimaryQlClass() { result = "LabeledStmt" } +} + +/** + * An expression statement. + * + * Examples: + * + * ```go + * h(x+y) + * f.Close() + * <-ch + * (<-ch) + * ``` + */ +class ExprStmt extends @exprstmt, Stmt { + /** Gets the expression. */ + Expr getExpr() { result = getChildExpr(0) } + + override predicate mayHaveSideEffects() { getExpr().mayHaveSideEffects() } + + override string toString() { result = "expression statement" } + + override string getAPrimaryQlClass() { result = "ExprStmt" } +} + +/** + * A send statement. + * + * Examples: + * + * ```go + * ch <- 3 + * ``` + */ +class SendStmt extends @sendstmt, Stmt { + /** Gets the expression representing the channel. */ + Expr getChannel() { result = getChildExpr(0) } + + /** Gets the expression representing the value being sent. */ + Expr getValue() { result = getChildExpr(1) } + + override predicate mayHaveSideEffects() { any() } + + override string toString() { result = "send statement" } + + override string getAPrimaryQlClass() { result = "SendStmt" } +} + +/** + * An increment or decrement statement. + * + * Examples: + * + * ```go + * a++ + * b-- + * ``` + */ +class IncDecStmt extends @incdecstmt, Stmt { + /** Gets the expression being incremented or decremented. */ + Expr getOperand() { result = getChildExpr(0) } + + /** Gets the increment or decrement operator. */ + string getOperator() { none() } + + override predicate mayHaveSideEffects() { any() } +} + +/** + * An increment statement. + * + * Examples: + * + * ```go + * a++ + * ``` + */ +class IncStmt extends @incstmt, IncDecStmt { + override string getOperator() { result = "++" } + + override string toString() { result = "increment statement" } + + override string getAPrimaryQlClass() { result = "IncStmt" } +} + +/** + * A decrement statement. + * + * Examples: + * + * ```go + * b-- + * ``` + */ +class DecStmt extends @decstmt, IncDecStmt { + override string getOperator() { result = "--" } + + override string toString() { result = "decrement statement" } + + override string getAPrimaryQlClass() { result = "DecStmt" } +} + +/** + * A (simple or compound) assignment statement. + * + * Examples: + * + * ```go + * x := 1 + * *p = f() + * a[i] = 23 + * (k) = <-ch // same as: k = <-ch + * a += 2 + * ``` + */ +class Assignment extends @assignment, Stmt { + /** Gets the `i`th left-hand side of this assignment (0-based). */ + Expr getLhs(int i) { + i >= 0 and + result = getChildExpr(-(i + 1)) + } + + /** Gets a left-hand side of this assignment. */ + Expr getAnLhs() { result = getLhs(_) } + + /** Gets the number of left-hand sides of this assignment. */ + int getNumLhs() { result = count(getAnLhs()) } + + /** Gets the unique left-hand side of this assignment, if there is only one. */ + Expr getLhs() { getNumLhs() = 1 and result = getLhs(0) } + + /** Gets the `i`th right-hand side of this assignment (0-based). */ + Expr getRhs(int i) { + i >= 0 and + result = getChildExpr(i + 1) + } + + /** Gets a right-hand side of this assignment. */ + Expr getAnRhs() { result = getRhs(_) } + + /** Gets the number of right-hand sides of this assignment. */ + int getNumRhs() { result = count(getAnRhs()) } + + /** Gets the unique right-hand side of this assignment, if there is only one. */ + Expr getRhs() { getNumRhs() = 1 and result = getRhs(0) } + + /** Holds if this assignment assigns `rhs` to `lhs`. */ + predicate assigns(Expr lhs, Expr rhs) { exists(int i | lhs = getLhs(i) and rhs = getRhs(i)) } + + /** Gets the assignment operator in this statement. */ + string getOperator() { none() } + + override predicate mayHaveSideEffects() { any() } + + override string toString() { result = "... " + getOperator() + " ..." } +} + +/** + * A simple assignment statement, that is, an assignment without a compound operator. + * + * Examples: + * + * ```go + * x := 1 + * *p = f() + * a[i] = 23 + * (k) = <-ch // same as: k = <-ch + * ``` + */ +class SimpleAssignStmt extends @simpleassignstmt, Assignment { + override string getAPrimaryQlClass() { result = "SimpleAssignStmt" } +} + +/** + * A plain assignment statement. + * + * Examples: + * + * ```go + * *p = f() + * a[i] = 23 + * (k) = <-ch // same as: k = <-ch + * ``` + */ +class AssignStmt extends @assignstmt, SimpleAssignStmt { + override string getOperator() { result = "=" } + + override string getAPrimaryQlClass() { result = "AssignStmt" } +} + +/** + * A define statement. + * + * Examples: + * + * ```go + * x := 1 + * ``` + */ +class DefineStmt extends @definestmt, SimpleAssignStmt { + override string getOperator() { result = ":=" } + + override string getAPrimaryQlClass() { result = "DefineStmt" } +} + +/** + * A compound assignment statement. + * + * Examples: + * + * ```go + * a += 2 + * a /= 2 + * ``` + */ +class CompoundAssignStmt extends @compoundassignstmt, Assignment { } + +/** + * An add-assign statement using `+=`. + * + * Examples: + * + * ```go + * a += 2 + * ``` + */ +class AddAssignStmt extends @addassignstmt, CompoundAssignStmt { + override string getOperator() { result = "+=" } + + override string getAPrimaryQlClass() { result = "AddAssignStmt" } +} + +/** + * A subtract-assign statement using `-=`. + * + * Examples: + * + * ```go + * a -= 2 + * ``` + */ +class SubAssignStmt extends @subassignstmt, CompoundAssignStmt { + override string getOperator() { result = "-=" } + + override string getAPrimaryQlClass() { result = "SubAssignStmt" } +} + +/** + * A multiply-assign statement using `*=`. + * + * Examples: + * + * ```go + * a *= 2 + * ``` + */ +class MulAssignStmt extends @mulassignstmt, CompoundAssignStmt { + override string getOperator() { result = "*=" } + + override string getAPrimaryQlClass() { result = "MulAssignStmt" } +} + +/** + * A divide-assign statement using `/=`. + * + * Examples: + * + * ```go + * a /= 2 + * ``` + */ +class QuoAssignStmt extends @quoassignstmt, CompoundAssignStmt { + override string getOperator() { result = "/=" } + + override string getAPrimaryQlClass() { result = "QuoAssignStmt" } +} + +class DivAssignStmt = QuoAssignStmt; + +/** + * A modulo-assign statement using `%=`. + * + * Examples: + * + * ```go + * a %= 2 + * ``` + */ +class RemAssignStmt extends @remassignstmt, CompoundAssignStmt { + override string getOperator() { result = "%=" } + + override string getAPrimaryQlClass() { result = "RemAssignStmt" } +} + +class ModAssignStmt = RemAssignStmt; + +/** + * An and-assign statement using `&=`. + * + * Examples: + * + * ```go + * a &= 2 + * ``` + */ +class AndAssignStmt extends @andassignstmt, CompoundAssignStmt { + override string getOperator() { result = "&=" } + + override string getAPrimaryQlClass() { result = "AndAssignStmt" } +} + +/** + * An or-assign statement using `|=`. + * + * Examples: + * + * ```go + * a |= 2 + * ``` + */ +class OrAssignStmt extends @orassignstmt, CompoundAssignStmt { + override string getOperator() { result = "|=" } + + override string getAPrimaryQlClass() { result = "OrAssignStmt" } +} + +/** + * An xor-assign statement using `^=`. + * + * Examples: + * + * ```go + * a ^= 2 + * ``` + */ +class XorAssignStmt extends @xorassignstmt, CompoundAssignStmt { + override string getOperator() { result = "^=" } + + override string getAPrimaryQlClass() { result = "XorAssignStmt" } +} + +/** + * A left-shift-assign statement using `<<=`. + * + * Examples: + * + * ```go + * a <<= 2 + * ``` + */ +class ShlAssignStmt extends @shlassignstmt, CompoundAssignStmt { + override string getOperator() { result = "<<=" } + + override string getAPrimaryQlClass() { result = "ShlAssignStmt" } +} + +class LShiftAssignStmt = ShlAssignStmt; + +/** + * A right-shift-assign statement using `>>=`. + * + * Examples: + * + * ```go + * a >>= 2 + * ``` + */ +class ShrAssignStmt extends @shrassignstmt, CompoundAssignStmt { + override string getOperator() { result = ">>=" } + + override string getAPrimaryQlClass() { result = "ShrAssignStmt" } +} + +class RShiftAssignStmt = ShrAssignStmt; + +/** + * An and-not-assign statement using `&^=`. + * + * Examples: + * + * ```go + * a &^= 2 + * ``` + */ +class AndNotAssignStmt extends @andnotassignstmt, CompoundAssignStmt { + override string getOperator() { result = "&^=" } + + override string getAPrimaryQlClass() { result = "AndNotAssignStmt" } +} + +/** + * A `go` statement. + * + * Examples: + * + * ```go + * go fillPixels(row) + * ``` + */ +class GoStmt extends @gostmt, Stmt { + /** Gets the call. */ + CallExpr getCall() { result = getChildExpr(0) } + + override predicate mayHaveSideEffects() { getCall().mayHaveSideEffects() } + + override string toString() { result = "go statement" } + + override string getAPrimaryQlClass() { result = "GoStmt" } +} + +/** + * A `defer` statement. + * + * Examples: + * + * ```go + * defer mutex.Unlock() + * ``` + */ +class DeferStmt extends @deferstmt, Stmt { + /** Gets the call being deferred. */ + CallExpr getCall() { result = getChildExpr(0) } + + override predicate mayHaveSideEffects() { getCall().mayHaveSideEffects() } + + override string toString() { result = "defer statement" } + + override string getAPrimaryQlClass() { result = "DeferStmt" } +} + +/** + * A `return` statement. + * + * Examples: + * + * ```go + * return x + * ``` + */ +class ReturnStmt extends @returnstmt, Stmt { + /** Gets the `i`th returned expression (0-based) */ + Expr getExpr(int i) { result = getChildExpr(i) } + + /** Gets a returned expression. */ + Expr getAnExpr() { result = getExpr(_) } + + /** Gets the number of returned expressions. */ + int getNumExpr() { result = count(getAnExpr()) } + + /** Gets the unique returned expression, if there is only one. */ + Expr getExpr() { getNumChild() = 1 and result = getExpr(0) } + + override predicate mayHaveSideEffects() { getExpr().mayHaveSideEffects() } + + override string toString() { result = "return statement" } + + override string getAPrimaryQlClass() { result = "ReturnStmt" } +} + +/** + * A branch statement, for example a `break` or `goto`. + * + * Examples: + * + * ```go + * break + * break OuterLoop + * continue + * continue RowLoop + * goto Error + * fallthrough + * ``` + */ +class BranchStmt extends @branchstmt, Stmt { + /** Gets the expression denoting the target label of the branch, if any. */ + Ident getLabelExpr() { result = getChildExpr(0) } + + /** Gets the target label of the branch, if any. */ + string getLabel() { result = getLabelExpr().getName() } +} + +/** + * A `break` statement. + * + * Examples: + * + * ```go + * break + * break OuterLoop + * ``` + */ +class BreakStmt extends @breakstmt, BranchStmt { + override string toString() { result = "break statement" } + + override string getAPrimaryQlClass() { result = "BreakStmt" } +} + +/** + * A `continue` statement. + * + * Examples: + * + * ```go + * continue + * continue RowLoop + * ``` + */ +class ContinueStmt extends @continuestmt, BranchStmt { + override string toString() { result = "continue statement" } + + override string getAPrimaryQlClass() { result = "ContinueStmt" } +} + +/** + * A `goto` statement. + * + * Examples: + * + * ```go + * goto Error + * ``` + */ +class GotoStmt extends @gotostmt, BranchStmt { + override string toString() { result = "goto statement" } + + override string getAPrimaryQlClass() { result = "GotoStmt" } +} + +/** + * A `fallthrough` statement. + * + * Examples: + * + * ```go + * fallthrough + * ``` + */ +class FallthroughStmt extends @fallthroughstmt, BranchStmt { + override string toString() { result = "fallthrough statement" } + + override string getAPrimaryQlClass() { result = "FallthroughStmt" } +} + +/** + * A block statement. + * + * Examples: + * + * ```go + * { + * fmt.Printf("iteration %d\n", i) + * f(i) + * } + * ``` + */ +class BlockStmt extends @blockstmt, Stmt, ScopeNode { + /** Gets the `i`th statement in this block (0-based). */ + Stmt getStmt(int i) { result = getChildStmt(i) } + + /** Gets a statement in this block. */ + Stmt getAStmt() { result = getAChildStmt() } + + /** Gets the number of statements in this block. */ + int getNumStmt() { result = getNumChildStmt() } + + override predicate mayHaveSideEffects() { getAStmt().mayHaveSideEffects() } + + override string toString() { result = "block statement" } + + override string getAPrimaryQlClass() { result = "BlockStmt" } +} + +/** + * An `if` statement. + * + * Examples: + * + * ```go + * if x := f(); x < y { + * return y - x + * } else { + * return x - y + * } + * ``` + */ +class IfStmt extends @ifstmt, Stmt, ScopeNode { + /** Gets the init statement of this `if` statement, if any. */ + Stmt getInit() { result = getChildStmt(0) } + + /** Gets the condition of this `if` statement. */ + Expr getCond() { result = getChildExpr(1) } + + /** Gets the "then" branch of this `if` statement. */ + BlockStmt getThen() { result = getChildStmt(2) } + + /** Gets the "else" branch of this `if` statement, if any. */ + Stmt getElse() { result = getChildStmt(3) } + + override predicate mayHaveSideEffects() { + getInit().mayHaveSideEffects() or + getCond().mayHaveSideEffects() or + getThen().mayHaveSideEffects() or + getElse().mayHaveSideEffects() + } + + override string toString() { result = "if statement" } + + override string getAPrimaryQlClass() { result = "IfStmt" } +} + +/** + * A `case` or `default` clause in a `switch` statement. + * + * Examples: + * + * ```go + * case 0, 1: + * a = 1 + * fallthrough + * + * default: + * b = 2 + * + * case func(int) float64: + * printFunction(i) + * ``` + */ +class CaseClause extends @caseclause, Stmt, ScopeNode { + /** Gets the `i`th expression of this `case` clause (0-based). */ + Expr getExpr(int i) { result = getChildExpr(-(i + 1)) } + + /** Gets an expression of this `case` clause. */ + Expr getAnExpr() { result = getAChildExpr() } + + /** Gets the number of expressions of this `case` clause. */ + int getNumExpr() { result = getNumChildExpr() } + + /** Gets the `i`th statement of this `case` clause (0-based). */ + Stmt getStmt(int i) { result = getChildStmt(i) } + + /** Gets a statement of this `case` clause. */ + Stmt getAStmt() { result = getAChildStmt() } + + /** Gets the number of statements of this `case` clause. */ + int getNumStmt() { result = getNumChildStmt() } + + override predicate mayHaveSideEffects() { + getAnExpr().mayHaveSideEffects() or + getAStmt().mayHaveSideEffects() + } + + override string toString() { result = "case clause" } + + override string getAPrimaryQlClass() { result = "CaseClause" } +} + +/** + * A `switch` statement, that is, either an expression switch or a type switch. + * + * Examples: + * + * ```go + * switch x := f(); x { + * case 0, 1: + * a = 1 + * fallthrough + * default: + * b = 2 + * } + * + * switch i := x.(type) { + * default: + * printString("don't know the type") + * case nil: + * printString("x is nil") + * case int: + * printInt(i) + * case func(int) float64: + * printFunction(i) + * } + * ``` + */ +class SwitchStmt extends @switchstmt, Stmt, ScopeNode { + /** Gets the init statement of this `switch` statement, if any. */ + Stmt getInit() { result = getChildStmt(0) } + + /** Gets the body of this `switch` statement. */ + BlockStmt getBody() { result = getChildStmt(2) } + + /** Gets the `i`th case clause of this `switch` statement (0-based). */ + CaseClause getCase(int i) { result = getBody().getStmt(i) } + + /** Gets a case clause of this `switch` statement. */ + CaseClause getACase() { result = getCase(_) } + + /** Gets the number of case clauses in this `switch` statement. */ + int getNumCase() { result = count(getACase()) } + + /** Gets the `i`th non-default case clause of this `switch` statement (0-based). */ + CaseClause getNonDefaultCase(int i) { + result = + rank[i + 1](CaseClause cc, int j | cc = getCase(j) and exists(cc.getExpr(_)) | cc order by j) + } + + /** Gets a non-default case clause of this `switch` statement. */ + CaseClause getANonDefaultCase() { result = getNonDefaultCase(_) } + + /** Gets the number of non-default case clauses in this `switch` statement. */ + int getNumNonDefaultCase() { result = count(getANonDefaultCase()) } + + /** Gets the default case clause of this `switch` statement, if any. */ + CaseClause getDefault() { result = getACase() and not exists(result.getExpr(_)) } +} + +/** + * An expression-switch statement. + * + * Examples: + * + * ```go + * switch x := f(); x { + * case 0, 1: + * a = 1 + * fallthrough + * default: + * b = 2 + * } + * ``` + */ +class ExpressionSwitchStmt extends @exprswitchstmt, SwitchStmt { + /** Gets the switch expression of this `switch` statement. */ + Expr getExpr() { result = getChildExpr(1) } + + override predicate mayHaveSideEffects() { + getInit().mayHaveSideEffects() or + getBody().mayHaveSideEffects() + } + + override string toString() { result = "expression-switch statement" } + + override string getAPrimaryQlClass() { result = "ExpressionSwitchStmt" } +} + +/** + * A type-switch statement. + * + * Examples: + * + * ```go + * switch i := x.(type) { + * default: + * printString("don't know the type") // type of i is type of x (interface{}) + * case nil: + * printString("x is nil") // type of i is type of x (interface{}) + * case int: + * printInt(i) // type of i is int + * case func(int) float64: + * printFunction(i) // type of i is func(int) float64 + * } + * ``` + */ +class TypeSwitchStmt extends @typeswitchstmt, SwitchStmt { + /** Gets the assign statement of this type-switch statement. */ + SimpleAssignStmt getAssign() { result = getChildStmt(1) } + + /** Gets the test statement of this type-switch statement. This is a `SimpleAssignStmt` or `ExprStmt`. */ + Stmt getTest() { result = getChildStmt(1) } + + /** Gets the expression whose type is examined by this `switch` statement. */ + Expr getExpr() { result = getAssign().getRhs() or result = getChildStmt(1).(ExprStmt).getExpr() } + + override predicate mayHaveSideEffects() { any() } + + override string toString() { result = "type-switch statement" } + + override string getAPrimaryQlClass() { result = "TypeSwitchStmt" } +} + +/** + * A comm clause, that is, a `case` or `default` clause in a `select` statement. + * + * Examples: + * + * ```go + * case i1 = <-c1: + * print("received ", i1, " from c1\n") + * + * case c2 <- i2: + * print("sent ", i2, " to c2\n") + * + * case i3, ok := (<-c3): // same as: i3, ok := <-c3 + * if ok { + * print("received ", i3, " from c3\n") + * } else { + * print("c3 is closed\n") + * } + * + * default: + * print("no communication\n") + * ``` + */ +class CommClause extends @commclause, Stmt, ScopeNode { + /** Gets the comm statement of this clause, if any. */ + Stmt getComm() { result = getChildStmt(0) } + + /** Gets the `i`th statement of this clause (0-based). */ + Stmt getStmt(int i) { i >= 0 and result = getChildStmt(i + 1) } + + /** Gets a statement of this clause. */ + Stmt getAStmt() { result = getStmt(_) } + + /** Gets the number of statements of this clause. */ + int getNumStmt() { result = count(getAStmt()) } + + override predicate mayHaveSideEffects() { getAStmt().mayHaveSideEffects() } + + override string toString() { result = "comm clause" } + + override string getAPrimaryQlClass() { result = "CommClause" } +} + +/** + * A receive statement in a comm clause. + * + * Examples: + * + * ```go + * i1 = <-c1 + * i3, ok := <-c3 + * i3, ok := (<-c3) + * ``` + */ +class RecvStmt extends Stmt { + RecvStmt() { this = any(CommClause cc).getComm() and not this instanceof SendStmt } + + /** Gets the `i`th left-hand-side expression of this receive statement, if any. */ + Expr getLhs(int i) { result = this.(Assignment).getLhs(i) } + + /** Gets the number of left-hand-side expressions of this receive statement. */ + int getNumLhs() { result = count(getLhs(_)) } + + /** Gets the receive expression of this receive statement. */ + RecvExpr getExpr() { + result = this.(ExprStmt).getExpr() or + result = this.(Assignment).getRhs() + } + + override string getAPrimaryQlClass() { result = "RecvStmt" } +} + +/** + * A `select` statement. + * + * Examples: + * + * ```go + * select { + * case i1 = <-c1: + * print("received ", i1, " from c1\n") + * case c2 <- i2: + * print("sent ", i2, " to c2\n") + * case i3, ok := (<-c3): // same as: i3, ok := <-c3 + * if ok { + * print("received ", i3, " from c3\n") + * } else { + * print("c3 is closed\n") + * } + * default: + * print("no communication\n") + * } + * ``` + */ +class SelectStmt extends @selectstmt, Stmt { + /** Gets the body of this `select` statement. */ + BlockStmt getBody() { result = getChildStmt(0) } + + /** + * Gets the `i`th comm clause (that is, `case` or `default` clause) in this `select` statement. + */ + CommClause getCommClause(int i) { result = getBody().getStmt(i) } + + /** + * Gets a comm clause in this `select` statement. + */ + CommClause getACommClause() { result = getCommClause(_) } + + /** Gets the `i`th `case` clause in this `select` statement. */ + CommClause getNonDefaultCommClause(int i) { + result = + rank[i + 1](CommClause cc, int j | + cc = getCommClause(j) and exists(cc.getComm()) + | + cc order by j + ) + } + + /** Gets the number of `case` clauses in this `select` statement. */ + int getNumNonDefaultCommClause() { result = count(getNonDefaultCommClause(_)) } + + /** Gets the `default` clause in this `select` statement, if any. */ + CommClause getDefaultCommClause() { + result = getCommClause(_) and + not exists(result.getComm()) + } + + override predicate mayHaveSideEffects() { any() } + + override string toString() { result = "select statement" } + + override string getAPrimaryQlClass() { result = "SelectStmt" } +} + +/** + * A loop, that is, either a `for` statement or a `range` statement. + * + * Examples: + * + * ```go + * for a < b { + * a *= 2 + * } + * + * for i := 0; i < 10; i++ { + * f(i) + * } + * + * for key, value := range mymap { + * fmt.Printf("mymap[%s] = %d\n", key, value) + * } + * ``` + */ +class LoopStmt extends @loopstmt, Stmt, ScopeNode { + /** Gets the body of this loop. */ + BlockStmt getBody() { none() } +} + +/** + * A `for` statement. + * + * Examples: + * + * ```go + * for a < b { + * a *= 2 + * } + * + * for i := 0; i < 10; i++ { + * f(i) + * } + * ``` + */ +class ForStmt extends @forstmt, LoopStmt { + /** Gets the init statement of this `for` statement, if any. */ + Stmt getInit() { result = getChildStmt(0) } + + /** Gets the condition of this `for` statement. */ + Expr getCond() { result = getChildExpr(1) } + + /** Gets the post statement of this `for` statement. */ + Stmt getPost() { result = getChildStmt(2) } + + override BlockStmt getBody() { result = getChildStmt(3) } + + override predicate mayHaveSideEffects() { + getInit().mayHaveSideEffects() or + getCond().mayHaveSideEffects() or + getPost().mayHaveSideEffects() or + getBody().mayHaveSideEffects() + } + + override string toString() { result = "for statement" } + + override string getAPrimaryQlClass() { result = "ForStmt" } +} + +/** + * A `range` statement. + * + * Examples: + * + * ```go + * for key, value := range mymap { + * fmt.Printf("mymap[%s] = %d\n", key, value) + * } + * + * for _, value = range array { + * fmt.Printf("array contains: %d\n", value) + * } + * + * for index, _ := range str { + * fmt.Printf("str[%d] = ?\n", index) + * } + * + * for value = range ch { + * fmt.Printf("value from channel: %d\n", value) + * } + * ``` + */ +class RangeStmt extends @rangestmt, LoopStmt { + /** Gets the expression denoting the key of this `range` statement. */ + Expr getKey() { result = getChildExpr(0) } + + /** Get the expression denoting the value of this `range` statement. */ + Expr getValue() { result = getChildExpr(1) } + + /** Gets the domain of this `range` statement. */ + Expr getDomain() { result = getChildExpr(2) } + + override BlockStmt getBody() { result = getChildStmt(3) } + + override predicate mayHaveSideEffects() { any() } + + override string toString() { result = "range statement" } + + override string getAPrimaryQlClass() { result = "RangeStmt" } +} diff --git a/go/ql/lib/semmle/go/StringOps.qll b/go/ql/lib/semmle/go/StringOps.qll new file mode 100644 index 00000000000..70f83328c05 --- /dev/null +++ b/go/ql/lib/semmle/go/StringOps.qll @@ -0,0 +1,523 @@ +/** + * Provides predicates and classes for working with string operations. + */ + +import go + +/** Provides predicates and classes for working with string operations. */ +module StringOps { + /** + * An expression that is equivalent to `strings.HasPrefix(A, B)` or `!strings.HasPrefix(A, B)`. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `StringOps::HasPrefix::Range` instead. + */ + class HasPrefix extends DataFlow::Node { + HasPrefix::Range range; + + HasPrefix() { range = this } + + /** + * Gets the `A` in `strings.HasPrefix(A, B)`. + */ + DataFlow::Node getBaseString() { result = range.getBaseString() } + + /** + * Gets the `B` in `strings.HasPrefix(A, B)`. + */ + DataFlow::Node getSubstring() { result = range.getSubstring() } + + /** + * Gets the polarity of the check. + * + * If the polarity is `false` the check returns `true` if the string does not start + * with the given substring. + */ + boolean getPolarity() { result = range.getPolarity() } + } + + class StartsWith = HasPrefix; + + /** Provides predicates and classes for working with prefix checks. */ + module HasPrefix { + /** + * An expression that is equivalent to `strings.HasPrefix(A, B)` or `!strings.HasPrefix(A, B)`. + * + * Extend this class to model new APIs. If you want to refine existing API models, extend + * `StringOps::HasPrefix` instead. + */ + abstract class Range extends DataFlow::Node { + /** + * Gets the `A` in `strings.HasPrefix(A, B)`. + */ + abstract DataFlow::Node getBaseString(); + + /** + * Gets the `B` in `strings.HasPrefix(A, B)`. + */ + abstract DataFlow::Node getSubstring(); + + /** + * Gets the polarity of the check. + * + * If the polarity is `false` the check returns `true` if the string does not start + * with the given substring. + */ + boolean getPolarity() { result = true } + } + + /** + * An expression of the form `strings.HasPrefix(A, B)`. + */ + private class StringsHasPrefix extends Range, DataFlow::CallNode { + StringsHasPrefix() { this.getTarget().hasQualifiedName("strings", "HasPrefix") } + + override DataFlow::Node getBaseString() { result = this.getArgument(0) } + + override DataFlow::Node getSubstring() { result = this.getArgument(1) } + } + + /** + * Holds if `eq` is of the form `nd == 0` or `nd != 0`. + */ + pragma[noinline] + private predicate comparesToZero(DataFlow::EqualityTestNode eq, DataFlow::Node nd) { + exists(DataFlow::Node zero | + eq.hasOperands(globalValueNumber(nd).getANode(), zero) and + zero.getIntValue() = 0 + ) + } + + /** + * An expression of the form `strings.Index(A, B) == 0`. + */ + private class HasPrefix_IndexOfEquals extends Range, DataFlow::EqualityTestNode { + DataFlow::CallNode indexOf; + + HasPrefix_IndexOfEquals() { + comparesToZero(this, indexOf) and + indexOf.getTarget().hasQualifiedName("strings", "Index") + } + + override DataFlow::Node getBaseString() { result = indexOf.getArgument(0) } + + override DataFlow::Node getSubstring() { result = indexOf.getArgument(1) } + + override boolean getPolarity() { result = expr.getPolarity() } + } + + /** + * Holds if `eq` is of the form `str[0] == rhs` or `str[0] != rhs`. + */ + pragma[noinline] + private predicate comparesFirstCharacter( + DataFlow::EqualityTestNode eq, DataFlow::Node str, DataFlow::Node rhs + ) { + exists(DataFlow::ElementReadNode read | + eq.hasOperands(globalValueNumber(read).getANode(), rhs) and + str = read.getBase() and + str.getType().getUnderlyingType() instanceof StringType and + read.getIndex().getIntValue() = 0 + ) + } + + /** + * A comparison of the form `x[0] == 'k'` for some rune literal `k`. + */ + private class HasPrefix_FirstCharacter extends Range, DataFlow::EqualityTestNode { + DataFlow::Node base; + DataFlow::Node runeLiteral; + + HasPrefix_FirstCharacter() { comparesFirstCharacter(this, base, runeLiteral) } + + override DataFlow::Node getBaseString() { result = base } + + override DataFlow::Node getSubstring() { result = runeLiteral } + + override boolean getPolarity() { result = expr.getPolarity() } + } + + /** + * A comparison of the form `x[:len(y)] == y`. + */ + private class HasPrefix_Substring extends Range, DataFlow::EqualityTestNode { + DataFlow::SliceNode slice; + DataFlow::Node substring; + + HasPrefix_Substring() { + this.eq(_, slice, substring) and + slice.getLow().getIntValue() = 0 and + ( + exists(DataFlow::CallNode len | + len = Builtin::len().getACall() and + len.getArgument(0) = globalValueNumber(substring).getANode() and + slice.getHigh() = globalValueNumber(len).getANode() + ) + or + substring.getStringValue().length() = slice.getHigh().getIntValue() + ) + } + + override DataFlow::Node getBaseString() { result = slice.getBase() } + + override DataFlow::Node getSubstring() { result = substring } + + override boolean getPolarity() { result = expr.getPolarity() } + } + } + + /** Provides predicates and classes for working with Printf-style formatters. */ + module Formatting { + /** + * Gets a regular expression for matching simple format-string components, including flags, + * width and precision specifiers, not including explicit argument indices. + */ + pragma[noinline] + private string getFormatComponentRegex() { + exists( + string literal, string opt_flag, string width, string prec, string opt_width_and_prec, + string operator, string verb + | + literal = "([^%]|%%)+" and + opt_flag = "[-+ #0]?" and + width = "\\d+|\\*" and + prec = "\\.(\\d+|\\*)" and + opt_width_and_prec = "(" + width + ")?(" + prec + ")?" and + operator = "[bcdeEfFgGoOpqstTxXUv]" and + verb = "(%" + opt_flag + opt_width_and_prec + operator + ")" + | + result = "(" + literal + "|" + verb + ")" + ) + } + + /** + * A function that performs string formatting in the same manner as `fmt.Printf` etc. + */ + abstract class Range extends Function { + /** + * Gets the parameter index of the format string. + */ + abstract int getFormatStringIndex(); + + /** + * Gets the parameter index of the first parameter to be formatted. + */ + abstract int getFirstFormattedParameterIndex(); + } + + /** + * A call to a `fmt.Printf`-style string formatting function. + */ + class StringFormatCall extends DataFlow::CallNode { + string fmt; + Range f; + + StringFormatCall() { + this = f.getACall() and + fmt = this.getArgument(f.getFormatStringIndex()).getStringValue() and + fmt.regexpMatch(getFormatComponentRegex() + "*") + } + + /** + * Gets the `n`th component of this format string. + */ + string getComponent(int n) { result = fmt.regexpFind(getFormatComponentRegex(), n, _) } + + /** + * Gets the `n`th argument formatted by this format call, where `formatDirective` specifies how it will be formatted. + */ + DataFlow::Node getOperand(int n, string formatDirective) { + formatDirective = this.getComponent(n) and + formatDirective.charAt(0) = "%" and + formatDirective.charAt(1) != "%" and + result = this.getArgument((n / 2) + f.getFirstFormattedParameterIndex()) + } + } + } + + /** + * A data-flow node that performs string concatenation. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `StringOps::Concatenation::Range` instead. + */ + class Concatenation extends DataFlow::Node { + Concatenation::Range self; + + Concatenation() { this = self } + + /** + * Gets the `n`th operand of this string concatenation, if there is a data-flow node for it. + */ + DataFlow::Node getOperand(int n) { result = self.getOperand(n) } + + /** + * Gets the string value of the `n`th operand of this string concatenation, if it is a constant. + */ + string getOperandStringValue(int n) { result = self.getOperandStringValue(n) } + + /** + * Gets the number of operands of this string concatenation. + */ + int getNumOperand() { result = self.getNumOperand() } + } + + /** Provides predicates and classes for working with string concatenations. */ + module Concatenation { + /** + * A data-flow node that performs string concatenation. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `StringOps::Concatenation` instead. + */ + abstract class Range extends DataFlow::Node { + /** + * Gets the `n`th operand of this string concatenation, if there is a data-flow node for it. + */ + abstract DataFlow::Node getOperand(int n); + + /** + * Gets the string value of the `n`th operand of this string concatenation, if it is + * a constant. + */ + string getOperandStringValue(int n) { result = this.getOperand(n).getStringValue() } + + /** + * Gets the number of operands of this string concatenation. + */ + int getNumOperand() { result = count(this.getOperand(_)) } + } + + /** A string concatenation using the `+` or `+=` operator. */ + private class PlusConcat extends Range, DataFlow::BinaryOperationNode { + PlusConcat() { + this.getType() instanceof StringType and + this.getOperator() = "+" + } + + override DataFlow::Node getOperand(int n) { + n = 0 and result = this.getLeftOperand() + or + n = 1 and result = this.getRightOperand() + } + } + + /** + * A call to `fmt.Sprintf`, considered as a string concatenation. + * + * Only calls with simple format strings (no `*` specifiers, no explicit argument indices) + * are supported. Such format strings can be viewed as sequences of alternating literal and + * non-literal components. A literal component contains no `%` characters except `%%` pairs, + * while a non-literal component consists of `%`, a verb, and possibly flags and specifiers. + * Each non-literal component consumes exactly one argument. + * + * Literal components give rise to concatenation operands that have a string value but no + * data-flow node; non-literal `%s` or `%v` components give rise to concatenation operands + * that do have an associated data-flow node but possibly no string value; any other non-literal + * components give rise to concatenation operands that have neither an associated data-flow + * node nor a string value. This is because verbs like `%q` perform additional string + * transformations that we cannot easily represent. + */ + private class SprintfConcat extends Range instanceof Formatting::StringFormatCall { + SprintfConcat() { this = any(Function f | f.hasQualifiedName("fmt", "Sprintf")).getACall() } + + override DataFlow::Node getOperand(int n) { + result = Formatting::StringFormatCall.super.getOperand(n, ["%s", "%v"]) + } + + override string getOperandStringValue(int n) { + result = Range.super.getOperandStringValue(n) + or + exists(string cmp | cmp = Formatting::StringFormatCall.super.getComponent(n) | + (cmp.charAt(0) != "%" or cmp.charAt(1) = "%") and + result = cmp.replaceAll("%%", "%") + ) + } + + override int getNumOperand() { + result = max(int i | exists(Formatting::StringFormatCall.super.getComponent(i))) + 1 + } + } + + /** + * Holds if `src` flows to `dst` through the `n`th operand of the given concatenation operator. + */ + predicate taintStep(DataFlow::Node src, DataFlow::Node dst, Concatenation cat, int n) { + src = cat.getOperand(n) and + dst = cat + } + + /** + * Holds if there is a taint step from `src` to `dst` through string concatenation. + */ + predicate taintStep(DataFlow::Node src, DataFlow::Node dst) { taintStep(src, dst, _, _) } + } + + private newtype TConcatenationElement = + /** A root concatenation element that is not itself an operand of a string concatenation. */ + MkConcatenationRoot(Concatenation cat) { not cat = any(Concatenation parent).getOperand(_) } or + /** A concatenation element that is an operand of a string concatenation. */ + MkConcatenationOperand(Concatenation parent, int i) { i in [0 .. parent.getNumOperand() - 1] } + + /** + * An element of a string concatenation, which either itself performs a string concatenation or + * occurs as an operand in a string concatenation. + * + * For example, the expression `x + y + z` contains the following concatenation + * elements: + * + * - The leaf elements `x`, `y`, and `z` + * - The intermediate element `x + y`, which is both a concatenation and an operand + * - The root element `x + y + z` + */ + class ConcatenationElement extends TConcatenationElement { + /** + * Gets the data-flow node corresponding to this concatenation element, if any. + */ + DataFlow::Node asNode() { + this = MkConcatenationRoot(result) + or + exists(Concatenation parent, int i | this = MkConcatenationOperand(parent, i) | + result = parent.getOperand(i) + ) + } + + /** + * Gets the string value of this concatenation element if it is a constant. + */ + string getStringValue() { + result = this.asNode().getStringValue() + or + exists(Concatenation parent, int i | this = MkConcatenationOperand(parent, i) | + result = parent.getOperandStringValue(i) + ) + } + + /** + * Gets the `n`th operand of this string concatenation. + */ + ConcatenationOperand getOperand(int n) { result = MkConcatenationOperand(this.asNode(), n) } + + /** + * Gets an operand of this string concatenation. + */ + ConcatenationOperand getAnOperand() { result = this.getOperand(_) } + + /** + * Gets the number of operands of this string concatenation. + */ + int getNumOperand() { result = count(this.getAnOperand()) } + + /** + * Gets the first operand of this string concatenation. + * + * For example, the first operand of `(x + y) + z` is `(x + y)`. + */ + ConcatenationOperand getFirstOperand() { result = this.getOperand(0) } + + /** + * Gets the last operand of this string concatenation. + * + * For example, the last operand of `x + (y + z)` is `(y + z)`. + */ + ConcatenationOperand getLastOperand() { result = this.getOperand(this.getNumOperand() - 1) } + + /** + * Gets the root of the concatenation tree to which this element belongs. + */ + ConcatenationRoot getConcatenationRoot() { this = result.getAnOperand*() } + + /** + * Gets a leaf in the concatenation tree that this element is the root of. + */ + ConcatenationLeaf getALeaf() { result = this.getAnOperand*() } + + /** + * Gets the first leaf in this concatenation tree. + * + * For example, the first leaf of `(x + y) + z` is `x`. + */ + ConcatenationLeaf getFirstLeaf() { result = this.getFirstOperand*() } + + /** + * Gets the last leaf in this concatenation tree. + * + * For example, the last leaf of `x + (y + z)` is `z`. + */ + ConcatenationLeaf getLastLeaf() { result = this.getLastOperand*() } + + /** Gets a textual representation of this concatenation element. */ + string toString() { + if exists(this.asNode()) + then result = this.asNode().toString() + else + if exists(this.getStringValue()) + then result = this.getStringValue() + else result = "concatenation element" + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.asNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + // use dummy location for elements that don't have a corresponding node + not exists(this.asNode()) and + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } + } + + /** + * One of the operands in a string concatenation. + * + * See `ConcatenationElement` for more information. + */ + class ConcatenationOperand extends ConcatenationElement, MkConcatenationOperand { } + + /** + * A data-flow node that performs a string concatenation, and is not an + * immediate operand in a larger string concatenation. + * + * See `ConcatenationElement` for more information. + */ + class ConcatenationRoot extends ConcatenationElement, MkConcatenationRoot { } + + /** + * An operand to a concatenation that is not itself a concatenation. + * + * See `ConcatenationElement` for more information. + */ + class ConcatenationLeaf extends ConcatenationOperand { + ConcatenationLeaf() { not exists(this.getAnOperand()) } + + /** + * Gets the operand immediately preceding this one in its parent concatenation. + * + * For example, in `(x + y) + z`, the previous leaf for `z` is `y`. + */ + ConcatenationLeaf getPreviousLeaf() { + exists(ConcatenationElement parent, int i | + result = parent.getOperand(i - 1).getLastLeaf() and + this = parent.getOperand(i).getFirstLeaf() + ) + } + + /** + * Gets the operand immediately succeeding this one in its parent concatenation. + * + * For example, in `(x + y) + z`, the previous leaf for `y` is `z`. + */ + ConcatenationLeaf getNextLeaf() { this = result.getPreviousLeaf() } + } +} diff --git a/go/ql/lib/semmle/go/Types.qll b/go/ql/lib/semmle/go/Types.qll new file mode 100644 index 00000000000..8ec3978e6f1 --- /dev/null +++ b/go/ql/lib/semmle/go/Types.qll @@ -0,0 +1,1015 @@ +/** + * Provides classes for working with Go types. + */ + +import go + +/** A Go type. */ +class Type extends @type { + /** Gets the name of this type, if it has one. */ + string getName() { typename(this, result) } + + /** + * Gets the underlying type of this type after any type aliases have been replaced + * with their definition. + */ + Type getUnderlyingType() { result = this } + + /** + * Gets the entity associated with this type. + */ + TypeEntity getEntity() { type_objects(this, result) } + + /** Gets the package in which this type is declared, if any. */ + Package getPackage() { result = this.getEntity().getPackage() } + + /** + * Gets the qualified name of this type, if any. + * + * Only (defined) named types like `io.Writer` have a qualified name. Basic types like `int`, + * pointer types like `*io.Writer`, and other composite types do not have a qualified name. + */ + string getQualifiedName() { result = this.getEntity().getQualifiedName() } + + /** + * Holds if this type is declared in a package with path `pkg` and has name `name`. + * + * Only (defined) named types like `io.Writer` have a qualified name. Basic types like `int`, + * pointer types like `*io.Writer`, and other composite types do not have a qualified name. + */ + predicate hasQualifiedName(string pkg, string name) { + this.getEntity().hasQualifiedName(pkg, name) + } + + /** + * Holds if the method set of this type contains a method named `m` of type `t`. + */ + predicate hasMethod(string m, SignatureType t) { t = this.getMethod(m).getType() } + + /** + * Gets the method `m` belonging to the method set of this type, if any. + * + * Note that this predicate never has a result for struct types. Methods are associated + * with the corresponding named type instead. + */ + Method getMethod(string m) { + result.getReceiverType() = this and + result.getName() = m + } + + /** + * Gets the field `f` of this type. + * + * This includes fields promoted from an embedded field. + */ + Field getField(string f) { result = this.getUnderlyingType().getField(f) } + + /** + * Holds if this type implements interface `i`, that is, the method set of `i` + * is contained in the method set of this type and any type restrictions are + * satisfied. + */ + predicate implements(InterfaceType i) { + if i = any(ComparableType comparable).getUnderlyingType() + then this.implementsComparable() + else this.implementsNotComparable(i) + } + + /** + * Holds if this type implements interface `i`, which is not the underlying + * type of `comparable`. This predicate is needed to avoid non-monotonic + * recursion. + */ + private predicate implementsNotComparable(InterfaceType i) { + ( + forall(TypeSetLiteralType tslit | tslit = i.getAnEmbeddedTypeSetLiteral() | + tslit.includesType(this) + ) and + ( + hasNoMethods(i) + or + this.hasMethod(getExampleMethodName(i), _) and + forall(string m, SignatureType t | i.hasMethod(m, t) | this.hasMethod(m, t)) + ) + ) + } + + /** + * Holds if this type implements `comparable`. This includes being + * `comparable` itself, or the underlying type of `comparable`. + */ + predicate implementsComparable() { + exists(Type u | u = this.getUnderlyingType() | + // Note that BasicType includes Invalidtype + u instanceof BasicType + or + u instanceof PointerType + or + u instanceof ChanType + or + u instanceof StructType and + forall(Type fieldtp | u.(StructType).hasField(_, fieldtp) | fieldtp.implementsComparable()) + or + u instanceof ArrayType and u.(ArrayType).getElementType().implementsComparable() + or + exists(InterfaceType uif | uif = u | + not uif instanceof BasicInterfaceType and + if exists(uif.getAnEmbeddedTypeSetLiteral()) + then + // All types in the intersection of all the embedded type set + // literals must implement comparable. + forall(Type intersectionType | + intersectionType = uif.getAnEmbeddedTypeSetLiteral().getATerm().getType() and + forall(TypeSetLiteralType tslit | tslit = uif.getAnEmbeddedTypeSetLiteral() | + intersectionType = tslit.getATerm().getType() + ) + | + intersectionType.implementsComparable() + ) + else uif.isOrEmbedsComparable() + ) + ) + } + + /** + * Holds if this type implements an interface that has the qualified name `pkg.name`, + * that is, the method set of `pkg.name` is contained in the method set of this type + * and any type restrictions are satisfied. + */ + predicate implements(string pkg, string name) { + exists(Type t | t.hasQualifiedName(pkg, name) | this.implements(t.getUnderlyingType())) + } + + /** + * Gets the pointer type that has this type as its base type. + */ + PointerType getPointerType() { result.getBaseType() = this } + + /** + * Gets a pretty-printed representation of this type, including its structure where applicable. + */ + string pp() { result = this.toString() } + + /** + * Gets a basic textual representation of this type. + */ + string toString() { result = this.getName() } +} + +/** An invalid type. */ +class InvalidType extends @invalidtype, Type { + override string toString() { result = "invalid type" } +} + +/** A basic type. */ +class BasicType extends @basictype, Type { } + +/** Either the normal or literal boolean type */ +class BoolType extends @booltype, BasicType { } + +/** The `bool` type of a non-literal expression */ +class BoolExprType extends @boolexprtype, BoolType { + override string getName() { result = "bool" } +} + +/** A numeric type such as `int` or `float64`. */ +class NumericType extends @numerictype, BasicType { + /** + * Gets the implementation-independent size (in bits) of this numeric type. + * + * This predicate is not defined for types with an implementation-specific size, that is, + * `uint`, `int` or `uintptr`. + */ + int getSize() { none() } + + /** + * Gets a possible implementation-specific size (in bits) of this numeric type. + * + * This predicate is not defined for `uintptr` since the language specification says nothing + * about its size. + */ + int getASize() { result = this.getSize() } +} + +/** An integer type such as `int` or `uint64`. */ +class IntegerType extends @integertype, NumericType { } + +/** A signed integer type such as `int`. */ +class SignedIntegerType extends @signedintegertype, IntegerType { } + +/** The type `int`. */ +class IntType extends @inttype, SignedIntegerType { + override int getASize() { result = 32 or result = 64 } + + override string getName() { result = "int" } +} + +/** The type `int8`. */ +class Int8Type extends @int8type, SignedIntegerType { + override int getSize() { result = 8 } + + override string getName() { result = "int8" } +} + +/** The type `int16`. */ +class Int16Type extends @int16type, SignedIntegerType { + override int getSize() { result = 16 } + + override string getName() { result = "int16" } +} + +/** The type `int32`. */ +class Int32Type extends @int32type, SignedIntegerType { + override int getSize() { result = 32 } + + override string getName() { result = "int32" } +} + +/** The type `int64`. */ +class Int64Type extends @int64type, SignedIntegerType { + override int getSize() { result = 64 } + + override string getName() { result = "int64" } +} + +/** An unsigned integer type such as `uint`. */ +class UnsignedIntegerType extends @unsignedintegertype, IntegerType { } + +/** The type `uint`. */ +class UintType extends @uinttype, UnsignedIntegerType { + override int getASize() { result = 32 or result = 64 } + + override string getName() { result = "uint" } +} + +/** The type `uint8`. */ +class Uint8Type extends @uint8type, UnsignedIntegerType { + override int getSize() { result = 8 } + + override string getName() { result = "uint8" } +} + +/** The type `uint16`. */ +class Uint16Type extends @uint16type, UnsignedIntegerType { + override int getSize() { result = 16 } + + override string getName() { result = "uint16" } +} + +/** The type `uint32`. */ +class Uint32Type extends @uint32type, UnsignedIntegerType { + override int getSize() { result = 32 } + + override string getName() { result = "uint32" } +} + +/** The type `uint64`. */ +class Uint64Type extends @uint64type, UnsignedIntegerType { + override int getSize() { result = 64 } + + override string getName() { result = "uint64" } +} + +/** The type `uintptr`. */ +class UintptrType extends @uintptrtype, BasicType { + override string getName() { result = "uintptr" } +} + +/** A floating-point type such as `float64`. */ +class FloatType extends @floattype, NumericType { } + +/** The type `float32`. */ +class Float32Type extends @float32type, FloatType { + override int getSize() { result = 32 } + + override string getName() { result = "float32" } +} + +/** The type `float64`. */ +class Float64Type extends @float64type, FloatType { + override int getSize() { result = 64 } + + override string getName() { result = "float64" } +} + +/** A complex-number type such as `complex64`. */ +class ComplexType extends @complextype, NumericType { } + +/** The type `complex64`. */ +class Complex64Type extends @complex64type, ComplexType { + override int getSize() { result = 64 } + + override string getName() { result = "complex64" } +} + +/** The type `complex128`. */ +class Complex128Type extends @complex128type, ComplexType { + override int getSize() { result = 128 } + + override string getName() { result = "complex128" } +} + +/** Either the normal or literal string type */ +class StringType extends @stringtype, BasicType { } + +/** The `string` type of a non-literal expression */ +class StringExprType extends @stringexprtype, StringType { + override string getName() { result = "string" } +} + +/** The type `unsafe.Pointer`. */ +class UnsafePointerType extends @unsafepointertype, BasicType { + override string getName() { result = "unsafe.Pointer" } +} + +/** The type of a literal. */ +class LiteralType extends @literaltype, BasicType { } + +/** The type of a bool literal. */ +class BoolLiteralType extends @boolliteraltype, LiteralType, BoolType { + override string toString() { result = "bool literal" } +} + +/** The type of an integer literal. */ +class IntLiteralType extends @intliteraltype, LiteralType, SignedIntegerType { + override string toString() { result = "int literal" } +} + +/** The type of a rune literal. */ +class RuneLiteralType extends @runeliteraltype, LiteralType, SignedIntegerType { + override string toString() { result = "rune literal" } +} + +/** The type of a float literal. */ +class FloatLiteralType extends @floatliteraltype, LiteralType, FloatType { + override string toString() { result = "float literal" } +} + +/** The type of a complex literal. */ +class ComplexLiteralType extends @complexliteraltype, LiteralType, ComplexType { + override string toString() { result = "complex literal" } +} + +/** The type of a string literal. */ +class StringLiteralType extends @stringliteraltype, LiteralType, StringType { + override string toString() { result = "string literal" } +} + +/** The type of `nil`. */ +class NilLiteralType extends @nilliteraltype, LiteralType { + override string toString() { result = "nil literal" } +} + +/** A composite type, that is, not a basic type. */ +class CompositeType extends @compositetype, Type { } + +/** A type that comes from a type parameter. */ +class TypeParamType extends @typeparamtype, CompositeType { + /** Gets the name of this type parameter type. */ + string getParamName() { typeparam(this, result, _, _, _) } + + /** Gets the constraint of this type parameter type. */ + Type getConstraint() { typeparam(this, _, result, _, _) } + + override InterfaceType getUnderlyingType() { result = this.getConstraint().getUnderlyingType() } + + override string pp() { result = this.getParamName() } + + /** + * Gets a pretty-printed representation of this type including its constraint. + */ + string ppWithConstraint() { result = this.getParamName() + " " + this.getConstraint().pp() } + + override string toString() { result = "type parameter type" } +} + +/** An array type. */ +class ArrayType extends @arraytype, CompositeType { + /** Gets the element type of this array type. */ + Type getElementType() { element_type(this, result) } + + /** Gets the length of this array type as a string. */ + string getLengthString() { array_length(this, result) } + + /** Gets the length of this array type if it can be represented as a QL integer. */ + int getLength() { result = this.getLengthString().toInt() } + + override Package getPackage() { result = this.getElementType().getPackage() } + + override string pp() { result = "[" + this.getLength() + "]" + this.getElementType().pp() } + + override string toString() { result = "array type" } +} + +/** A slice type. */ +class SliceType extends @slicetype, CompositeType { + /** Gets the element type of this slice type. */ + Type getElementType() { element_type(this, result) } + + override Package getPackage() { result = this.getElementType().getPackage() } + + override string pp() { result = "[]" + this.getElementType().pp() } + + override string toString() { result = "slice type" } +} + +/** A byte slice type */ +class ByteSliceType extends SliceType { + ByteSliceType() { this.getElementType() instanceof Uint8Type } +} + +/** A struct type. */ +class StructType extends @structtype, CompositeType { + /** + * Holds if this struct contains a field `name` with type `tp`; + * `isEmbedded` is true if the field is embedded. + * + * Note that this predicate does not take promoted fields into account. + */ + predicate hasOwnField(int i, string name, Type tp, boolean isEmbedded) { + exists(string n | component_types(this, i, n, tp) | + if n = "" + then ( + isEmbedded = true and + ( + name = tp.(NamedType).getName() + or + name = tp.(PointerType).getBaseType().(NamedType).getName() + ) + ) else ( + isEmbedded = false and + name = n + ) + ) + } + + /** + * Get a field with the name `name`; `isEmbedded` is true if the field is embedded. + * + * Note that this does not take promoted fields into account. + */ + Field getOwnField(string name, boolean isEmbedded) { + result.getDeclaringType() = this and + result.getName() = name and + this.hasOwnField(_, name, _, isEmbedded) + } + + /** + * Holds if there is an embedded field at `depth`, with either type `tp` or a pointer to `tp`. + */ + private predicate hasEmbeddedField(Type tp, int depth) { + exists(Field f | this.hasFieldCand(_, f, depth, true) | + tp = f.getType() or + tp = f.getType().(PointerType).getBaseType() + ) + } + + /** + * Gets a field of `embeddedParent`, which is then embedded into this struct type. + */ + Field getFieldOfEmbedded(Field embeddedParent, string name, int depth, boolean isEmbedded) { + // embeddedParent is a field of 'this' at depth 'depth - 1' + this.hasFieldCand(_, embeddedParent, depth - 1, true) and + // embeddedParent's type has the result field + exists(StructType embeddedType, Type fieldType | + fieldType = embeddedParent.getType().getUnderlyingType() and + pragma[only_bind_into](embeddedType) = + [fieldType, fieldType.(PointerType).getBaseType().getUnderlyingType()] + | + result = embeddedType.getOwnField(name, isEmbedded) + ) + } + + /** + * Gets a method of `embeddedParent`, which is then embedded into this struct type. + */ + Method getMethodOfEmbedded(Field embeddedParent, string name, int depth) { + // embeddedParent is a field of 'this' at depth 'depth - 1' + this.hasFieldCand(_, embeddedParent, depth - 1, true) and + result.getName() = name and + ( + result.getReceiverBaseType() = embeddedParent.getType() + or + result.getReceiverBaseType() = embeddedParent.getType().(PointerType).getBaseType() + or + methodhosts(result, embeddedParent.getType()) + ) + } + + private predicate hasFieldCand(string name, Field f, int depth, boolean isEmbedded) { + f = this.getOwnField(name, isEmbedded) and depth = 0 + or + not this.hasOwnField(_, name, _, _) and + f = this.getFieldOfEmbedded(_, name, depth, isEmbedded) + } + + private predicate hasMethodCand(string name, Method m, int depth) { + name = m.getName() and + exists(Type embedded | this.hasEmbeddedField(embedded, depth - 1) | + m.getReceiverType() = embedded + ) + } + + /** + * Holds if this struct contains a field `name` with type `tp`, possibly inside a (nested) + * embedded field. + */ + predicate hasField(string name, Type tp) { + exists(int mindepth | + mindepth = min(int depth | this.hasFieldCand(name, _, depth, _)) and + tp = unique(Field f | f = this.getFieldCand(name, mindepth, _)).getType() + ) + } + + private Field getFieldCand(string name, int depth, boolean isEmbedded) { + result = this.getOwnField(name, isEmbedded) and depth = 0 + or + exists(Type embedded | this.hasEmbeddedField(embedded, depth - 1) | + result = embedded.getUnderlyingType().(StructType).getOwnField(name, isEmbedded) + ) + } + + override Field getField(string name) { result = this.getFieldAtDepth(name, _) } + + /** + * Gets the field `f` with depth `depth` of this type. + * + * This includes fields promoted from an embedded field. It is not possible + * to access a field that is shadowed by a promoted field with this function. + * The number of embedded fields traversed to reach `f` is called its depth. + * The depth of a field `f` declared in this type is zero. + */ + Field getFieldAtDepth(string name, int depth) { + depth = min(int depthCand | exists(this.getFieldCand(name, depthCand, _))) and + result = this.getFieldCand(name, depth, _) and + strictcount(this.getFieldCand(name, depth, _)) = 1 + } + + Method getMethodAtDepth(string name, int depth) { + depth = min(int depthCand | this.hasMethodCand(name, _, depthCand)) and + result = unique(Method m | this.hasMethodCand(name, m, depth)) + } + + override predicate hasMethod(string name, SignatureType tp) { + exists(int mindepth | + mindepth = min(int depth | this.hasMethodCand(name, _, depth)) and + tp = unique(Method m | this.hasMethodCand(name, m, mindepth)).getType() + ) + } + + language[monotonicAggregates] + override string pp() { + result = + "struct { " + + concat(int i, string name, Type tp | + component_types(this, i, name, tp) + | + name + " " + tp.pp(), "; " order by i + ) + " }" + } + + override string toString() { result = "struct type" } +} + +/** A pointer type. */ +class PointerType extends @pointertype, CompositeType { + /** Gets the base type of this pointer type. */ + Type getBaseType() { base_type(this, result) } + + override Package getPackage() { result = this.getBaseType().getPackage() } + + override Method getMethod(string m) { + result = CompositeType.super.getMethod(m) + or + // https://golang.org/ref/spec#Method_sets: "the method set of a pointer type *T is + // the set of all methods declared with receiver *T or T" + result = this.getBaseType().getMethod(m) + or + // promoted methods from embedded types + exists(StructType s, Type embedded | + s = this.getBaseType().(NamedType).getUnderlyingType() and + s.hasOwnField(_, _, embedded, true) and + // ensure that `m` can be promoted + not s.hasOwnField(_, m, _, _) and + not exists(Method m2 | m2.getReceiverBaseType() = this.getBaseType() and m2.getName() = m) + | + result = embedded.getMethod(m) + or + // If S contains an embedded field T, the method set of *S includes promoted methods with receiver T or T* + not embedded instanceof PointerType and + result = embedded.getPointerType().getMethod(m) + or + // If S contains an embedded field *T, the method set of *S includes promoted methods with receiver T or *T + result = embedded.(PointerType).getBaseType().getMethod(m) + ) + } + + override string pp() { result = "* " + this.getBaseType().pp() } + + override string toString() { result = "pointer type" } +} + +private newtype TTypeSetTerm = + MkTypeSetTerm(TypeSetLiteralType tslit, int index) { component_types(tslit, index, _, _) } + +/** + * A term in a type set literal. + * + * Examples: + * ```go + * int + * ~string + * ``` + */ +class TypeSetTerm extends TTypeSetTerm { + boolean tilde; + Type tp; + + TypeSetTerm() { + exists(TypeSetLiteralType tslit, int index | + this = MkTypeSetTerm(tslit, index) and + ( + component_types(tslit, index, "", tp) and + tilde = false + or + component_types(tslit, index, "~", tp) and + tilde = true + ) + ) + } + + /** + * Holds if this term has a tilde in front of it. + * + * A tilde is used to indicate that the term refers to all types with a given + * underlying type. + */ + predicate hasTilde() { tilde = true } + + /** Gets the type of this term. */ + Type getType() { result = tp } + + /** Holds if `t` is in the type set of this term. */ + predicate includesType(Type t) { if tilde = false then t = tp else t.getUnderlyingType() = tp } + + /** Gets a pretty-printed representation of this term. */ + string pp() { + exists(string tildeStr | if tilde = true then tildeStr = "~" else tildeStr = "" | + result = tildeStr + tp.pp() + ) + } + + /** Gets a textual representation of this element. */ + string toString() { result = "type set term" } +} + +private TypeSetTerm getIntersection(TypeSetTerm term1, TypeSetTerm term2) { + term1.getType() = term2.getType() and + if term1.hasTilde() then result = term2 else result = term1 +} + +/** + * Gets a term in the intersection of type-set literals `a` and `b`. + */ +TypeSetTerm getTermInIntersection(TypeSetLiteralType a, TypeSetLiteralType b) { + result = getIntersection(a.getATerm(), b.getATerm()) +} + +/** + * A type set literal type, used when declaring a non-basic interface. May be a + * single term, consisting of either a type or a tilde followed by a type, or a + * union of terms. + * + * + * Examples: + * + * ```go + * int + * ~string + * int | ~string + * ``` + */ +class TypeSetLiteralType extends @typesetliteraltype, CompositeType { + /** Gets the `i`th term in this type set literal. */ + TypeSetTerm getTerm(int i) { result = MkTypeSetTerm(this, i) } + + /** Gets a term in this type set literal. */ + TypeSetTerm getATerm() { result = this.getTerm(_) } + + /** Holds if `t` is in the type set of this type set literal. */ + predicate includesType(Type t) { this.getATerm().includesType(t) } + + /** + * Gets the interface type of which this type-set literal is the only + * element, if it exists. + * + * It exists if it has been explicitly defined, as in + * `interface { int64 | uint64 }`, or if it has been implicitly created by + * using the type set literal directly as the bound in a type parameter + * declaration, as in `[T int64 | uint64]`. + */ + InterfaceType getInterfaceType() { + this = result.getDirectlyEmbeddedTypeSetLiteral(0) and + not exists(result.getDirectlyEmbeddedTypeSetLiteral(1)) and + hasNoMethods(result) and + not exists(result.getADirectlyEmbeddedInterface()) + } + + language[monotonicAggregates] + override string pp() { + result = concat(TypeSetTerm t, int i | t = this.getTerm(i) | t.pp(), " | " order by i) + } + + override string toString() { result = "type set literal type" } +} + +/** An interface type. */ +class InterfaceType extends @interfacetype, CompositeType { + /** Gets the type of method `name` of this interface type. */ + Type getMethodType(string name) { + // Note that negative indices correspond to embedded interfaces and type + // set literals. + exists(int i | i >= 0 | component_types(this, i, name, result)) + } + + override predicate hasMethod(string m, SignatureType t) { t = this.getMethodType(m) } + + /** + * Holds if `tp` is a directly embedded type with index `index`. + * + * `tp` (or its underlying type) is either a type set literal type or an + * interface type. + */ + private predicate hasDirectlyEmbeddedType(int index, Type tp) { + index >= 0 and component_types(this, -(index + 1), _, tp) + } + + /** + * Gets a type whose underlying type is an interface that is directly + * embedded into this interface. + * + * Note that the methods of the embedded interface are already considered + * as part of the method set of this interface. + */ + Type getADirectlyEmbeddedInterface() { + this.hasDirectlyEmbeddedType(_, result) and result.getUnderlyingType() instanceof InterfaceType + } + + /** + * Gets a type whose underlying type is an interface that is embedded into + * this interface. + * + * Note that the methods of the embedded interface are already considered + * as part of the method set of this interface. + */ + Type getAnEmbeddedInterface() { + result = this.getADirectlyEmbeddedInterface() or + result = + this.getADirectlyEmbeddedInterface() + .getUnderlyingType() + .(InterfaceType) + .getAnEmbeddedInterface() + } + + /** + * Holds if this interface type is (the underlying type of) `comparable`, or + * it embeds `comparable`. + */ + predicate isOrEmbedsComparable() { + this.getAnEmbeddedInterface() instanceof ComparableType or + this = any(ComparableType comparable).getUnderlyingType() + } + + /** + * Gets the type set literal with index `index` from the definition of this + * interface type. + * + * Note that the indexes are not contiguous. + */ + TypeSetLiteralType getDirectlyEmbeddedTypeSetLiteral(int index) { + hasDirectlyEmbeddedType(index, result) + } + + /** + * Gets a type set literal of this interface type. + * + * This includes type set literals of embedded interfaces. + */ + TypeSetLiteralType getAnEmbeddedTypeSetLiteral() { + result = this.getDirectlyEmbeddedTypeSetLiteral(_) or + result = + getADirectlyEmbeddedInterface() + .getUnderlyingType() + .(InterfaceType) + .getAnEmbeddedTypeSetLiteral() + } + + language[monotonicAggregates] + override string pp() { + exists(string comp, string sep1, string ts, string sep2, string meth | + // Note that the interface type underlying `comparable` will be printed + // as `interface { comparable }`, which is not entirely accurate, but + // also better than anything else I can think of. + (if this.isOrEmbedsComparable() then comp = " comparable" else comp = "") and + ts = + concat(TypeSetLiteralType tslit | + tslit = this.getAnEmbeddedTypeSetLiteral() + | + " " + tslit.pp(), ";" + ) and + meth = + concat(string name, Type tp | + tp = this.getMethodType(name) + | + " " + name + " " + tp.pp(), ";" order by name + ) and + (if comp != "" and ts != "" then sep1 = ";" else sep1 = "") and + if + (comp != "" or ts != "") and + meth != "" + then sep2 = ";" + else sep2 = "" + | + result = "interface {" + comp + sep1 + ts + sep2 + meth + " }" + ) + } + + override string toString() { result = "interface type" } +} + +// This predicate is needed for performance reasons. +pragma[noinline] +private predicate hasNoMethods(InterfaceType i) { not i.hasMethod(_, _) } + +/** + * A basic interface type. + * + * A basic interface is an interface that does not specify any type set + * literals, and which does not embed any non-basic interfaces. The special + * interface `comparable` is not a basic interface. + */ +class BasicInterfaceType extends InterfaceType { + BasicInterfaceType() { + not exists(this.getAnEmbeddedTypeSetLiteral()) and + not this.isOrEmbedsComparable() + } + + override string toString() { result = "basic interface type" } +} + +/** + * An empty interface type. + * + * Note that by we have to be careful to exclude the underlying type of + * `comparable`. This is done by extending `BasicInterfaceType`. + */ +class EmptyInterfaceType extends BasicInterfaceType { + EmptyInterfaceType() { hasNoMethods(this) } +} + +/** + * The predeclared `comparable` type. + */ +class ComparableType extends NamedType { + ComparableType() { this.getName() = "comparable" } +} + +/** A tuple type. */ +class TupleType extends @tupletype, CompositeType { + /** Gets the `i`th component type of this tuple type. */ + Type getComponentType(int i) { component_types(this, i, _, result) } + + language[monotonicAggregates] + override string pp() { + result = + "(" + concat(int i, Type tp | tp = this.getComponentType(i) | tp.pp(), ", " order by i) + ")" + } + + override string toString() { result = "tuple type" } +} + +/** A signature type. */ +class SignatureType extends @signaturetype, CompositeType { + /** Gets the `i`th parameter type of this signature type. */ + Type getParameterType(int i) { i >= 0 and component_types(this, i + 1, _, result) } + + /** Gets the `i`th result type of this signature type. */ + Type getResultType(int i) { i >= 0 and component_types(this, -(i + 1), _, result) } + + /** Gets the number of parameters specified by this signature. */ + int getNumParameter() { result = count(int i | exists(this.getParameterType(i))) } + + /** Gets the number of results specified by this signature. */ + int getNumResult() { result = count(int i | exists(this.getResultType(i))) } + + /** Holds if this signature type is variadic. */ + predicate isVariadic() { variadic(this) } + + language[monotonicAggregates] + override string pp() { + result = + "func(" + concat(int i, Type tp | tp = this.getParameterType(i) | tp.pp(), ", " order by i) + + ") " + concat(int i, Type tp | tp = this.getResultType(i) | tp.pp(), ", " order by i) + } + + override string toString() { result = "signature type" } +} + +/** A map type. */ +class MapType extends @maptype, CompositeType { + /** Gets the key type of this map type. */ + Type getKeyType() { key_type(this, result) } + + /** Gets the value type of this map type. */ + Type getValueType() { element_type(this, result) } + + override string pp() { result = "[" + this.getKeyType().pp() + "]" + this.getValueType().pp() } + + override string toString() { result = "map type" } +} + +/** A channel type. */ +class ChanType extends @chantype, CompositeType { + /** Gets the element type of this channel type. */ + Type getElementType() { element_type(this, result) } + + /** Holds if this channel can send data. */ + predicate canSend() { none() } + + /** Holds if this channel can receive data. */ + predicate canReceive() { none() } +} + +/** A channel type that can only send. */ +class SendChanType extends @sendchantype, ChanType { + override predicate canSend() { any() } + + override string pp() { result = "chan<- " + this.getElementType().pp() } + + override string toString() { result = "send-channel type" } +} + +/** A channel type that can only receive. */ +class RecvChanType extends @recvchantype, ChanType { + override predicate canReceive() { any() } + + override string pp() { result = "<-chan " + this.getElementType().pp() } + + override string toString() { result = "receive-channel type" } +} + +/** A channel type that can both send and receive. */ +class SendRecvChanType extends @sendrcvchantype, ChanType { + override predicate canSend() { any() } + + override predicate canReceive() { any() } + + override string pp() { result = "chan " + this.getElementType().pp() } + + override string toString() { result = "send-receive-channel type" } +} + +/** A named type. */ +class NamedType extends @namedtype, CompositeType { + /** Gets the type which this type is defined to be. */ + Type getBaseType() { underlying_type(this, result) } + + override Method getMethod(string m) { + result = CompositeType.super.getMethod(m) + or + methodhosts(result, this) and + result.getName() = m + or + // handle promoted methods + exists(StructType s, Type embedded | + s = this.getBaseType() and + s.hasOwnField(_, _, embedded, true) and + // ensure `m` can be promoted + not s.hasOwnField(_, m, _, _) and + not exists(Method m2 | m2.getReceiverType() = this and m2.getName() = m) + | + // If S contains an embedded field T, the method set of S includes promoted methods with receiver T + result = embedded.getMethod(m) + or + // If S contains an embedded field *T, the method set of S includes promoted methods with receiver T or *T + result = embedded.(PointerType).getBaseType().getMethod(m) + ) + } + + override Type getUnderlyingType() { result = this.getBaseType().getUnderlyingType() } +} + +/** + * A type that implements the builtin interface `error`. + */ +class ErrorType extends Type { + ErrorType() { this.implements(Builtin::error().getType().getUnderlyingType()) } +} + +/** + * Gets the name of a method in the method set of `i`. + * + * This is used to restrict the set of interfaces to consider in the definition of `implements`, + * so it does not matter which method name is chosen (we use the lexicographically least). + */ +private string getExampleMethodName(InterfaceType i) { result = min(string m | i.hasMethod(m, _)) } diff --git a/go/ql/lib/semmle/go/Util.qll b/go/ql/lib/semmle/go/Util.qll new file mode 100644 index 00000000000..ff597cdcc28 --- /dev/null +++ b/go/ql/lib/semmle/go/Util.qll @@ -0,0 +1,18 @@ +/** This module provides general utility classes and predicates. */ + +/** + * A Boolean value. + * + * This is a self-binding convenience wrapper for `boolean`. + */ +class Boolean extends boolean { + Boolean() { this = true or this = false } +} + +/** + * Gets a regexp pattern that matches common top-level domain names. + */ +string commonTLD() { + // according to ranking by http://google.com/search?q=site:.<> + result = "(?:com|org|edu|gov|uk|net|io)(?![a-z0-9])" +} diff --git a/go/ql/lib/semmle/go/VariableWithFields.qll b/go/ql/lib/semmle/go/VariableWithFields.qll new file mode 100644 index 00000000000..adb5e2b308a --- /dev/null +++ b/go/ql/lib/semmle/go/VariableWithFields.qll @@ -0,0 +1,198 @@ +/** Provides the `VariableWithFields` class, for working with variables with a chain of field or element accesses chained to it. */ + +import go + +private newtype TVariableWithFields = + TVariableRoot(Variable v) or + TVariableFieldStep(VariableWithFields base, Field f) { + exists(fieldAccessPathAux(base, f)) or exists(fieldWriteAccessPathAux(base, f)) + } or + TVariableElementStep(VariableWithFields base, string e) { + exists(elementAccessPathAux(base, e)) or exists(elementWriteAccessPathAux(base, e)) + } + +/** + * Gets a representation of the write target `wt` as a variable with fields value if there is one. + */ +private TVariableWithFields writeAccessPath(IR::WriteTarget wt) { + exists(Variable v | wt = v.getAWrite().getLhs() | result = TVariableRoot(v)) + or + exists(VariableWithFields base, Field f | wt = fieldWriteAccessPathAux(base, f) | + result = TVariableFieldStep(base, f) + ) + or + exists(VariableWithFields base, string e | wt = elementWriteAccessPathAux(base, e) | + result = TVariableElementStep(base, e) + ) +} + +/** + * Gets a representation of `insn` as a variable with fields value if there is one. + */ +private TVariableWithFields accessPath(IR::Instruction insn) { + exists(Variable v | insn = v.getARead().asInstruction() | result = TVariableRoot(v)) + or + exists(VariableWithFields base, Field f | insn = fieldAccessPathAux(base, f) | + result = TVariableFieldStep(base, f) + ) + or + exists(VariableWithFields base, string e | insn = elementAccessPathAux(base, e) | + result = TVariableElementStep(base, e) + ) +} + +/** + * Gets an IR instruction that reads a field `f` from a node that is represented + * by variable with fields value `base`. + */ +private IR::Instruction fieldAccessPathAux(TVariableWithFields base, Field f) { + exists(IR::FieldReadInstruction fr, IR::Instruction frb | + fr.getBase() = frb or + fr.getBase() = IR::implicitDerefInstruction(frb.(IR::EvalInstruction).getExpr()) + | + base = accessPath(frb) and + f = fr.getField() and + result = fr + ) +} + +/** + * Gets an IR write target that represents a field `f` from a node that is represented + * by variable with fields value `base`. + */ +private IR::WriteTarget fieldWriteAccessPathAux(TVariableWithFields base, Field f) { + exists(IR::FieldTarget ft, IR::Instruction ftb | + ft.getBase() = ftb or + ft.getBase() = IR::implicitDerefInstruction(ftb.(IR::EvalInstruction).getExpr()) + | + base = accessPath(ftb) and + ft.getField() = f and + result = ft + ) +} + +/** + * Gets an IR instruction that reads an element `e` from a node that is represented + * by variable with fields value `base`. + */ +private IR::Instruction elementAccessPathAux(TVariableWithFields base, string e) { + exists(IR::ElementReadInstruction er, IR::EvalInstruction erb | + er.getBase() = erb or + er.getBase() = IR::implicitDerefInstruction(erb.getExpr()) + | + base = accessPath(erb) and + e = er.getIndex().getExactValue() and + result = er + ) +} + +/** + * Gets an IR write target that represents an element `e` from a node that is represented + * by variable with fields value `base`. + */ +private IR::WriteTarget elementWriteAccessPathAux(TVariableWithFields base, string e) { + exists(IR::ElementTarget et, IR::EvalInstruction etb | + et.getBase() = etb or + et.getBase() = IR::implicitDerefInstruction(etb.getExpr()) + | + base = accessPath(etb) and + e = et.getIndex().getExactValue() and + result = et + ) +} + +/** A variable with zero or more fields or elements read from it. */ +class VariableWithFields extends TVariableWithFields { + /** + * Gets the variable corresponding to the base of this variable with fields. + * + * For example, the variable corresponding to `a` for the variable with fields + * corresponding to `a.b[c]`. + */ + Variable getBaseVariable() { this.getParent*() = TVariableRoot(result) } + + /** + * Gets the variable with fields corresponding to the parent of this variable with fields. + * + * For example, the variable with fields corresponding to `a.b` for the variable with fields + * corresponding to `a.b[c]`. + */ + VariableWithFields getParent() { + exists(VariableWithFields base | + this = TVariableFieldStep(base, _) or this = TVariableElementStep(base, _) + | + result = base + ) + } + + /** Gets a use that refers to this variable with fields. */ + DataFlow::Node getAUse() { this = accessPath(result.asInstruction()) } + + /** Gets the type of this variable with fields. */ + Type getType() { + exists(IR::Instruction acc | this = accessPath(acc) | result = acc.getResultType()) + } + + /** Gets a textual representation of this element. */ + string toString() { + exists(Variable var | this = TVariableRoot(var) | result = "(" + var + ")") + or + exists(VariableWithFields base, Field f | this = TVariableFieldStep(base, f) | + result = base + "." + f.getName() + ) + or + exists(VariableWithFields base, string e | this = TVariableElementStep(base, e) | + result = base + "[" + e + "]" + ) + } + + /** + * Gets the qualified name of the source variable or variable and fields that this represents. + * + * For example, for the variable with fields that represents the field `a.b[c]`, this would get the string + * `"a.b.c"`. + */ + string getQualifiedName() { + exists(Variable v | this = TVariableRoot(v) | result = v.getName()) + or + exists(VariableWithFields base, Field f | this = TVariableFieldStep(base, f) | + result = base.getQualifiedName() + "." + f.getName() + ) + or + exists(VariableWithFields base, string e | this = TVariableElementStep(base, e) | + result = base.getQualifiedName() + "." + e.replaceAll(".", "\\.") + ) + } + + /** + * Gets a write of this variable with fields. + */ + Write getAWrite() { this = writeAccessPath(result.getLhs()) } + + /** + * Gets the field that is the last step of this variable with fields, if any. + * + * For example, the field `c` for the variable with fields `a.b.c`. + */ + Field getField() { this = TVariableFieldStep(_, result) } + + /** + * Gets the element that this variable with fields reads, if any. + * + * For example, the string value of `c` for the variable with fields `a.b[c]`. + */ + string getElement() { this = TVariableElementStep(_, result) } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getBaseVariable().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} diff --git a/go/ql/lib/semmle/go/concepts/GeneratedFile.qll b/go/ql/lib/semmle/go/concepts/GeneratedFile.qll new file mode 100644 index 00000000000..dec6872120c --- /dev/null +++ b/go/ql/lib/semmle/go/concepts/GeneratedFile.qll @@ -0,0 +1,50 @@ +/** Provides a class for generated files. */ + +import go + +/** Provides a class for generated files. */ +module GeneratedFile { + /** + * A file that has been generated. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `GeneratedFile` instead. + */ + abstract class Range extends File { } + + private string generatorCommentRegex() { + result = + [ + "Generated By\\b.*\\bDo not edit", + "This (file|class|interface|art[ei]fact) (was|is|(has been)) (?:auto[ -]?)?gener(e?)ated", + "Any modifications to this file will be lost", + "This (file|class|interface|art[ei]fact) (was|is) (?:mechanically|automatically) generated", + "The following code was (?:auto[ -]?)?generated (?:by|from)", "Autogenerated by Thrift", + "(Code g|G)enerated from .* by ANTLR" + ] + } + + private class CommentHeuristicGeneratedFile extends Range { + CommentHeuristicGeneratedFile() { + exists(Comment c | c.getFile() = this | + c.getText().regexpMatch("(?i).*\\b(" + concat(generatorCommentRegex(), "|") + ")\\b.*") + or + // regular expression recommended for Go code generators + // (https://golang.org/pkg/cmd/go/internal/generate/) + c.getText().regexpMatch("^\\s*Code generated .* DO NOT EDIT\\.\\s*$") + ) + } + } +} + +/** + * A file that has been generated. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `GeneratedFile::Range` instead. + */ +class GeneratedFile extends File { + GeneratedFile::Range self; + + GeneratedFile() { this = self } +} diff --git a/go/ql/lib/semmle/go/concepts/HTTP.qll b/go/ql/lib/semmle/go/concepts/HTTP.qll new file mode 100644 index 00000000000..89a716d4f1a --- /dev/null +++ b/go/ql/lib/semmle/go/concepts/HTTP.qll @@ -0,0 +1,380 @@ +/** + * Provides classes for working with HTTP-related concepts such as requests and responses. + */ + +import go + +/** Provides classes for modeling HTTP-related APIs. */ +module HTTP { + /** Provides a class for modeling new HTTP response-writer APIs. */ + module ResponseWriter { + /** + * A variable that is an HTTP response writer. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::ResponseWriter` instead. + */ + abstract class Range extends Variable { + /** + * Gets a data-flow node that is a use of this response writer. + * + * Note that `PostUpdateNode`s for nodes that this predicate gets do not need to be + * included, as they are handled by the concrete `ResponseWriter`'s `getANode`. + */ + abstract DataFlow::Node getANode(); + } + } + + /** + * A variable that is an HTTP response writer. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::ResponseWriter::Range` instead. + */ + class ResponseWriter extends Variable { + ResponseWriter::Range self; + + ResponseWriter() { this = self } + + /** Gets the body that is written in this HTTP response. */ + ResponseBody getBody() { result.getResponseWriter() = this } + + /** Gets a header write that is written in this HTTP response. */ + HeaderWrite getAHeaderWrite() { result.getResponseWriter() = this } + + /** Gets a redirect that is sent in this HTTP response. */ + Redirect getARedirect() { result.getResponseWriter() = this } + + /** Gets a data-flow node that is a use of this response writer. */ + DataFlow::Node getANode() { + result = self.getANode() or + result.(DataFlow::PostUpdateNode).getPreUpdateNode() = self.getANode() + } + } + + /** Provides a class for modeling new HTTP header-write APIs. */ + module HeaderWrite { + /** + * A data-flow node that represents a write to an HTTP header. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::HeaderWrite` instead. + */ + abstract class Range extends DataFlow::ExprNode { + /** Gets the (lower-case) name of a header set by this definition. */ + string getHeaderName() { result = this.getName().getStringValue().toLowerCase() } + + /** Gets the value of the header set by this definition. */ + string getHeaderValue() { + result = this.getValue().getStringValue() + or + result = this.getValue().getIntValue().toString() + } + + /** Holds if this header write defines the header `header`. */ + predicate definesHeader(string header, string value) { + header = this.getHeaderName() and + value = this.getHeaderValue() + } + + /** + * Gets the node representing the name of the header defined by this write. + * + * Note that a `HeaderWrite` targeting a constant header (e.g. a routine that always + * sets the `Content-Type` header) may not have such a node, so callers should use + * `getHeaderName` in preference to this method). + */ + abstract DataFlow::Node getName(); + + /** Gets the node representing the value of the header defined by this write. */ + abstract DataFlow::Node getValue(); + + /** Gets the response writer associated with this header write, if any. */ + abstract ResponseWriter getResponseWriter(); + } + } + + /** + * A data-flow node that represents a write to an HTTP header. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::HeaderWrite::Range` instead. + */ + class HeaderWrite extends DataFlow::ExprNode { + HeaderWrite::Range self; + + HeaderWrite() { this = self } + + /** Gets the (lower-case) name of a header set by this definition. */ + string getHeaderName() { result = self.getHeaderName() } + + /** Gets the value of the header set by this definition. */ + string getHeaderValue() { result = self.getHeaderValue() } + + /** Holds if this header write defines the header `header`. */ + predicate definesHeader(string header, string value) { self.definesHeader(header, value) } + + /** + * Gets the node representing the name of the header defined by this write. + * + * Note that a `HeaderWrite` targeting a constant header (e.g. a routine that always + * sets the `Content-Type` header) may not have such a node, so callers should use + * `getHeaderName` in preference to this method). + */ + DataFlow::Node getName() { result = self.getName() } + + /** Gets the node representing the value of the header defined by this write. */ + DataFlow::Node getValue() { result = self.getValue() } + + /** Gets the response writer associated with this header write, if any. */ + ResponseWriter getResponseWriter() { result = self.getResponseWriter() } + } + + /** A data-flow node whose value is written to an HTTP header. */ + class Header extends DataFlow::Node { + HeaderWrite hw; + + Header() { + this = hw.getName() + or + this = hw.getValue() + } + + /** Gets the response writer associated with this header write, if any. */ + ResponseWriter getResponseWriter() { result = hw.getResponseWriter() } + } + + /** A data-flow node whose value is written to the value of an HTTP header. */ + class HeaderValue extends Header { + HeaderValue() { this = hw.getValue() } + } + + /** A data-flow node whose value is written to the name of an HTTP header. */ + class HeaderName extends Header { + HeaderName() { this = hw.getName() } + } + + /** Provides a class for modeling new HTTP request-body APIs. */ + module RequestBody { + /** + * An expression representing a reader whose content is written to an HTTP request body. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::RequestBody` instead. + */ + abstract class Range extends DataFlow::Node { } + } + + /** + * An expression representing a reader whose content is written to an HTTP request body. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::RequestBody::Range` instead. + */ + class RequestBody extends DataFlow::Node { + RequestBody::Range self; + + RequestBody() { this = self } + } + + /** Provides a class for modeling new HTTP response-body APIs. */ + module ResponseBody { + /** + * An expression which is written to an HTTP response body. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::ResponseBody` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the response writer associated with this header write, if any. */ + abstract ResponseWriter getResponseWriter(); + + /** Gets a content-type associated with this body. */ + string getAContentType() { + exists(HTTP::HeaderWrite hw | hw = this.getResponseWriter().getAHeaderWrite() | + hw.getHeaderName() = "content-type" and + result = hw.getHeaderValue() + ) + or + result = this.getAContentTypeNode().getStringValue() + } + + /** Gets a dataflow node for a content-type associated with this body. */ + DataFlow::Node getAContentTypeNode() { + exists(HTTP::HeaderWrite hw | hw = this.getResponseWriter().getAHeaderWrite() | + hw.getHeaderName() = "content-type" and + result = hw.getValue() + ) + } + } + } + + /** + * An expression which is written to an HTTP response body. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::ResponseBody::Range` instead. + */ + class ResponseBody extends DataFlow::Node { + ResponseBody::Range self; + + ResponseBody() { this = self } + + /** Gets the response writer associated with this header write, if any. */ + ResponseWriter getResponseWriter() { result = self.getResponseWriter() } + + /** Gets a content-type associated with this body. */ + string getAContentType() { result = self.getAContentType() } + + /** Gets a dataflow node for a content-type associated with this body. */ + DataFlow::Node getAContentTypeNode() { result = self.getAContentTypeNode() } + } + + /** Provides a class for modeling new HTTP template response-body APIs. */ + module TemplateResponseBody { + /** + * An expression which is written to an HTTP response body via a template execution. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::ResponseBody` instead. + */ + abstract class Range extends ResponseBody::Range { + /** Gets the read of the variable inside the template where this value is read. */ + abstract HtmlTemplate::TemplateRead getRead(); + } + } + + /** + * An expression which is written to an HTTP response body via a template execution. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::TemplateResponseBody::Range` instead. + */ + class TemplateResponseBody extends ResponseBody { + override TemplateResponseBody::Range self; + + TemplateResponseBody() { this = self } + + /** Gets the read of the variable inside the template where this value is read. */ + HtmlTemplate::TemplateRead getRead() { result = self.getRead() } + } + + /** Provides a class for modeling new HTTP client request APIs. */ + module ClientRequest { + /** + * A call that performs a request to a URL. + * + * Example: An HTTP POST request is a client request that sends some + * `data` to a `url`, where both the headers and the body of the request + * contribute to the `data`. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::ClientRequest` instead. + */ + abstract class Range extends DataFlow::Node { + /** + * Gets the URL of the request. + */ + abstract DataFlow::Node getUrl(); + } + } + + /** + * A call that performs a request to a URL. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::ClientRequest::Range` instead. + */ + class ClientRequest extends DataFlow::Node { + ClientRequest::Range self; + + ClientRequest() { this = self } + + /** + * Gets the URL of the request. + */ + DataFlow::Node getUrl() { result = self.getUrl() } + } + + /** Provides a class for modeling new HTTP redirect APIs. */ + module Redirect { + /** + * An HTTP redirect. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::Redirect` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the data-flow node representing the URL being redirected to. */ + abstract DataFlow::Node getUrl(); + + /** Gets the response writer that this redirect is sent on, if any. */ + abstract ResponseWriter getResponseWriter(); + } + + /** + * An assignment of the HTTP Location header, which indicates the location for a + * redirect. + */ + private class LocationHeaderSet extends Range, HeaderWrite { + LocationHeaderSet() { this.getHeaderName() = "location" } + + override DataFlow::Node getUrl() { result = this.getValue() } + + override ResponseWriter getResponseWriter() { result = HeaderWrite.super.getResponseWriter() } + } + + /** + * An HTTP request attribute that is generally not attacker-controllable for + * open redirect exploits; for example, a form field submitted in a POST request. + */ + abstract class UnexploitableSource extends DataFlow::Node { } + } + + /** + * An HTTP redirect. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::Redirect::Range` instead. + */ + class Redirect extends DataFlow::Node { + Redirect::Range self; + + Redirect() { this = self } + + /** Gets the data-flow node representing the URL being redirected to. */ + DataFlow::Node getUrl() { result = self.getUrl() } + + /** Gets the response writer that this redirect is sent on, if any. */ + ResponseWriter getResponseWriter() { result = self.getResponseWriter() } + } + + /** Provides a class for modeling new HTTP handler APIs. */ + module RequestHandler { + /** + * An HTTP request handler. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::RequestHandler` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets a node that is used in a check that is tested before this handler is run. */ + abstract predicate guardedBy(DataFlow::Node check); + } + } + + /** + * An HTTP request handler. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::RequestHandler::Range` instead. + */ + class RequestHandler extends DataFlow::Node { + RequestHandler::Range self; + + RequestHandler() { this = self } + + /** Gets a node that is used in a check that is tested before this handler is run. */ + predicate guardedBy(DataFlow::Node check) { self.guardedBy(check) } + } +} diff --git a/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll new file mode 100644 index 00000000000..39b7590d8a3 --- /dev/null +++ b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll @@ -0,0 +1,200 @@ +/** + * Provides classes for working with basic blocks. + */ + +import go +private import ControlFlowGraphImpl + +/** + * Holds if `nd` starts a new basic block. + */ +private predicate startsBB(ControlFlow::Node nd) { + count(nd.getAPredecessor()) != 1 + or + nd.getAPredecessor().isBranch() +} + +/** + * Holds if the first node of basic block `succ` is a control flow + * successor of the last node of basic block `bb`. + */ +private predicate succBB(BasicBlock bb, BasicBlock succ) { succ = bb.getLastNode().getASuccessor() } + +/** + * Holds if the first node of basic block `bb` is a control flow + * successor of the last node of basic block `pre`. + */ +private predicate predBB(BasicBlock bb, BasicBlock pre) { succBB(pre, bb) } + +/** Holds if `bb` is an entry basic block. */ +private predicate entryBB(BasicBlock bb) { bb.getFirstNode().isEntryNode() } + +/** Holds if `bb` is an exit basic block. */ +private predicate exitBB(BasicBlock bb) { bb.getLastNode().isExitNode() } + +cached +private module Internal { + /** + * Holds if `succ` is a control flow successor of `nd` within the same basic block. + */ + private predicate intraBBSucc(ControlFlow::Node nd, ControlFlow::Node succ) { + succ = nd.getASuccessor() and + not startsBB(succ) + } + + /** + * Holds if `nd` is the `i`th node in basic block `bb`. + * + * In other words, `i` is the shortest distance from a node `bb` + * that starts a basic block to `nd` along the `intraBBSucc` relation. + */ + cached + predicate bbIndex(BasicBlock bb, ControlFlow::Node nd, int i) = + shortestDistances(startsBB/1, intraBBSucc/2)(bb, nd, i) + + cached + int bbLength(BasicBlock bb) { result = strictcount(ControlFlow::Node nd | bbIndex(bb, nd, _)) } + + cached + predicate reachableBB(BasicBlock bb) { + entryBB(bb) + or + exists(BasicBlock predBB | succBB(predBB, bb) | reachableBB(predBB)) + } +} + +private import Internal + +/** Holds if `dom` is an immediate dominator of `bb`. */ +cached +private predicate bbIDominates(BasicBlock dom, BasicBlock bb) = + idominance(entryBB/1, succBB/2)(_, dom, bb) + +/** Holds if `dom` is an immediate post-dominator of `bb`. */ +cached +private predicate bbIPostDominates(BasicBlock dom, BasicBlock bb) = + idominance(exitBB/1, predBB/2)(_, dom, bb) + +/** + * A basic block, that is, a maximal straight-line sequence of control flow nodes + * without branches or joins. + * + * At the database level, a basic block is represented by its first control flow node. + */ +class BasicBlock extends TControlFlowNode { + BasicBlock() { startsBB(this) } + + /** Gets a basic block succeeding this one. */ + BasicBlock getASuccessor() { succBB(this, result) } + + /** Gets a basic block preceding this one. */ + BasicBlock getAPredecessor() { result.getASuccessor() = this } + + /** Gets a node in this block. */ + ControlFlow::Node getANode() { result = getNode(_) } + + /** Gets the node at the given position in this block. */ + ControlFlow::Node getNode(int pos) { bbIndex(this, result, pos) } + + /** Gets the first node in this block. */ + ControlFlow::Node getFirstNode() { result = this } + + /** Gets the last node in this block. */ + ControlFlow::Node getLastNode() { result = getNode(length() - 1) } + + /** Gets the length of this block. */ + int length() { result = bbLength(this) } + + /** Gets the basic block that immediately dominates this basic block. */ + ReachableBasicBlock getImmediateDominator() { bbIDominates(result, this) } + + /** Gets the innermost function or file to which this basic block belongs. */ + ControlFlow::Root getRoot() { result = getFirstNode().getRoot() } + + /** Gets a textual representation of this basic block. */ + string toString() { result = "basic block" } + + /** + * Holds if this basic block is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + getFirstNode().hasLocationInfo(filepath, startline, startcolumn, _, _) and + getLastNode().hasLocationInfo(_, _, _, endline, endcolumn) + } +} + +/** + * An entry basic block, that is, a basic block whose first node is an entry node. + */ +class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { entryBB(this) } +} + +/** + * A basic block that is reachable from an entry basic block. + */ +class ReachableBasicBlock extends BasicBlock { + ReachableBasicBlock() { reachableBB(this) } + + /** + * Holds if this basic block strictly dominates `bb`. + */ + cached + predicate strictlyDominates(ReachableBasicBlock bb) { bbIDominates+(this, bb) } + + /** + * Holds if this basic block dominates `bb`. + * + * This predicate is reflexive: each reachable basic block dominates itself. + */ + predicate dominates(ReachableBasicBlock bb) { + bb = this or + strictlyDominates(bb) + } + + /** + * Holds if this basic block strictly post-dominates `bb`. + */ + cached + predicate strictlyPostDominates(ReachableBasicBlock bb) { bbIPostDominates+(this, bb) } + + /** + * Holds if this basic block post-dominates `bb`. + * + * This predicate is reflexive: each reachable basic block post-dominates itself. + */ + predicate postDominates(ReachableBasicBlock bb) { + bb = this or + strictlyPostDominates(bb) + } +} + +/** + * A reachable basic block with more than one predecessor. + */ +class ReachableJoinBlock extends ReachableBasicBlock { + ReachableJoinBlock() { getFirstNode().isJoin() } + + /** + * Holds if this basic block belongs to the dominance frontier of `b`, that is + * `b` dominates a predecessor of this block, but not this block itself. + * + * Algorithm from Cooper et al., "A Simple, Fast Dominance Algorithm" (Figure 5), + * who in turn attribute it to Ferrante et al., "The program dependence graph and + * its use in optimization". + */ + predicate inDominanceFrontierOf(ReachableBasicBlock b) { + b = getAPredecessor() and not b = getImmediateDominator() + or + exists(ReachableBasicBlock prev | inDominanceFrontierOf(prev) | + b = prev.getImmediateDominator() and + not b = getImmediateDominator() + ) + } +} diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll new file mode 100644 index 00000000000..51e03de3ab7 --- /dev/null +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -0,0 +1,290 @@ +/** + * Provides classes for working with a CFG-based program representation. + */ + +import go +private import ControlFlowGraphImpl + +/** Provides helper predicates for mapping btween CFG nodes and the AST. */ +module ControlFlow { + /** A file or function with which a CFG is associated. */ + class Root extends AstNode { + Root() { exists(this.(File).getADecl()) or exists(this.(FuncDef).getBody()) } + + /** Holds if `nd` belongs to this file or function. */ + predicate isRootOf(AstNode nd) { + this = nd.getEnclosingFunction() + or + not exists(nd.getEnclosingFunction()) and + this = nd.getFile() + } + + /** Gets the synthetic entry node of the CFG for this file or function. */ + EntryNode getEntryNode() { result = ControlFlow::entryNode(this) } + + /** Gets the synthetic exit node of the CFG for this file or function. */ + ExitNode getExitNode() { result = ControlFlow::exitNode(this) } + } + + /** + * A node in the intra-procedural control-flow graph of a Go function or file. + * + * Nodes correspond to expressions and statements that compute a value or perform + * an operation (as opposed to providing syntactic structure or type information). + * + * There are also synthetic entry and exit nodes for each Go function and file + * that mark the beginning and the end, respectively, of the execution of the + * function and the loading of the file. + */ + class Node extends TControlFlowNode { + /** Gets a node that directly follows this one in the control-flow graph. */ + Node getASuccessor() { result = CFG::succ(this) } + + /** Gets a node that directly precedes this one in the control-flow graph. */ + Node getAPredecessor() { this = result.getASuccessor() } + + /** Holds if this is a node with more than one successor. */ + predicate isBranch() { strictcount(getASuccessor()) > 1 } + + /** Holds if this is a node with more than one predecessor. */ + predicate isJoin() { strictcount(getAPredecessor()) > 1 } + + /** Holds if this is the first control-flow node in `subtree`. */ + predicate isFirstNodeOf(AstNode subtree) { CFG::firstNode(subtree, this) } + + /** Holds if this node is the (unique) entry node of a function or file. */ + predicate isEntryNode() { this instanceof MkEntryNode } + + /** Holds if this node is the (unique) exit node of a function or file. */ + predicate isExitNode() { this instanceof MkExitNode } + + /** Gets the basic block to which this node belongs. */ + BasicBlock getBasicBlock() { result.getANode() = this } + + /** Holds if this node dominates `dominee` in the control-flow graph. */ + pragma[inline] + predicate dominatesNode(ControlFlow::Node dominee) { + exists(ReachableBasicBlock thisbb, ReachableBasicBlock dbb, int i, int j | + this = thisbb.getNode(i) and dominee = dbb.getNode(j) + | + thisbb.strictlyDominates(dbb) + or + thisbb = dbb and i <= j + ) + } + + /** Gets the innermost function or file to which this node belongs. */ + Root getRoot() { none() } + + /** Gets the file to which this node belongs. */ + File getFile() { hasLocationInfo(result.getAbsolutePath(), _, _, _, _) } + + /** + * Gets a textual representation of this control flow node. + */ + string toString() { result = "control-flow node" } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } + } + + /** + * A control-flow node that initializes or updates the value of a constant, a variable, + * a field, or an (array, slice, or map) element. + */ + class WriteNode extends Node { + IR::WriteInstruction self; + + WriteNode() { this = self } + + /** Gets the left-hand side of this write. */ + IR::WriteTarget getLhs() { result = self.getLhs() } + + /** Gets the right-hand side of this write. */ + DataFlow::Node getRhs() { self.getRhs() = result.asInstruction() } + + /** Holds if this node sets variable or constant `v` to `rhs`. */ + predicate writes(ValueEntity v, DataFlow::Node rhs) { self.writes(v, rhs.asInstruction()) } + + /** Holds if this node defines SSA variable `v` to be `rhs`. */ + predicate definesSsaVariable(SsaVariable v, DataFlow::Node rhs) { + self.getLhs().asSsaVariable() = v and + self.getRhs() = rhs.asInstruction() + } + + /** + * Holds if this node sets the value of field `f` on `base` (or its implicit dereference) to + * `rhs`. + * + * For example, for the assignment `x.width = newWidth`, `base` is either the data-flow node + * corresponding to `x` or (if `x` is a pointer) the data-flow node corresponding to the + * implicit dereference `*x`, `f` is the field referenced by `width`, and `rhs` is the data-flow + * node corresponding to `newWidth`. + */ + predicate writesField(DataFlow::Node base, Field f, DataFlow::Node rhs) { + exists(IR::FieldTarget trg | trg = self.getLhs() | + ( + trg.getBase() = base.asInstruction() or + trg.getBase() = MkImplicitDeref(base.asExpr()) + ) and + trg.getField() = f and + self.getRhs() = rhs.asInstruction() + ) + } + + /** + * Holds if this node sets the value of element `index` on `base` (or its implicit dereference) + * to `rhs`. + * + * For example, for the assignment `xs[i] = v`, `base` is either the data-flow node + * corresponding to `xs` or (if `xs` is a pointer) the data-flow node corresponding to the + * implicit dereference `*xs`, `index` is the data-flow node corresponding to `i`, and `rhs` + * is the data-flow node corresponding to `base`. + */ + predicate writesElement(DataFlow::Node base, DataFlow::Node index, DataFlow::Node rhs) { + exists(IR::ElementTarget trg | trg = self.getLhs() | + ( + trg.getBase() = base.asInstruction() or + trg.getBase() = MkImplicitDeref(base.asExpr()) + ) and + trg.getIndex() = index.asInstruction() and + self.getRhs() = rhs.asInstruction() + ) + } + + /** + * Holds if this node sets any field or element of `base` to `rhs`. + */ + predicate writesComponent(DataFlow::Node base, DataFlow::Node rhs) { + writesElement(base, _, rhs) or writesField(base, _, rhs) + } + } + + /** + * A control-flow node recording the fact that a certain expression has a known + * Boolean value at this point in the program. + */ + class ConditionGuardNode extends IR::Instruction, MkConditionGuardNode { + Expr cond; + boolean outcome; + + ConditionGuardNode() { this = MkConditionGuardNode(cond, outcome) } + + private predicate ensuresAux(Expr expr, boolean b) { + expr = cond and b = outcome + or + expr = any(ParenExpr par | ensuresAux(par, b)).getExpr() + or + expr = any(NotExpr ne | ensuresAux(ne, b.booleanNot())).getOperand() + or + expr = any(LandExpr land | ensuresAux(land, true)).getAnOperand() and + b = true + or + expr = any(LorExpr lor | ensuresAux(lor, false)).getAnOperand() and + b = false + } + + /** Holds if this guard ensures that the result of `nd` is `b`. */ + predicate ensures(DataFlow::Node nd, boolean b) { + ensuresAux(any(Expr e | nd = DataFlow::exprNode(e)), b) + } + + /** Holds if this guard ensures that `lesser <= greater + bias` holds. */ + predicate ensuresLeq(DataFlow::Node lesser, DataFlow::Node greater, int bias) { + exists(DataFlow::RelationalComparisonNode rel, boolean b | + ensures(rel, b) and + rel.leq(b, lesser, greater, bias) + ) + or + ensuresEq(lesser, greater) and + bias = 0 + } + + /** Holds if this guard ensures that `i = j` holds. */ + predicate ensuresEq(DataFlow::Node i, DataFlow::Node j) { + exists(DataFlow::EqualityTestNode eq, boolean b | + ensures(eq, b) and + eq.eq(b, i, j) + ) + } + + /** Holds if this guard ensures that `i != j` holds. */ + predicate ensuresNeq(DataFlow::Node i, DataFlow::Node j) { + exists(DataFlow::EqualityTestNode eq, boolean b | + ensures(eq, b.booleanNot()) and + eq.eq(b, i, j) + ) + } + + /** + * Holds if this guard dominates basic block `bb`, that is, the guard + * is known to hold at `bb`. + */ + predicate dominates(ReachableBasicBlock bb) { + this = bb.getANode() or + dominates(bb.getImmediateDominator()) + } + + /** + * Gets the condition whose outcome the guard concerns. + */ + Expr getCondition() { result = cond } + + override Root getRoot() { result.isRootOf(cond) } + + override string toString() { result = cond + " is " + outcome } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + cond.hasLocationInfo(filepath, _, _, startline, startcolumn) and + endline = startline and + endcolumn = startcolumn + } + } + + /** + * Gets the entry node of function or file `root`. + */ + Node entryNode(Root root) { result = MkEntryNode(root) } + + /** + * Gets the exit node of function or file `root`. + */ + Node exitNode(Root root) { result = MkExitNode(root) } + + /** + * Holds if the function `f` may return without panicking, exiting the process, or looping forever. + * + * This is defined conservatively, and so may also hold of a function that in fact + * cannot return normally, but never fails to hold of a function that can return normally. + */ + predicate mayReturnNormally(FuncDecl f) { CFG::mayReturnNormally(f.getBody()) } + + /** + * Holds if `pred` is the node for the case `testExpr` in an expression + * switch statement which is switching on `switchExpr`, and `succ` is the + * node to be executed next if the case test succeeds. + */ + predicate isSwitchCaseTestPassingEdge( + ControlFlow::Node pred, ControlFlow::Node succ, Expr switchExpr, Expr testExpr + ) { + CFG::isSwitchCaseTestPassingEdge(pred, succ, switchExpr, testExpr) + } +} + +class Write = ControlFlow::WriteNode; diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll new file mode 100644 index 00000000000..25137f75a96 --- /dev/null +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -0,0 +1,2080 @@ +/** + * INTERNAL: Analyses should use module `ControlFlowGraph` instead. + * + * Provides predicates for building intra-procedural CFGs. + */ + +import go + +/** A block statement that is not the body of a `switch` or `select` statement. */ +class PlainBlock extends BlockStmt { + PlainBlock() { + not this = any(SwitchStmt sw).getBody() and not this = any(SelectStmt sel).getBody() + } +} + +private predicate notBlankIdent(Expr e) { not e instanceof BlankIdent } + +private predicate pureLvalue(ReferenceExpr e) { not e.isRvalue() } + +/** + * Holds if `e` is a branch condition, including the LHS of a short-circuiting binary operator. + */ +private predicate isCondRoot(Expr e) { + e = any(LogicalBinaryExpr lbe).getLeftOperand() + or + e = any(ForStmt fs).getCond() + or + e = any(IfStmt is).getCond() + or + e = any(ExpressionSwitchStmt ess | not exists(ess.getExpr())).getACase().getAnExpr() +} + +/** + * Holds if `e` is a branch condition or part of a logical binary expression contributing to a + * branch condition. + * + * For example, in `v := (x && y) || (z && w)`, `x` and `(x && y)` and `z` are branch conditions + * (`isCondRoot` holds of them), whereas this predicate also holds of `y` (contributes to condition + * `x && y`) but not of `w` (contributes to the value `v`, but not to any branch condition). + * + * In the context `if (x && y) || (z && w)` then the whole `(x && y) || (z && w)` is a branch condition + * as well as `x` and `(x && y)` and `z` as previously, and this predicate holds of all their + * subexpressions. + */ +private predicate isCond(Expr e) { + isCondRoot(e) or + e = any(LogicalBinaryExpr lbe | isCond(lbe)).getRightOperand() or + e = any(ParenExpr par | isCond(par)).getExpr() +} + +/** + * Holds if `e` implicitly reads the embedded field `implicitField`. + * + * The `index` is the distance from the promoted field. For example, if `A` contains an embedded + * field `B`, `B` contains an embedded field `C` and `C` contains the non-embedded field `x`. + * Then `a.x` implicitly reads `C` with index 1 and `B` with index 2. + */ +private predicate implicitFieldSelectionForField(PromotedSelector e, int index, Field implicitField) { + exists(StructType baseType, PromotedField child, int implicitFieldDepth | + baseType = e.getSelectedStructType() and + ( + e.refersTo(child) + or + implicitFieldSelectionForField(e, implicitFieldDepth + 1, child) + ) + | + child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and + exists(PromotedField explicitField, int explicitFieldDepth | + e.refersTo(explicitField) and baseType.getFieldAtDepth(_, explicitFieldDepth) = explicitField + | + index = explicitFieldDepth - implicitFieldDepth + ) + ) +} + +private predicate implicitFieldSelectionForMethod(PromotedSelector e, int index, Field implicitField) { + exists(StructType baseType, PromotedMethod method, int mDepth, int implicitFieldDepth | + baseType = e.getSelectedStructType() and + e.refersTo(method) and + baseType.getMethodAtDepth(_, mDepth) = method and + index = mDepth - implicitFieldDepth + | + method = baseType.getMethodOfEmbedded(implicitField, _, implicitFieldDepth + 1) + or + exists(PromotedField child | + child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and + implicitFieldSelectionForMethod(e, implicitFieldDepth + 1, child) + ) + ) +} + +/** + * A node in the intra-procedural control-flow graph of a Go function or file. + * + * There are two kinds of control-flow nodes: + * + * 1. Instructions: these are nodes that correspond to expressions and statements + * that compute a value or perform an operation (as opposed to providing syntactic + * structure or type information). + * 2. Synthetic nodes: + * - Entry and exit nodes for each Go function and file that mark the beginning and the end, + * respectively, of the execution of the function and the loading of the file; + * - Skip nodes that are semantic no-ops, but make CFG construction easier. + */ +cached +newtype TControlFlowNode = + /** + * A control-flow node that represents the evaluation of an expression. + */ + MkExprNode(Expr e) { CFG::hasEvaluationNode(e) } or + /** + * A control-flow node that represents the initialization of an element of a composite literal. + */ + MkLiteralElementInitNode(Expr e) { e = any(CompositeLit lit).getAnElement() } or + /** + * A control-flow node that represents the implicit index of an element in a slice or array literal. + */ + MkImplicitLiteralElementIndex(Expr e) { + exists(CompositeLit lit | not lit instanceof StructLit | + e = lit.getAnElement() and + not e instanceof KeyValueExpr + ) + } or + /** + * A control-flow node that represents a (single) assignment. + * + * Assignments with multiple left-hand sides are split up into multiple assignment nodes, + * one for each left-hand side. Assignments to `_` are not represented in the control-flow graph. + */ + MkAssignNode(AstNode assgn, int i) { + // the `i`th assignment in a (possibly multi-)assignment + notBlankIdent(assgn.(Assignment).getLhs(i)) + or + // the `i`th name declared in a (possibly multi-)declaration specifier + notBlankIdent(assgn.(ValueSpec).getNameExpr(i)) + or + // the assignment to the "key" variable in a `range` statement + notBlankIdent(assgn.(RangeStmt).getKey()) and i = 0 + or + // the assignment to the "value" variable in a `range` statement + notBlankIdent(assgn.(RangeStmt).getValue()) and i = 1 + } or + /** + * A control-flow node that represents the implicit right-hand side of a compound assignment. + * + * For example, the compound assignment `x += 1` has an implicit right-hand side `x + 1`. + */ + MkCompoundAssignRhsNode(CompoundAssignStmt assgn) or + /** + * A control-flow node that represents the `i`th component of a tuple expression `s`. + */ + MkExtractNode(AstNode s, int i) { + // in an assignment `x, y, z = tuple` + exists(Assignment assgn | + s = assgn and + exists(assgn.getRhs()) and + assgn.getNumLhs() > 1 and + exists(assgn.getLhs(i)) + ) + or + // in a declaration `var x, y, z = tuple` + exists(ValueSpec spec | + s = spec and + exists(spec.getInit()) and + spec.getNumName() > 1 and + exists(spec.getNameExpr(i)) + ) + or + // in a `range` statement + exists(RangeStmt rs | s = rs | + exists(rs.getKey()) and i = 0 + or + exists(rs.getValue()) and i = 1 + ) + or + // in a return statement `return f()` where `f` has multiple return values + exists(ReturnStmt ret, SignatureType rettp | + s = ret and + // the return statement has a single expression + exists(ret.getExpr()) and + // but the enclosing function has multiple results + rettp = ret.getEnclosingFunction().getType() and + rettp.getNumResult() > 1 and + exists(rettp.getResultType(i)) + ) + or + // in a call `f(g())` where `g` has multiple return values + exists(CallExpr outer, CallExpr inner | s = outer | + inner = outer.getArgument(0).stripParens() and + outer.getNumArgument() = 1 and + exists(inner.getType().(TupleType).getComponentType(i)) + ) + } or + /** + * A control-flow node that represents the zero value to which a variable without an initializer + * expression is initialized. + */ + MkZeroInitNode(ValueEntity v) { + exists(ValueSpec spec, int i | + not exists(spec.getAnInit()) and + spec.getNameExpr(i) = v.getDeclaration() + ) + or + exists(v.(ResultVariable).getFunction().getBody()) + } or + /** + * A control-flow node that represents a function declaration. + */ + MkFuncDeclNode(FuncDecl fd) or + /** + * A control-flow node that represents a `defer` statement. + */ + MkDeferNode(DeferStmt def) or + /** + * A control-flow node that represents a `go` statement. + */ + MkGoNode(GoStmt go) or + /** + * A control-flow node that represents the fact that `e` is known to evaluate to + * `outcome`. + */ + MkConditionGuardNode(Expr e, Boolean outcome) { isCondRoot(e) } or + /** + * A control-flow node that represents an increment or decrement statement. + */ + MkIncDecNode(IncDecStmt ids) or + /** + * A control-flow node that represents the implicit right-hand side of an increment or decrement statement. + */ + MkIncDecRhs(IncDecStmt ids) or + /** + * A control-flow node that represents the implicit operand 1 of an increment or decrement statement. + */ + MkImplicitOne(IncDecStmt ids) or + /** + * A control-flow node that represents a return from a function. + */ + MkReturnNode(ReturnStmt ret) or + /** + * A control-flow node that represents the implicit write to a named result variable in a return statement. + */ + MkResultWriteNode(ResultVariable var, int i, ReturnStmt ret) { + ret.getEnclosingFunction().getResultVar(i) = var and + exists(ret.getAnExpr()) + } or + /** + * A control-flow node that represents the implicit read of a named result variable upon returning from + * a function (after any deferred calls have been executed). + */ + MkResultReadNode(ResultVariable var) or + /** + * A control-flow node that represents a no-op. + * + * These control-flow nodes correspond to Go statements that have no runtime semantics other than potentially + * influencing control flow: the branching statements `continue`, `break`, `fallthrough` and `goto`; empty + * blocks; empty statements; and import and type declarations. + */ + MkSkipNode(AstNode skip) { + skip instanceof BranchStmt + or + skip instanceof EmptyStmt + or + skip.(PlainBlock).getNumStmt() = 0 + or + skip instanceof ImportDecl + or + skip instanceof TypeDecl + or + pureLvalue(skip) + or + skip.(CaseClause).getNumStmt() = 0 + or + skip.(CommClause).getNumStmt() = 0 + } or + /** + * A control-flow node that represents a `select` operation. + */ + MkSelectNode(SelectStmt sel) or + /** + * A control-flow node that represents a `send` operation. + */ + MkSendNode(SendStmt send) or + /** + * A control-flow node that represents the initialization of a parameter to its corresponding argument. + */ + MkParameterInit(Parameter parm) { exists(parm.getFunction().getBody()) } or + /** + * A control-flow node that represents the argument corresponding to a parameter. + */ + MkArgumentNode(Parameter parm) { exists(parm.getFunction().getBody()) } or + /** + * A control-flow node that represents the initialization of a result variable to its zero value. + */ + MkResultInit(ResultVariable rv) { exists(rv.getFunction().getBody()) } or + /** + * A control-flow node that represents the operation of retrieving the next (key, value) pair in a + * `range` statement, if any. + */ + MkNextNode(RangeStmt rs) or + /** + * A control-flow node that represents the implicit `true` expression in `switch { ... }`. + */ + MkImplicitTrue(ExpressionSwitchStmt stmt) { not exists(stmt.getExpr()) } or + /** + * A control-flow node that represents the implicit comparison or type check performed by + * the `i`th expression of a case clause `cc`. + */ + MkCaseCheckNode(CaseClause cc, int i) { exists(cc.getExpr(i)) } or + /** + * A control-flow node that represents the implicit lower bound of a slice expression. + */ + MkImplicitLowerSliceBound(SliceExpr sl) { not exists(sl.getLow()) } or + /** + * A control-flow node that represents the implicit upper bound of a simple slice expression. + */ + MkImplicitUpperSliceBound(SliceExpr sl) { not exists(sl.getHigh()) } or + /** + * A control-flow node that represents the implicit max bound of a simple slice expression. + */ + MkImplicitMaxSliceBound(SliceExpr sl) { not exists(sl.getMax()) } or + /** + * A control-flow node that represents the implicit dereference of the base in a field/method + * access, element access, or slice expression. + */ + MkImplicitDeref(Expr e) { + e.getType().getUnderlyingType() instanceof PointerType and + ( + exists(SelectorExpr sel | e = sel.getBase() | + // field accesses through a pointer always implicitly dereference + sel = any(Field f).getAReference() + or + // method accesses only dereference if the receiver is _not_ a pointer + exists(Method m, Type tp | + sel = m.getAReference() and + tp = m.getReceiver().getType().getUnderlyingType() and + not tp instanceof PointerType + ) + ) + or + e = any(IndexExpr ie).getBase() + or + e = any(SliceExpr se).getBase() + ) + } or + /** + * A control-flow node that represents the implicit selection of a field when + * accessing a promoted field. + * + * If that field has a pointer type then this control-flow node also + * represents an implicit dereference of it. + */ + MkImplicitFieldSelection(PromotedSelector e, int i, Field implicitField) { + implicitFieldSelectionForField(e, i, implicitField) or + implicitFieldSelectionForMethod(e, i, implicitField) + } or + /** + * A control-flow node that represents the start of the execution of a function or file. + */ + MkEntryNode(ControlFlow::Root root) or + /** + * A control-flow node that represents the end of the execution of a function or file. + */ + MkExitNode(ControlFlow::Root root) + +/** A representation of the target of a write. */ +newtype TWriteTarget = + /** A write target that is represented explicitly in the AST. */ + MkLhs(TControlFlowNode write, Expr lhs) { + exists(AstNode assgn, int i | write = MkAssignNode(assgn, i) | + lhs = assgn.(Assignment).getLhs(i).stripParens() + or + lhs = assgn.(ValueSpec).getNameExpr(i) + or + exists(RangeStmt rs | rs = assgn | + i = 0 and lhs = rs.getKey().stripParens() + or + i = 1 and lhs = rs.getValue().stripParens() + ) + ) + or + exists(IncDecStmt ids | write = MkIncDecNode(ids) | lhs = ids.getOperand().stripParens()) + or + exists(Parameter parm | write = MkParameterInit(parm) | lhs = parm.getDeclaration()) + or + exists(ResultVariable res | write = MkResultInit(res) | lhs = res.getDeclaration()) + } or + /** A write target for an element in a compound literal, viewed as a field write. */ + MkLiteralElementTarget(MkLiteralElementInitNode elt) or + /** A write target for a returned expression, viewed as a write to the corresponding result variable. */ + MkResultWriteTarget(MkResultWriteNode w) + +/** + * A control-flow node that represents a no-op. + * + * These control-flow nodes correspond to Go statements that have no runtime semantics other than + * potentially influencing control flow: the branching statements `continue`, `break`, + * `fallthrough` and `goto`; empty blocks; empty statements; and import and type declarations. + */ +class SkipNode extends ControlFlow::Node, MkSkipNode { + AstNode skip; + + SkipNode() { this = MkSkipNode(skip) } + + override ControlFlow::Root getRoot() { result.isRootOf(skip) } + + override string toString() { result = "skip" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + skip.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * A control-flow node that represents the start of the execution of a function or file. + */ +class EntryNode extends ControlFlow::Node, MkEntryNode { + ControlFlow::Root root; + + EntryNode() { this = MkEntryNode(root) } + + override ControlFlow::Root getRoot() { result = root } + + override string toString() { result = "entry" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + root.hasLocationInfo(filepath, startline, startcolumn, _, _) and + endline = startline and + endcolumn = startcolumn + } +} + +/** + * A control-flow node that represents the end of the execution of a function or file. + */ +class ExitNode extends ControlFlow::Node, MkExitNode { + ControlFlow::Root root; + + ExitNode() { this = MkExitNode(root) } + + override ControlFlow::Root getRoot() { result = root } + + override string toString() { result = "exit" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + root.hasLocationInfo(filepath, _, _, endline, endcolumn) and + endline = startline and + endcolumn = startcolumn + } +} + +/** + * Provides classes and predicates for computing the control-flow graph. + */ +cached +module CFG { + /** + * The target of a branch statement, which is either the label of a labeled statement or + * the special target `""` referring to the innermost enclosing loop or `switch`. + */ + private class BranchTarget extends string { + BranchTarget() { this = any(LabeledStmt ls).getLabel() or this = "" } + } + + private module BranchTarget { + /** Holds if this is the target of branch statement `stmt` or the label of compound statement `stmt`. */ + BranchTarget of(Stmt stmt) { + exists(BranchStmt bs | bs = stmt | + result = bs.getLabel() + or + not exists(bs.getLabel()) and result = "" + ) + or + exists(LabeledStmt ls | stmt = ls.getStmt() | result = ls.getLabel()) + or + (stmt instanceof LoopStmt or stmt instanceof SwitchStmt or stmt instanceof SelectStmt) and + result = "" + } + } + + private newtype TCompletion = + /** A completion indicating that an expression or statement was evaluated successfully. */ + Done() or + /** + * A completion indicating that an expression was successfully evaluated to Boolean value `b`. + * + * Note that many Boolean expressions are modeled as having completion `Done()` instead. + * Completion `Bool` is only used in contexts where the Boolean value can be determined. + */ + Bool(boolean b) { b = true or b = false } or + /** + * A completion indicating that execution of a (compound) statement ended with a `break` + * statement targeting the given label. + */ + Break(BranchTarget lbl) or + /** + * A completion indicating that execution of a (compound) statement ended with a `continue` + * statement targeting the given label. + */ + Continue(BranchTarget lbl) or + /** + * A completion indicating that execution of a (compound) statement ended with a `fallthrough` + * statement. + */ + Fallthrough() or + /** + * A completion indicating that execution of a (compound) statement ended with a `return` + * statement. + */ + Return() or + /** + * A completion indicating that execution of a statement or expression may have ended with + * a panic being raised. + */ + Panic() + + private Completion normalCompletion() { result.isNormal() } + + private class Completion extends TCompletion { + predicate isNormal() { this = Done() or this = Bool(_) } + + Boolean getOutcome() { this = Done() or this = Bool(result) } + + string toString() { + this = Done() and result = "normal" + or + exists(boolean b | this = Bool(b) | result = b.toString()) + or + exists(BranchTarget lbl | + this = Break(lbl) and result = "break " + lbl + or + this = Continue(lbl) and result = "continue " + lbl + ) + or + this = Fallthrough() and result = "fallthrough" + or + this = Return() and result = "return" + or + this = Panic() and result = "panic" + } + } + + /** + * Holds if `e` should have an evaluation node in the control-flow graph. + * + * Excluded expressions include those not evaluated at runtime (e.g. identifiers, type expressions) + * and some logical expressions that are expressed as control-flow edges rather than having a specific + * evaluation node. + */ + cached + predicate hasEvaluationNode(Expr e) { + // exclude expressions that do not denote a value + not e instanceof TypeExpr and + not e = any(FieldDecl f).getTag() and + not e instanceof KeyValueExpr and + not e = any(SelectorExpr sel).getSelector() and + not e = any(StructLit sl).getKey(_) and + not (e instanceof Ident and not e instanceof ReferenceExpr) and + not (e instanceof SelectorExpr and not e instanceof ReferenceExpr) and + not pureLvalue(e) and + // exclude parentheses, which are purely concrete syntax, and some logical binary expressions + // whose evaluation is implied by control-flow edges without requiring an evaluation node. + not isControlFlowStructural(e) and + // exclude expressions that are not evaluated at runtime + not e = any(ImportSpec is).getPathExpr() and + not e.getParent*() = any(ArrayTypeExpr ate).getLength() and + // sub-expressions of constant expressions are not evaluated (even if they don't look constant + // themselves) + not constRoot(e.getParent+()) + } + + /** + * Holds if `e` is an expression that purely serves grouping or control-flow purposes. + * + * Examples include parenthesized expressions and short-circuiting Boolean expressions used within + * a branch condition (`if` or `for` condition, or as part of a larger boolean expression, e.g. + * in `(x && y) || z`, the `&&` subexpression matches this predicate). + */ + private predicate isControlFlowStructural(Expr e) { + // Some logical binary operators do not need an evaluation node + // (for example, in `if x && y`, we evaluate `x` and then branch straight to either `y` or the + // `else` block, so there is no control-flow step where `x && y` is specifically calculated) + e instanceof LogicalBinaryExpr and + isCond(e) + or + // Purely concrete-syntactic structural expression: + e instanceof ParenExpr + } + + /** + * Gets a constant root, that is, an expression that is constant but whose parent expression is not. + * + * As an exception to the latter, for a control-flow structural expression such as `(c1)` or `c1 && c2` + * where `cn` are constants we still consider the `cn`s to be a constant roots, even though their parent + * expression is also constant. + */ + private predicate constRoot(Expr root) { + exists(Expr c | + c.isConst() and + not c.getParent().(Expr).isConst() and + root = stripStructural(c) + ) + } + + /** + * Strips off any control-flow structural components from `e`. + */ + private Expr stripStructural(Expr e) { + if isControlFlowStructural(e) then result = stripStructural(e.getAChildExpr()) else result = e + } + + private class ControlFlowTree extends AstNode { + predicate firstNode(ControlFlow::Node first) { none() } + + predicate lastNode(ControlFlow::Node last, Completion cmpl) { + // propagate abnormal completion from children + lastNode(this.getAChild(), last, cmpl) and + not cmpl.isNormal() + } + + predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(int i | + lastNode(this.getChildTreeRanked(i), pred, normalCompletion()) and + firstNode(this.getChildTreeRanked(i + 1), succ) + ) + } + + final ControlFlowTree getChildTreeRanked(int i) { + exists(int j | + result = this.getChildTree(j) and + j = rank[i + 1](int k | exists(this.getChildTree(k))) + ) + } + + ControlFlowTree getFirstChildTree() { result = this.getChildTreeRanked(0) } + + ControlFlowTree getLastChildTree() { + result = max(ControlFlowTree ch, int j | ch = this.getChildTree(j) | ch order by j) + } + + ControlFlowTree getChildTree(int i) { none() } + } + + private class AtomicTree extends ControlFlowTree { + ControlFlow::Node nd; + Completion cmpl; + + AtomicTree() { + exists(Expr e | + e = this and + e.isConst() and + nd = mkExprOrSkipNode(this) + | + if e.isPlatformIndependentConstant() and exists(e.getBoolValue()) + then cmpl = Bool(e.getBoolValue()) + else cmpl = Done() + ) + or + this instanceof Ident and + not this.(Expr).isConst() and + nd = mkExprOrSkipNode(this) and + cmpl = Done() + or + this instanceof BreakStmt and + nd = MkSkipNode(this) and + cmpl = Break(BranchTarget::of(this)) + or + this instanceof ContinueStmt and + nd = MkSkipNode(this) and + cmpl = Continue(BranchTarget::of(this)) + or + this instanceof Decl and + nd = MkSkipNode(this) and + cmpl = Done() + or + this instanceof EmptyStmt and + nd = MkSkipNode(this) and + cmpl = Done() + or + this instanceof FallthroughStmt and + nd = MkSkipNode(this) and + cmpl = Fallthrough() + or + this instanceof FuncLit and + nd = MkExprNode(this) and + cmpl = Done() + or + this instanceof PlainBlock and + nd = MkSkipNode(this) and + cmpl = Done() + or + this instanceof SelectorExpr and + not this.(SelectorExpr).getBase() instanceof ValueExpr and + nd = mkExprOrSkipNode(this) and + cmpl = Done() + or + this instanceof GenericFunctionInstantiationExpr and + nd = MkExprNode(this) and + cmpl = Done() + } + + override predicate firstNode(ControlFlow::Node first) { first = nd } + + override predicate lastNode(ControlFlow::Node last, Completion c) { last = nd and c = cmpl } + } + + abstract private class PostOrderTree extends ControlFlowTree { + abstract ControlFlow::Node getNode(); + + Completion getCompletion() { result = Done() } + + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getFirstChildTree(), first) + or + not exists(this.getChildTree(_)) and + first = this.getNode() + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + super.lastNode(last, cmpl) + or + last = this.getNode() and cmpl = this.getCompletion() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + super.succ(pred, succ) + or + lastNode(this.getLastChildTree(), pred, normalCompletion()) and + succ = this.getNode() + } + } + + abstract private class PreOrderTree extends ControlFlowTree { + abstract ControlFlow::Node getNode(); + + override predicate firstNode(ControlFlow::Node first) { first = this.getNode() } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + super.lastNode(last, cmpl) + or + lastNode(this.getLastChildTree(), last, cmpl) + or + not exists(this.getChildTree(_)) and + last = this.getNode() and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + super.succ(pred, succ) + or + pred = this.getNode() and + firstNode(this.getFirstChildTree(), succ) + } + } + + private class WrapperTree extends ControlFlowTree { + WrapperTree() { + this instanceof ConstDecl or + this instanceof DeclStmt or + this instanceof ExprStmt or + this instanceof KeyValueExpr or + this instanceof LabeledStmt or + this instanceof ParenExpr or + this instanceof PlainBlock or + this instanceof VarDecl + } + + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getFirstChildTree(), first) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + super.lastNode(last, cmpl) + or + lastNode(this.getLastChildTree(), last, cmpl) + or + exists(LoopStmt ls | this = ls.getBody() | + lastNode(this, last, Continue(BranchTarget::of(ls))) and + cmpl = Done() + ) + } + + override ControlFlowTree getChildTree(int i) { + i = 0 and result = this.(DeclStmt).getDecl() + or + i = 0 and result = this.(ExprStmt).getExpr() + or + result = this.(GenDecl).getSpec(i) + or + exists(KeyValueExpr kv | kv = this | + not kv.getLiteral() instanceof StructLit and + i = 0 and + result = kv.getKey() + or + i = 1 and result = kv.getValue() + ) + or + i = 0 and result = this.(LabeledStmt).getStmt() + or + i = 0 and result = this.(ParenExpr).getExpr() + or + result = this.(PlainBlock).getStmt(i) + } + } + + private class AssignmentTree extends ControlFlowTree { + AssignmentTree() { + this instanceof Assignment or + this instanceof ValueSpec + } + + Expr getLhs(int i) { + result = this.(Assignment).getLhs(i) or + result = this.(ValueSpec).getNameExpr(i) + } + + int getNumLhs() { + result = this.(Assignment).getNumLhs() or + result = this.(ValueSpec).getNumName() + } + + Expr getRhs(int i) { + result = this.(Assignment).getRhs(i) or + result = this.(ValueSpec).getInit(i) + } + + int getNumRhs() { + result = this.(Assignment).getNumRhs() or + result = this.(ValueSpec).getNumInit() + } + + predicate isExtractingAssign() { this.getNumRhs() = 1 and this.getNumLhs() > 1 } + + override predicate firstNode(ControlFlow::Node first) { + not this instanceof RecvStmt and + firstNode(this.getLhs(0), first) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + ( + last = max(int i | | this.epilogueNode(i) order by i) + or + not exists(this.epilogueNode(_)) and + lastNode(this.getLastSubExprInEvalOrder(), last, normalCompletion()) + ) and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + exists(int i | lastNode(this.getLhs(i), pred, normalCompletion()) | + firstNode(this.getLhs(i + 1), succ) + or + not this instanceof RecvStmt and + i = this.getNumLhs() - 1 and + ( + firstNode(this.getRhs(0), succ) + or + not exists(this.getRhs(_)) and + succ = this.epilogueNodeRanked(0) + ) + ) + or + exists(int i | + lastNode(this.getRhs(i), pred, normalCompletion()) and + firstNode(this.getRhs(i + 1), succ) + ) + or + not this instanceof RecvStmt and + lastNode(this.getRhs(this.getNumRhs() - 1), pred, normalCompletion()) and + succ = this.epilogueNodeRanked(0) + or + exists(int i | + pred = this.epilogueNodeRanked(i) and + succ = this.epilogueNodeRanked(i + 1) + ) + } + + ControlFlow::Node epilogueNodeRanked(int i) { + exists(int j | + result = this.epilogueNode(j) and + j = rank[i + 1](int k | exists(this.epilogueNode(k))) + ) + } + + private Expr getSubExprInEvalOrder(int evalOrder) { + if evalOrder < this.getNumLhs() + then result = this.getLhs(evalOrder) + else result = this.getRhs(evalOrder - this.getNumLhs()) + } + + private Expr getLastSubExprInEvalOrder() { + result = max(int i | | this.getSubExprInEvalOrder(i) order by i) + } + + private ControlFlow::Node epilogueNode(int i) { + i = -1 and + result = MkCompoundAssignRhsNode(this) + or + exists(int j | + result = MkExtractNode(this, j) and + i = 2 * j + or + result = MkZeroInitNode(any(ValueEntity v | this.getLhs(j) = v.getDeclaration())) and + i = 2 * j + or + result = MkAssignNode(this, j) and + i = 2 * j + 1 + ) + } + } + + private class BinaryExprTree extends PostOrderTree, BinaryExpr { + override ControlFlow::Node getNode() { result = MkExprNode(this) } + + private predicate equalityTestMayPanic() { + this instanceof EqualityTestExpr and + exists(Type t | + t = this.getAnOperand().getType().getUnderlyingType() and + ( + t instanceof InterfaceType or // panic due to comparison of incomparable interface values + t instanceof StructType or // may contain an interface-typed field + t instanceof ArrayType // may be an array of interface values + ) + ) + } + + override Completion getCompletion() { + result = PostOrderTree.super.getCompletion() + or + // runtime panic due to division by zero or comparison of incomparable interface values + (this instanceof DivExpr or this.equalityTestMayPanic()) and + not this.(Expr).isConst() and + result = Panic() + } + + override ControlFlowTree getChildTree(int i) { + i = 0 and result = this.getLeftOperand() + or + i = 1 and result = this.getRightOperand() + } + } + + private class LogicalBinaryExprTree extends BinaryExprTree, LogicalBinaryExpr { + boolean shortCircuit; + + LogicalBinaryExprTree() { + this instanceof LandExpr and shortCircuit = false + or + this instanceof LorExpr and shortCircuit = true + } + + private ControlFlow::Node getGuard(boolean outcome) { + result = MkConditionGuardNode(this.getLeftOperand(), outcome) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + lastNode(this.getAnOperand(), last, cmpl) and + not cmpl.isNormal() + or + if isCond(this) + then ( + last = this.getGuard(shortCircuit) and + cmpl = Bool(shortCircuit) + or + lastNode(this.getRightOperand(), last, cmpl) + ) else ( + last = MkExprNode(this) and + cmpl = Done() + ) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(Completion lcmpl | + lastNode(this.getLeftOperand(), pred, lcmpl) and + succ = this.getGuard(lcmpl.getOutcome()) + ) + or + pred = this.getGuard(shortCircuit.booleanNot()) and + firstNode(this.getRightOperand(), succ) + or + not isCond(this) and + ( + pred = this.getGuard(shortCircuit) and + succ = MkExprNode(this) + or + exists(Completion rcmpl | + lastNode(this.getRightOperand(), pred, rcmpl) and + rcmpl.isNormal() and + succ = MkExprNode(this) + ) + ) + } + } + + private class CallExprTree extends PostOrderTree, CallExpr { + private predicate isSpecial() { + this = any(DeferStmt defer).getCall() or + this = any(GoStmt go).getCall() + } + + override ControlFlow::Node getNode() { + not this.isSpecial() and + result = MkExprNode(this) + } + + override Completion getCompletion() { + (not exists(this.getTarget()) or this.getTarget().mayReturnNormally()) and + result = Done() + or + (not exists(this.getTarget()) or this.getTarget().mayPanic()) and + result = Panic() + } + + override ControlFlowTree getChildTree(int i) { + i = 0 and result = this.getCalleeExpr() + or + result = this.getArgument(i - 1) and + // calls to `make` and `new` can have type expressions as arguments + not result instanceof TypeExpr + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + // interpose implicit argument destructuring nodes between last argument + // and call itself; this is for cases like `f(g())` where `g` has multiple + // results + exists(ControlFlow::Node mid | PostOrderTree.super.succ(pred, mid) | + if mid = this.getNode() then succ = this.getEpilogueNode(0) else succ = mid + ) + or + exists(int i | + pred = this.getEpilogueNode(i) and + succ = this.getEpilogueNode(i + 1) + ) + } + + private ControlFlow::Node getEpilogueNode(int i) { + result = MkExtractNode(this, i) + or + i = max(int j | exists(MkExtractNode(this, j))) + 1 and + result = this.getNode() + or + not exists(MkExtractNode(this, _)) and + i = 0 and + result = this.getNode() + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + PostOrderTree.super.lastNode(last, cmpl) + or + this.isSpecial() and + lastNode(this.getLastChildTree(), last, cmpl) + } + } + + private class CaseClauseTree extends ControlFlowTree, CaseClause { + private ControlFlow::Node getExprStart(int i) { + firstNode(this.getExpr(i), result) + or + this.getExpr(i) instanceof TypeExpr and + result = MkCaseCheckNode(this, i) + } + + ControlFlow::Node getExprEnd(int i, Boolean outcome) { + exists(Expr e | e = this.getExpr(i) | + result = MkConditionGuardNode(e, outcome) + or + not exists(MkConditionGuardNode(e, _)) and + result = MkCaseCheckNode(this, i) + ) + } + + private ControlFlow::Node getBodyStart() { + firstNode(this.getStmt(0), result) or result = MkSkipNode(this) + } + + override predicate firstNode(ControlFlow::Node first) { + first = this.getExprStart(0) + or + not exists(this.getAnExpr()) and + first = this.getBodyStart() + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + // TODO: shouldn't be here + last = this.getExprEnd(this.getNumExpr() - 1, false) and + cmpl = Bool(false) + or + last = MkSkipNode(this) and + cmpl = Done() + or + lastNode(this.getStmt(this.getNumStmt() - 1), last, cmpl) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + exists(int i | + lastNode(this.getExpr(i), pred, normalCompletion()) and + succ = MkCaseCheckNode(this, i) + or + // visit guard node if there is one + pred = MkCaseCheckNode(this, i) and + succ = this.getExprEnd(i, _) and + succ != pred // this avoids self-loops if there isn't a guard node + or + pred = this.getExprEnd(i, false) and + succ = this.getExprStart(i + 1) + or + this.isPassingEdge(i, pred, succ, _) + ) + } + + predicate isPassingEdge(int i, ControlFlow::Node pred, ControlFlow::Node succ, Expr testExpr) { + pred = this.getExprEnd(i, true) and + succ = this.getBodyStart() and + testExpr = this.getExpr(i) + } + + override ControlFlowTree getChildTree(int i) { result = this.getStmt(i) } + } + + private class CommClauseTree extends ControlFlowTree, CommClause { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getComm(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + last = MkSkipNode(this) and + cmpl = Done() + or + lastNode(this.getStmt(this.getNumStmt() - 1), last, cmpl) + } + + override ControlFlowTree getChildTree(int i) { result = this.getStmt(i) } + } + + private class CompositeLiteralTree extends ControlFlowTree, CompositeLit { + private ControlFlow::Node getElementInit(int i) { + result = MkLiteralElementInitNode(this.getElement(i)) + } + + private ControlFlow::Node getElementStart(int i) { + exists(Expr elt | elt = this.getElement(i) | + result = MkImplicitLiteralElementIndex(elt) + or + (elt instanceof KeyValueExpr or this instanceof StructLit) and + firstNode(this.getElement(i), result) + ) + } + + override predicate firstNode(ControlFlow::Node first) { first = MkExprNode(this) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + last = this.getElementInit(this.getNumElement() - 1) and + cmpl = Done() + or + not exists(this.getElement(_)) and + last = MkExprNode(this) and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + this.firstNode(pred) and + succ = this.getElementStart(0) + or + exists(int i | + pred = MkImplicitLiteralElementIndex(this.getElement(i)) and + firstNode(this.getElement(i), succ) + or + lastNode(this.getElement(i), pred, normalCompletion()) and + succ = this.getElementInit(i) + or + pred = this.getElementInit(i) and + succ = this.getElementStart(i + 1) + ) + } + } + + private class ConversionExprTree extends PostOrderTree, ConversionExpr { + override Completion getCompletion() { + // conversions of a slice to an array pointer are the only kind that may panic + this.getType().(PointerType).getBaseType() instanceof ArrayType and + result = Panic() + or + result = Done() + } + + override ControlFlow::Node getNode() { result = MkExprNode(this) } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getOperand() } + } + + private class DeferStmtTree extends PostOrderTree, DeferStmt { + override ControlFlow::Node getNode() { result = MkDeferNode(this) } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getCall() } + } + + private class FuncDeclTree extends PostOrderTree, FuncDecl { + override ControlFlow::Node getNode() { result = MkFuncDeclNode(this) } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getNameExpr() } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + // override to prevent panic propagation out of function declarations + last = this.getNode() and cmpl = Done() + } + } + + private class GoStmtTree extends PostOrderTree, GoStmt { + override ControlFlow::Node getNode() { result = MkGoNode(this) } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getCall() } + } + + private class IfStmtTree extends ControlFlowTree, IfStmt { + private ControlFlow::Node getGuard(boolean outcome) { + result = MkConditionGuardNode(this.getCond(), outcome) + } + + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getInit(), first) + or + not exists(this.getInit()) and + firstNode(this.getCond(), first) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + lastNode(this.getThen(), last, cmpl) + or + lastNode(this.getElse(), last, cmpl) + or + not exists(this.getElse()) and + last = this.getGuard(false) and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + lastNode(this.getInit(), pred, normalCompletion()) and + firstNode(this.getCond(), succ) + or + exists(Completion condCmpl | + lastNode(this.getCond(), pred, condCmpl) and + succ = MkConditionGuardNode(this.getCond(), condCmpl.getOutcome()) + ) + or + pred = this.getGuard(true) and + firstNode(this.getThen(), succ) + or + pred = this.getGuard(false) and + firstNode(this.getElse(), succ) + } + } + + private class IndexExprTree extends ControlFlowTree, IndexExpr { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + // panic due to `nil` dereference + last = MkImplicitDeref(this.getBase()) and + cmpl = Panic() + or + last = mkExprOrSkipNode(this) and + (cmpl = Done() or cmpl = Panic()) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + lastNode(this.getBase(), pred, normalCompletion()) and + ( + succ = MkImplicitDeref(this.getBase()) + or + not exists(MkImplicitDeref(this.getBase())) and + firstNode(this.getIndex(), succ) + ) + or + pred = MkImplicitDeref(this.getBase()) and + firstNode(this.getIndex(), succ) + or + lastNode(this.getIndex(), pred, normalCompletion()) and + succ = mkExprOrSkipNode(this) + } + } + + private class LoopTree extends ControlFlowTree, LoopStmt { + BranchTarget getLabel() { result = BranchTarget::of(this) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + exists(Completion inner | lastNode(this.getBody(), last, inner) and not inner.isNormal() | + if inner = Break(this.getLabel()) + then cmpl = Done() + else + if inner = Continue(this.getLabel()) + then none() + else cmpl = inner + ) + } + } + + private class FileTree extends ControlFlowTree, File { + FileTree() { exists(this.getADecl()) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { none() } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + pred = MkEntryNode(this) and + firstNode(this.getDecl(0), succ) + or + exists(int i, Completion inner | lastNode(this.getDecl(i), pred, inner) | + not inner.isNormal() + or + i = this.getNumDecl() - 1 + ) and + succ = MkExitNode(this) + } + + override ControlFlowTree getChildTree(int i) { result = this.getDecl(i) } + } + + private class ForTree extends LoopTree, ForStmt { + private ControlFlow::Node getGuard(boolean outcome) { + result = MkConditionGuardNode(this.getCond(), outcome) + } + + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getFirstChildTree(), first) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + LoopTree.super.lastNode(last, cmpl) + or + lastNode(this.getInit(), last, cmpl) and + not cmpl.isNormal() + or + lastNode(this.getCond(), last, cmpl) and + not cmpl.isNormal() + or + lastNode(this.getPost(), last, cmpl) and + not cmpl.isNormal() + or + last = this.getGuard(false) and + cmpl = Done() + } + + override ControlFlowTree getChildTree(int i) { + i = 0 and result = this.getInit() + or + i = 1 and result = this.getCond() + or + i = 2 and result = this.getBody() + or + i = 3 and result = this.getPost() + or + i = 4 and result = this.getCond() + or + i = 5 and result = this.getBody() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(int i, ControlFlowTree predTree, Completion cmpl | + predTree = this.getChildTreeRanked(i) and + lastNode(predTree, pred, cmpl) and + cmpl.isNormal() + | + if predTree = this.getCond() + then succ = this.getGuard(cmpl.getOutcome()) + else firstNode(this.getChildTreeRanked(i + 1), succ) + ) + or + pred = this.getGuard(true) and + firstNode(this.getBody(), succ) + } + } + + private class FuncDefTree extends ControlFlowTree, FuncDef { + FuncDefTree() { exists(this.getBody()) } + + pragma[noinline] + private MkEntryNode getEntry() { result = MkEntryNode(this) } + + private Parameter getParameterRanked(int i) { + result = rank[i + 1](Parameter p, int j | p = this.getParameter(j) | p order by j) + } + + private ControlFlow::Node getPrologueNode(int i) { + i = -1 and result = this.getEntry() + or + exists(int numParm, int numRes | + numParm = count(this.getParameter(_)) and + numRes = count(this.getResultVar(_)) + | + exists(int j, Parameter p | p = this.getParameterRanked(j) | + i = 2 * j and result = MkArgumentNode(p) + or + i = 2 * j + 1 and result = MkParameterInit(p) + ) + or + exists(int j, ResultVariable v | v = this.getResultVar(j) | + i = 2 * numParm + 2 * j and + result = MkZeroInitNode(v) + or + i = 2 * numParm + 2 * j + 1 and + result = MkResultInit(v) + ) + or + i = 2 * numParm + 2 * numRes and + firstNode(this.getBody(), result) + ) + } + + private ControlFlow::Node getEpilogueNode(int i) { + result = MkResultReadNode(this.getResultVar(i)) + or + i = count(this.getAResultVar()) and + result = MkExitNode(this) + } + + pragma[noinline] + private predicate firstDefer(ControlFlow::Node nd) { + exists(DeferStmt defer | + nd = MkExprNode(defer.getCall()) and + // `defer` can be the first `defer` statement executed + // there is always a predecessor node because the `defer`'s call is always + // evaluated before the defer statement itself + MkDeferNode(defer) = succ(notDeferSucc*(this.getEntry())) + ) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { none() } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(int i | + pred = this.getPrologueNode(i) and + succ = this.getPrologueNode(i + 1) + ) + or + exists(GotoStmt goto, LabeledStmt ls | + pred = MkSkipNode(goto) and + this = goto.getEnclosingFunction() and + this = ls.getEnclosingFunction() and + goto.getLabel() = ls.getLabel() and + firstNode(ls, succ) + ) + or + exists(Completion cmpl | + lastNode(this.getBody(), pred, cmpl) and + // last node of function body can be reached without going through a `defer` statement + pred = notDeferSucc*(this.getEntry()) + | + // panic goes directly to exit, non-panic reads result variables first + if cmpl = Panic() then succ = MkExitNode(this) else succ = this.getEpilogueNode(0) + ) + or + lastNode(this.getBody(), pred, _) and + exists(DeferStmt defer | defer = this.getADeferStmt() | + succ = MkExprNode(defer.getCall()) and + // the last `DeferStmt` executed before pred is this `defer` + pred = notDeferSucc*(MkDeferNode(defer)) + ) + or + exists(DeferStmt predDefer, DeferStmt succDefer | + predDefer = this.getADeferStmt() and + succDefer = this.getADeferStmt() + | + // reversed because `defer`s are executed in LIFO order + MkDeferNode(predDefer) = nextDefer(MkDeferNode(succDefer)) and + pred = MkExprNode(predDefer.getCall()) and + succ = MkExprNode(succDefer.getCall()) + ) + or + this.firstDefer(pred) and + ( + // conservatively assume that we might either panic (and hence skip the result reads) + // or not + succ = MkExitNode(this) + or + succ = this.getEpilogueNode(0) + ) + or + exists(int i | + pred = this.getEpilogueNode(i) and + succ = this.getEpilogueNode(i + 1) + ) + } + } + + private class GotoTree extends ControlFlowTree, GotoStmt { + override predicate firstNode(ControlFlow::Node first) { first = MkSkipNode(this) } + } + + private class IncDecTree extends ControlFlowTree, IncDecStmt { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getOperand(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + last = MkIncDecNode(this) and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + lastNode(this.getOperand(), pred, normalCompletion()) and + succ = MkImplicitOne(this) + or + pred = MkImplicitOne(this) and + succ = MkIncDecRhs(this) + or + pred = MkIncDecRhs(this) and + succ = MkIncDecNode(this) + } + } + + private class RangeTree extends LoopTree, RangeStmt { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getDomain(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + LoopTree.super.lastNode(last, cmpl) + or + last = MkNextNode(this) and + cmpl = Done() + or + lastNode(this.getKey(), last, cmpl) and + not cmpl.isNormal() + or + lastNode(this.getValue(), last, cmpl) and + not cmpl.isNormal() + or + lastNode(this.getDomain(), last, cmpl) and + not cmpl.isNormal() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + lastNode(this.getDomain(), pred, normalCompletion()) and + succ = MkNextNode(this) + or + pred = MkNextNode(this) and + ( + firstNode(this.getKey(), succ) + or + not exists(this.getKey()) and + firstNode(this.getBody(), succ) + ) + or + lastNode(this.getKey(), pred, normalCompletion()) and + ( + firstNode(this.getValue(), succ) + or + not exists(this.getValue()) and + succ = MkExtractNode(this, 0) + ) + or + lastNode(this.getValue(), pred, normalCompletion()) and + succ = MkExtractNode(this, 0) + or + pred = MkExtractNode(this, 0) and + ( + if exists(this.getValue()) + then succ = MkExtractNode(this, 1) + else + if exists(MkAssignNode(this, 0)) + then succ = MkAssignNode(this, 0) + else + if exists(MkAssignNode(this, 1)) + then succ = MkAssignNode(this, 1) + else firstNode(this.getBody(), succ) + ) + or + pred = MkExtractNode(this, 1) and + ( + if exists(MkAssignNode(this, 0)) + then succ = MkAssignNode(this, 0) + else + if exists(MkAssignNode(this, 1)) + then succ = MkAssignNode(this, 1) + else firstNode(this.getBody(), succ) + ) + or + pred = MkAssignNode(this, 0) and + ( + if exists(MkAssignNode(this, 1)) + then succ = MkAssignNode(this, 1) + else firstNode(this.getBody(), succ) + ) + or + pred = MkAssignNode(this, 1) and + firstNode(this.getBody(), succ) + or + exists(Completion inner | + lastNode(this.getBody(), pred, inner) and + (inner.isNormal() or inner = Continue(BranchTarget::of(this))) and + succ = MkNextNode(this) + ) + } + } + + private class RecvStmtTree extends ControlFlowTree, RecvStmt { + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getExpr().getOperand(), first) + } + } + + private class ReturnStmtTree extends PostOrderTree, ReturnStmt { + override ControlFlow::Node getNode() { result = MkReturnNode(this) } + + override Completion getCompletion() { result = Return() } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(int i | + lastNode(this.getExpr(i), pred, normalCompletion()) and + succ = this.complete(i) + or + pred = MkExtractNode(this, i) and + succ = this.after(i) + or + pred = MkResultWriteNode(_, i, this) and + succ = this.next(i) + ) + } + + private ControlFlow::Node complete(int i) { + result = MkExtractNode(this, i) + or + not exists(MkExtractNode(this, _)) and + result = this.after(i) + } + + private ControlFlow::Node after(int i) { + result = MkResultWriteNode(_, i, this) + or + not exists(MkResultWriteNode(_, i, this)) and + result = this.next(i) + } + + private ControlFlow::Node next(int i) { + firstNode(this.getExpr(i + 1), result) + or + exists(MkExtractNode(this, _)) and + result = this.complete(i + 1) + or + i + 1 = this.getEnclosingFunction().getType().getNumResult() and + result = this.getNode() + } + + override ControlFlowTree getChildTree(int i) { result = this.getExpr(i) } + } + + private class SelectStmtTree extends ControlFlowTree, SelectStmt { + private BranchTarget getLabel() { result = BranchTarget::of(this) } + + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getNonDefaultCommClause(0), first) + or + this.getNumNonDefaultCommClause() = 0 and + first = MkSelectNode(this) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + exists(Completion inner | lastNode(this.getACommClause(), last, inner) | + if inner = Break(this.getLabel()) then cmpl = Done() else cmpl = inner + ) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + exists(CommClause cc, int i, Stmt comm | + cc = this.getNonDefaultCommClause(i) and + comm = cc.getComm() and + ( + comm instanceof RecvStmt and + lastNode(comm.(RecvStmt).getExpr().getOperand(), pred, normalCompletion()) + or + comm instanceof SendStmt and + lastNode(comm.(SendStmt).getValue(), pred, normalCompletion()) + ) + | + firstNode(this.getNonDefaultCommClause(i + 1), succ) + or + i = this.getNumNonDefaultCommClause() - 1 and + succ = MkSelectNode(this) + ) + or + pred = MkSelectNode(this) and + exists(CommClause cc, Stmt comm | + cc = this.getNonDefaultCommClause(_) and comm = cc.getComm() + | + comm instanceof RecvStmt and + succ = MkExprNode(comm.(RecvStmt).getExpr()) + or + comm instanceof SendStmt and + succ = MkSendNode(comm) + ) + or + pred = MkSelectNode(this) and + exists(CommClause cc | cc = this.getDefaultCommClause() | + firstNode(cc.getStmt(0), succ) + or + succ = MkSkipNode(cc) + ) + or + exists(CommClause cc, RecvStmt recv | cc = this.getCommClause(_) and recv = cc.getComm() | + pred = MkExprNode(recv.getExpr()) and + ( + firstNode(recv.getLhs(0), succ) + or + not exists(recv.getLhs(0)) and + (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) + ) + or + lastNode(recv.getLhs(0), pred, normalCompletion()) and + not exists(recv.getLhs(1)) and + ( + succ = MkAssignNode(recv, 0) + or + not exists(MkAssignNode(recv, 0)) and + (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) + ) + or + lastNode(recv.getLhs(1), pred, normalCompletion()) and + succ = MkExtractNode(recv, 0) + or + ( + pred = MkAssignNode(recv, 0) and + not exists(MkExtractNode(recv, 1)) + or + pred = MkExtractNode(recv, 1) and + not exists(MkAssignNode(recv, 1)) + or + pred = MkAssignNode(recv, 1) + ) and + (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) + ) + or + exists(CommClause cc, SendStmt ss | + cc = this.getCommClause(_) and + ss = cc.getComm() and + pred = MkSendNode(ss) + | + firstNode(cc.getStmt(0), succ) + or + succ = MkSkipNode(cc) + ) + } + } + + private class SelectorExprTree extends ControlFlowTree, SelectorExpr { + SelectorExprTree() { this.getBase() instanceof ValueExpr } + + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + // panic due to `nil` dereference + last = MkImplicitDeref(this.getBase()) and + cmpl = Panic() + or + last = mkExprOrSkipNode(this) and + cmpl = Done() + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + exists(int i | pred = this.getStepWithRank(i) and succ = this.getStepWithRank(i + 1)) + } + + private ControlFlow::Node getStepOrdered(int i) { + i = -2 and lastNode(this.getBase(), result, normalCompletion()) + or + i = -1 and result = MkImplicitDeref(this.getBase()) + or + exists(int maxIndex | + maxIndex = max(int k | k = 0 or exists(MkImplicitFieldSelection(this, k, _))) + | + result = MkImplicitFieldSelection(this, maxIndex - i, _) + or + i = maxIndex and + result = mkExprOrSkipNode(this) + ) + } + + private ControlFlow::Node getStepWithRank(int i) { + exists(int j | + result = this.getStepOrdered(j) and + j = rank[i + 1](int k | exists(this.getStepOrdered(k))) + ) + } + } + + private class SendStmtTree extends ControlFlowTree, SendStmt { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getChannel(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + last = MkSendNode(this) and + (cmpl = Done() or cmpl = Panic()) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + not this = any(CommClause cc).getComm() and + lastNode(this.getValue(), pred, normalCompletion()) and + succ = MkSendNode(this) + } + + override ControlFlowTree getChildTree(int i) { + i = 0 and result = this.getChannel() + or + i = 1 and result = this.getValue() + } + } + + private class SliceExprTree extends ControlFlowTree, SliceExpr { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + ControlFlowTree.super.lastNode(last, cmpl) + or + // panic due to `nil` dereference + last = MkImplicitDeref(this.getBase()) and + cmpl = Panic() + or + last = MkExprNode(this) and + (cmpl = Done() or cmpl = Panic()) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + lastNode(this.getBase(), pred, normalCompletion()) and + ( + succ = MkImplicitDeref(this.getBase()) + or + not exists(MkImplicitDeref(this.getBase())) and + (firstNode(this.getLow(), succ) or succ = MkImplicitLowerSliceBound(this)) + ) + or + pred = MkImplicitDeref(this.getBase()) and + (firstNode(this.getLow(), succ) or succ = MkImplicitLowerSliceBound(this)) + or + (lastNode(this.getLow(), pred, normalCompletion()) or pred = MkImplicitLowerSliceBound(this)) and + (firstNode(this.getHigh(), succ) or succ = MkImplicitUpperSliceBound(this)) + or + (lastNode(this.getHigh(), pred, normalCompletion()) or pred = MkImplicitUpperSliceBound(this)) and + (firstNode(this.getMax(), succ) or succ = MkImplicitMaxSliceBound(this)) + or + (lastNode(this.getMax(), pred, normalCompletion()) or pred = MkImplicitMaxSliceBound(this)) and + succ = MkExprNode(this) + } + } + + private class StarExprTree extends PostOrderTree, StarExpr { + override ControlFlow::Node getNode() { result = mkExprOrSkipNode(this) } + + override Completion getCompletion() { result = Done() or result = Panic() } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getBase() } + } + + private class SwitchTree extends ControlFlowTree, SwitchStmt { + override predicate firstNode(ControlFlow::Node first) { + firstNode(this.getInit(), first) + or + not exists(this.getInit()) and + ( + firstNode(this.(ExpressionSwitchStmt).getExpr(), first) + or + first = MkImplicitTrue(this) + or + firstNode(this.(TypeSwitchStmt).getTest(), first) + ) + } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + lastNode(this.getInit(), last, cmpl) and + not cmpl.isNormal() + or + ( + lastNode(this.(ExpressionSwitchStmt).getExpr(), last, cmpl) + or + lastNode(this.(TypeSwitchStmt).getTest(), last, cmpl) + ) and + ( + not cmpl.isNormal() + or + not exists(this.getDefault()) + ) + or + last = MkImplicitTrue(this) and + cmpl = Bool(true) and + this.getNumCase() = 0 + or + exists(CaseClause cc, int i, Completion inner | + cc = this.getCase(i) and lastNode(cc, last, inner) + | + not exists(this.getDefault()) and + i = this.getNumCase() - 1 and + last = cc.(CaseClauseTree).getExprEnd(cc.getNumExpr() - 1, false) and + inner.isNormal() and + cmpl = inner + or + not last = cc.(CaseClauseTree).getExprEnd(_, _) and + inner.isNormal() and + cmpl = inner + or + if inner = Break(BranchTarget::of(this)) + then cmpl = Done() + else ( + not inner.isNormal() and inner != Fallthrough() and cmpl = inner + ) + ) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + lastNode(this.getInit(), pred, normalCompletion()) and + ( + firstNode(this.(ExpressionSwitchStmt).getExpr(), succ) or + succ = MkImplicitTrue(this) or + firstNode(this.(TypeSwitchStmt).getTest(), succ) + ) + or + ( + lastNode(this.(ExpressionSwitchStmt).getExpr(), pred, normalCompletion()) or + pred = MkImplicitTrue(this) or + lastNode(this.(TypeSwitchStmt).getTest(), pred, normalCompletion()) + ) and + ( + firstNode(this.getNonDefaultCase(0), succ) + or + not exists(this.getANonDefaultCase()) and + firstNode(this.getDefault(), succ) + ) + or + exists(CaseClause cc, int i | + cc = this.getNonDefaultCase(i) and + lastNode(cc, pred, normalCompletion()) and + pred = cc.(CaseClauseTree).getExprEnd(_, false) + | + firstNode(this.getNonDefaultCase(i + 1), succ) + or + i = this.getNumNonDefaultCase() - 1 and + firstNode(this.getDefault(), succ) + ) + or + exists(CaseClause cc, int i, CaseClause next | + cc = this.getCase(i) and + lastNode(cc, pred, Fallthrough()) and + next = this.getCase(i + 1) + | + firstNode(next.getStmt(0), succ) + or + succ = MkSkipNode(next) + ) + } + } + + private class TypeAssertTree extends PostOrderTree, TypeAssertExpr { + override ControlFlow::Node getNode() { result = MkExprNode(this) } + + override Completion getCompletion() { + result = Done() + or + // panic due to type mismatch, but not if the assertion appears in an assignment or + // initialization with two variables or a type-switch + not exists(Assignment assgn | assgn.getNumLhs() = 2 and this = assgn.getRhs().stripParens()) and + not exists(ValueSpec vs | vs.getNumName() = 2 and this = vs.getInit().stripParens()) and + not exists(TypeSwitchStmt ts | this = ts.getExpr()) and + result = Panic() + } + + override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getExpr() } + } + + private class UnaryExprTree extends ControlFlowTree, UnaryExpr { + override predicate firstNode(ControlFlow::Node first) { firstNode(this.getOperand(), first) } + + override predicate lastNode(ControlFlow::Node last, Completion cmpl) { + last = MkExprNode(this) and + ( + cmpl = Done() + or + this instanceof DerefExpr and cmpl = Panic() + ) + } + + override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { + ControlFlowTree.super.succ(pred, succ) + or + not this = any(RecvStmt recv).getExpr() and + lastNode(this.getOperand(), pred, normalCompletion()) and + succ = MkExprNode(this) + } + } + + private ControlFlow::Node mkExprOrSkipNode(Expr e) { + result = MkExprNode(e) or + result = MkSkipNode(e) + } + + /** Holds if evaluation of `root` may start at `first`. */ + cached + predicate firstNode(ControlFlowTree root, ControlFlow::Node first) { root.firstNode(first) } + + /** Holds if evaluation of `root` may complete normally after `last`. */ + cached + predicate lastNode(ControlFlowTree root, ControlFlow::Node last) { + lastNode(root, last, normalCompletion()) + } + + private predicate lastNode(ControlFlowTree root, ControlFlow::Node last, Completion cmpl) { + root.lastNode(last, cmpl) + } + + /** Gets a successor of `nd` that is not a `defer` node */ + private ControlFlow::Node notDeferSucc(ControlFlow::Node nd) { + not result = MkDeferNode(_) and + result = succ(nd) + } + + /** Gets `defer` statements that can be the first defer statement after `nd` in the CFG */ + private ControlFlow::Node nextDefer(ControlFlow::Node nd) { + nd = MkDeferNode(_) and + result = MkDeferNode(_) and + ( + result = succ(nd) + or + result = succ(notDeferSucc+(nd)) + ) + } + + /** + * Holds if the function `f` may return without panicking, exiting the process, or looping forever. + * + * This is defined conservatively, and so may also hold of a function that in fact + * cannot return normally, but never fails to hold of a function that can return normally. + */ + cached + predicate mayReturnNormally(ControlFlowTree root) { + exists(ControlFlow::Node last, Completion cmpl | lastNode(root, last, cmpl) and cmpl != Panic()) + } + + /** + * Holds if `pred` is the node for the case `testExpr` in an expression + * switch statement which is switching on `switchExpr`, and `succ` is the + * node to be executed next if the case test succeeds. + */ + cached + predicate isSwitchCaseTestPassingEdge( + ControlFlow::Node pred, ControlFlow::Node succ, Expr switchExpr, Expr testExpr + ) { + exists(ExpressionSwitchStmt ess | ess.getExpr() = switchExpr | + ess.getACase().(CaseClauseTree).isPassingEdge(_, pred, succ, testExpr) + ) + } + + /** Gets a successor of `nd`, that is, a node that is executed after `nd`. */ + cached + ControlFlow::Node succ(ControlFlow::Node nd) { any(ControlFlowTree tree).succ(nd, result) } +} diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll new file mode 100644 index 00000000000..4df0867e4c6 --- /dev/null +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -0,0 +1,1669 @@ +/** + * Provides classes and predicates for working with an intermediate representation (IR) of Go + * programs that is used as the foundation of the control flow and data flow graphs. + * + * In the IR, the program is represented as a set of instructions, which correspond to expressions + * and statements that compute a value or perform an operation (as opposed to providing syntactic + * structure or type information). + * + * Each instruction is also a control-flow node, but there are control-flow nodes that are not + * instructions (synthetic entry and exit nodes, as well as no-op skip nodes). + */ + +import go +private import semmle.go.controlflow.ControlFlowGraphImpl + +/** Provides predicates and classes for working with IR constructs. */ +module IR { + /** + * An IR instruction. + */ + class Instruction extends ControlFlow::Node { + Instruction() { + this instanceof MkExprNode or + this instanceof MkLiteralElementInitNode or + this instanceof MkImplicitLiteralElementIndex or + this instanceof MkAssignNode or + this instanceof MkCompoundAssignRhsNode or + this instanceof MkExtractNode or + this instanceof MkZeroInitNode or + this instanceof MkFuncDeclNode or + this instanceof MkDeferNode or + this instanceof MkGoNode or + this instanceof MkConditionGuardNode or + this instanceof MkIncDecNode or + this instanceof MkIncDecRhs or + this instanceof MkImplicitOne or + this instanceof MkReturnNode or + this instanceof MkResultWriteNode or + this instanceof MkResultReadNode or + this instanceof MkSelectNode or + this instanceof MkSendNode or + this instanceof MkParameterInit or + this instanceof MkArgumentNode or + this instanceof MkResultInit or + this instanceof MkNextNode or + this instanceof MkImplicitTrue or + this instanceof MkCaseCheckNode or + this instanceof MkImplicitLowerSliceBound or + this instanceof MkImplicitUpperSliceBound or + this instanceof MkImplicitMaxSliceBound or + this instanceof MkImplicitDeref or + this instanceof MkImplicitFieldSelection + } + + /** Holds if this instruction reads the value of variable or constant `v`. */ + predicate reads(ValueEntity v) { this.readsField(_, v) or this.readsMethod(_, v) } + + /** Holds if this instruction updates variable or constant `v` to the value of `rhs`. */ + predicate writes(ValueEntity v, Instruction rhs) { this.writesField(_, v, rhs) } + + /** Holds if this instruction reads the value of field `f` on the value of `base`. */ + predicate readsField(Instruction base, Field f) { none() } + + /** Holds if this instruction updates the value of field `f` on the value of `base`. */ + predicate writesField(Instruction base, Field f, Instruction rhs) { none() } + + /** Holds if this instruction looks up method `m` on the value of `receiver`. */ + predicate readsMethod(Instruction receiver, Method m) { none() } + + /** Holds if this instruction reads the value of element `index` on the value of `base`. */ + predicate readsElement(Instruction base, Instruction index) { none() } + + /** Holds if this instruction updates the value of element `index` on the value of `base`. */ + predicate writesElement(Instruction base, Instruction index) { none() } + + /** Gets the type of the result of this instruction, if any. */ + Type getResultType() { none() } + + /** Gets the float value of the result of this instruction, if it can be determined. */ + float getFloatValue() { none() } + + /** Gets the int value of the result of this instruction, if it can be determined. */ + int getIntValue() { none() } + + /** + * Holds if the complex value of the result of this instruction has real part `real` and + * imaginary part `imag`. + */ + predicate hasComplexValue(float real, float imag) { none() } + + /** Gets either `getFloatValue` or `getIntValue` */ + float getNumericValue() { result = this.getFloatValue() or result = this.getIntValue() } + + /** + * Gets the string representation of the exact value of the result of this instruction, + * if any. + * + * For example, for the constant 3.141592653589793238462, this will + * result in 1570796326794896619231/500000000000000000000 + */ + string getExactValue() { none() } + + /** Gets the string value of the result of this instruction, if it can be determined. */ + string getStringValue() { none() } + + /** Gets the Boolean value of the result of this instruction, if it can be determined. */ + boolean getBoolValue() { none() } + + /** Holds if the result of this instruction is known at compile time. */ + predicate isConst() { none() } + + /** + * Holds if the result of this instruction is known at compile time, and is guaranteed not to + * depend on the platform where it is evaluated. + */ + predicate isPlatformIndependentConstant() { none() } + + /** Gets a textual representation of the kind of this instruction. */ + string getInsnKind() { + this instanceof MkExprNode and result = "expression" + or + this instanceof MkLiteralElementInitNode and result = "element init" + or + this instanceof MkImplicitLiteralElementIndex and result = "element index" + or + this instanceof MkAssignNode and result = "assignment" + or + this instanceof MkCompoundAssignRhsNode and result = "right-hand side of compound assignment" + or + this instanceof MkExtractNode and result = "tuple element extraction" + or + this instanceof MkZeroInitNode and result = "zero value" + or + this instanceof MkFuncDeclNode and result = "function declaration" + or + this instanceof MkDeferNode and result = "defer" + or + this instanceof MkGoNode and result = "go" + or + this instanceof MkConditionGuardNode and result = "condition guard" + or + this instanceof MkIncDecNode and result = "increment/decrement" + or + this instanceof MkIncDecRhs and result = "right-hand side of increment/decrement" + or + this instanceof MkImplicitOne and result = "implicit 1" + or + this instanceof MkReturnNode and result = "return" + or + this instanceof MkResultWriteNode and result = "result write" + or + this instanceof MkResultReadNode and result = "result read" + or + this instanceof MkSelectNode and result = "select" + or + this instanceof MkSendNode and result = "send" + or + this instanceof MkParameterInit and result = "parameter initialization" + or + this instanceof MkArgumentNode and result = "argument" + or + this instanceof MkResultInit and result = "result initialization" + or + this instanceof MkNextNode and result = "next key-value pair" + or + this instanceof MkImplicitTrue and result = "implicit true" + or + this instanceof MkCaseCheckNode and result = "case" + or + this instanceof MkImplicitLowerSliceBound and result = "implicit lower bound" + or + this instanceof MkImplicitUpperSliceBound and result = "implicit upper bound" + or + this instanceof MkImplicitMaxSliceBound and result = "implicit maximum" + or + this instanceof MkImplicitDeref and result = "implicit dereference" + or + this instanceof MkImplicitFieldSelection and result = "implicit field selection" + } + } + + /** + * An IR instruction representing the evaluation of an expression. + */ + class EvalInstruction extends Instruction, MkExprNode { + Expr e; + + EvalInstruction() { this = MkExprNode(e) } + + /** Gets the expression underlying this instruction. */ + Expr getExpr() { result = e } + + override predicate reads(ValueEntity v) { e = v.getAReference() } + + override Type getResultType() { result = e.getType() } + + override ControlFlow::Root getRoot() { result.isRootOf(e) } + + override float getFloatValue() { result = e.getFloatValue() } + + override int getIntValue() { result = e.getIntValue() } + + override predicate hasComplexValue(float real, float imag) { e.hasComplexValue(real, imag) } + + override string getExactValue() { result = e.getExactValue() } + + override string getStringValue() { result = e.getStringValue() } + + override boolean getBoolValue() { result = e.getBoolValue() } + + override predicate isConst() { e.isConst() } + + override predicate isPlatformIndependentConstant() { e.isPlatformIndependentConstant() } + + override string toString() { result = e.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + e.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An IR instruction that reads the value of a variable, constant, field or array element, + * or refers to a function. + */ + class ReadInstruction extends Instruction { + ReadInstruction() { + exists(Expr e | e = this.(EvalInstruction).getExpr() | + (e instanceof ValueName or e instanceof IndexExpr) and + e.(ReferenceExpr).isRvalue() + ) + or + this instanceof ReadResultInstruction + or + this instanceof MkImplicitFieldSelection + } + } + + /** + * Gets the effective base of a selector, index or slice expression, taking implicit dereferences + * and implicit field reads into account. + * + * For a selector expression `b.f`, this could be the implicit dereference `*b`, or the implicit + * field access `b.Embedded` if the field `f` is promoted from an embedded type `Embedded`, or a + * combination of both `*(b.Embedded)`, or simply `b` if neither case applies. + */ + private Instruction selectorBase(Expr e) { + exists(ImplicitFieldReadInstruction fri | fri.getSelectorExpr() = e and fri.getIndex() = 1 | + result = fri + ) + or + not exists(ImplicitFieldReadInstruction fri | fri.getSelectorExpr() = e and fri.getIndex() = 1) and + exists(Expr base | + base = e.(SelectorExpr).getBase() + or + base = e.(IndexExpr).getBase() + or + base = e.(SliceExpr).getBase() + | + result = MkImplicitDeref(base) + or + not exists(MkImplicitDeref(base)) and + result = evalExprInstruction(base) + ) + } + + /** + * An IR instruction that reads a component from a composite object. + * + * This is either a field of a struct, or an element of an array, map, slice or string. + */ + class ComponentReadInstruction extends ReadInstruction { + ComponentReadInstruction() { + exists(Expr e | e = this.(EvalInstruction).getExpr() | + e instanceof IndexExpr + or + e.(SelectorExpr).getBase() instanceof ValueExpr and + not e.(SelectorExpr).getSelector() = any(Method method).getAReference() + ) + or + this instanceof MkImplicitFieldSelection + } + + /** Gets the instruction computing the base value on which the field or element is read. */ + Instruction getBase() { + result = this.(ImplicitFieldReadInstruction).getBaseInstruction() + or + result = selectorBase(this.(EvalInstruction).getExpr()) + } + } + + /** + * An IR instruction that reads the value of a field. + * + * On snapshots with incomplete type information, method expressions may sometimes be + * misclassified as field reads. + */ + class FieldReadInstruction extends ComponentReadInstruction { + SelectorExpr e; + int index; + Field field; + + FieldReadInstruction() { + e = this.(EvalInstruction).getExpr() and + index = 0 and + field.getAReference() = e.getSelector() + or + this = MkImplicitFieldSelection(e, index, field) + } + + /** Gets the `SelectorExpr` of this field read. */ + SelectorExpr getSelectorExpr() { result = e } + + /** Gets the index of this field read. */ + int getIndex() { result = index } + + /** Gets the field being read. */ + Field getField() { result = field } + + Instruction getBaseInstruction() { + exists(ImplicitFieldReadInstruction fri | + fri.getSelectorExpr() = e and fri.getIndex() = pragma[only_bind_into](index + 1) + | + result = fri + ) + or + not exists(ImplicitFieldReadInstruction fri | + fri.getSelectorExpr() = e and fri.getIndex() = pragma[only_bind_into](index + 1) + ) and + ( + result = MkImplicitDeref(e.getBase()) + or + not exists(MkImplicitDeref(e.getBase())) and + result = evalExprInstruction(e.getBase()) + ) + } + + override predicate readsField(Instruction base, Field f) { + base = this.getBaseInstruction() and f = field + } + } + + /** + * An IR instruction for an implicit field read as part of reading a + * promoted field. + * + * If the field that is being implicitly read has a pointer type then this + * instruction represents an implicit dereference of it. + */ + class ImplicitFieldReadInstruction extends FieldReadInstruction, MkImplicitFieldSelection { + ImplicitFieldReadInstruction() { this = MkImplicitFieldSelection(e, index, field) } + + override predicate reads(ValueEntity v) { v = field } + + override Type getResultType() { + if field.getType() instanceof PointerType + then result = field.getType().(PointerType).getBaseType() + else result = field.getType() + } + + override ControlFlow::Root getRoot() { result.isRootOf(e) } + + override string toString() { result = "implicit read of field " + field.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + e.getBase().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An IR instruction that looks up a method. + */ + class MethodReadInstruction extends ReadInstruction, EvalInstruction { + Method method; + override SelectorExpr e; + + MethodReadInstruction() { e.getSelector() = method.getAReference() } + + /** Gets the instruction computing the receiver value on which the method is looked up. */ + Instruction getReceiver() { result = selectorBase(e) } + + /** Gets the method being looked up. */ + Method getMethod() { result = method } + + override predicate readsMethod(Instruction receiver, Method m) { + receiver = this.getReceiver() and m = this.getMethod() + } + } + + /** + * An IR instruction that reads an element of an array, slice, map or string. + */ + class ElementReadInstruction extends ComponentReadInstruction, EvalInstruction { + override IndexExpr e; + + /** Gets the instruction computing the index of the element being looked up. */ + Instruction getIndex() { result = evalExprInstruction(e.getIndex()) } + + override predicate readsElement(Instruction base, Instruction index) { + base = this.getBase() and index = this.getIndex() + } + } + + /** + * An IR instruction that constructs a slice. + */ + class SliceInstruction extends EvalInstruction { + override SliceExpr e; + + /** Gets the instruction computing the base value from which the slice is constructed. */ + Instruction getBase() { result = selectorBase(e) } + + /** Gets the instruction computing the lower bound of the slice. */ + Instruction getLow() { + result = evalExprInstruction(e.getLow()) or + result = implicitLowerSliceBoundInstruction(e) + } + + /** Gets the instruction computing the upper bound of the slice. */ + Instruction getHigh() { + result = evalExprInstruction(e.getHigh()) or + result = implicitUpperSliceBoundInstruction(e) + } + + /** Gets the instruction computing the capacity of the slice. */ + Instruction getMax() { + result = evalExprInstruction(e.getMax()) or + result = implicitMaxSliceBoundInstruction(e) + } + } + + /** + * An IR instruction that writes a memory location. + */ + class WriteInstruction extends Instruction { + WriteTarget lhs; + + WriteInstruction() { + lhs = MkLhs(this, _) + or + lhs = MkLiteralElementTarget(this) + or + lhs = MkResultWriteTarget(this) + } + + /** Gets the target to which this instruction writes. */ + WriteTarget getLhs() { result = lhs } + + /** Gets the instruction computing the value this instruction writes. */ + Instruction getRhs() { none() } + + override predicate writes(ValueEntity v, Instruction rhs) { + this.getLhs().refersTo(v) and + rhs = this.getRhs() + } + } + + /** + * An IR instruction that initializes a component of a composite literal. + */ + class InitLiteralComponentInstruction extends WriteInstruction, MkLiteralElementInitNode { + CompositeLit lit; + int i; + Expr elt; + + InitLiteralComponentInstruction() { + this = MkLiteralElementInitNode(elt) and elt = lit.getElement(i) + } + + /** Gets the instruction allocating the composite literal. */ + Instruction getBase() { result = evalExprInstruction(lit) } + + override Instruction getRhs() { + result = evalExprInstruction(elt) or + result = evalExprInstruction(elt.(KeyValueExpr).getValue()) + } + + override ControlFlow::Root getRoot() { result.isRootOf(elt) } + + override string toString() { result = "init of " + elt } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + elt.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An IR instruction that initializes a field of a struct literal. + */ + class InitLiteralStructFieldInstruction extends InitLiteralComponentInstruction { + override StructLit lit; + + /** Gets the name of the initialized field. */ + string getFieldName() { + if elt instanceof KeyValueExpr + then result = elt.(KeyValueExpr).getKey().(Ident).getName() + else lit.getStructType().hasOwnField(i, result, _, _) + } + + /** Gets the initialized field. */ + Field getField() { + result.getDeclaringType() = lit.getStructType() and + result.getName() = this.getFieldName() + } + } + + /** + * An IR instruction that initializes an element of an array, slice or map literal. + */ + class InitLiteralElementInstruction extends InitLiteralComponentInstruction { + Type literalType; + + InitLiteralElementInstruction() { + literalType = lit.getType().getUnderlyingType() and + ( + literalType instanceof ArrayType or + literalType instanceof SliceType or + literalType instanceof MapType + ) + } + + /** Gets the instruction computing the index of the initialized element. */ + Instruction getIndex() { + result = evalExprInstruction(elt.(KeyValueExpr).getKey()) + or + result = MkImplicitLiteralElementIndex(elt) + } + } + + /** + * An IR instruction that initializes an element of an array literal. + */ + class InitLiteralArrayElementInstruction extends InitLiteralElementInstruction { + override ArrayType literalType; + } + + /** + * An IR instruction that initializes an element of a slice literal. + */ + class InitLiteralSliceElementInstruction extends InitLiteralElementInstruction { + override SliceType literalType; + } + + /** + * An IR instruction that initializes an element of a map literal. + */ + class InitLiteralMapElementInstruction extends InitLiteralElementInstruction { + override MapType literalType; + } + + /** + * An IR instruction that writes to a field. + */ + class FieldWriteInstruction extends WriteInstruction { + override FieldTarget lhs; + + /** Gets the instruction computing the base value on which the field is written. */ + Instruction getBase() { result = lhs.getBase() } + + /** Gets the field being written. */ + Field getField() { result = lhs.getField() } + + override predicate writesField(Instruction base, Field f, Instruction rhs) { + this.getBase() = base and + this.getField() = f and + this.getRhs() = rhs + } + } + + /** + * An IR instruction that writes to an element of an array, slice, or map. + */ + class ElementWriteInstruction extends WriteInstruction { + override ElementTarget lhs; + + /** Gets the instruction computing the base value on which the field is written. */ + Instruction getBase() { result = lhs.getBase() } + + /** Gets the instruction computing the element index being written. */ + Instruction getIndex() { result = lhs.getIndex() } + + override predicate writesElement(Instruction base, Instruction index) { + this.getBase() = base and + this.getIndex() = index + } + } + + /** Holds if `lit` does not specify any explicit keys. */ + private predicate noExplicitKeys(CompositeLit lit) { + not lit.getAnElement() instanceof KeyValueExpr + } + + /** Gets the index of the `i`th element in (array or slice) literal `lit`. */ + private int getElementIndex(CompositeLit lit, int i) { + ( + lit.getType().getUnderlyingType() instanceof ArrayType or + lit.getType().getUnderlyingType() instanceof SliceType + ) and + exists(Expr elt | elt = lit.getElement(i) | + // short-circuit computation for literals without any explicit keys + noExplicitKeys(lit) and result = i + or + result = elt.(KeyValueExpr).getKey().getIntValue() + or + not elt instanceof KeyValueExpr and + ( + i = 0 and result = 0 + or + result = getElementIndex(lit, i - 1) + 1 + ) + ) + } + + /** + * An IR instruction computing the implicit index of an element in an array or slice literal. + */ + class ImplicitLiteralElementIndexInstruction extends Instruction, MkImplicitLiteralElementIndex { + Expr elt; + + ImplicitLiteralElementIndexInstruction() { this = MkImplicitLiteralElementIndex(elt) } + + override Type getResultType() { result instanceof IntType } + + override ControlFlow::Root getRoot() { result.isRootOf(elt) } + + override int getIntValue() { + exists(CompositeLit lit, int i | elt = lit.getElement(i) | result = getElementIndex(lit, i)) + } + + override string getStringValue() { none() } + + override string getExactValue() { result = this.getIntValue().toString() } + + override predicate isPlatformIndependentConstant() { any() } + + override predicate isConst() { any() } + + override string toString() { result = "element index" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + elt.hasLocationInfo(filepath, startline, startcolumn, _, _) and + endline = startline and + endcolumn = startcolumn + } + } + + /** + * An instruction assigning to a variable or field. + */ + class AssignInstruction extends WriteInstruction, MkAssignNode { + AstNode assgn; + int i; + + AssignInstruction() { this = MkAssignNode(assgn, i) } + + override Instruction getRhs() { + exists(SimpleAssignStmt a | a = assgn | + a.getNumLhs() = a.getNumRhs() and + result = evalExprInstruction(a.getRhs(i)) + ) + or + exists(ValueSpec spec | spec = assgn | + spec.getNumName() = spec.getNumInit() and + result = evalExprInstruction(spec.getInit(i)) + or + result = MkZeroInitNode(any(ValueEntity v | spec.getNameExpr(i) = v.getDeclaration())) + ) + or + result = MkCompoundAssignRhsNode(assgn) + or + result = MkExtractNode(assgn, i) + } + + override ControlFlow::Root getRoot() { result.isRootOf(assgn) } + + override string toString() { result = "assignment to " + this.getLhs() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getLhs().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** An instruction computing the value of the right-hand side of a compound assignment. */ + class EvalCompoundAssignRhsInstruction extends Instruction, MkCompoundAssignRhsNode { + CompoundAssignStmt assgn; + + EvalCompoundAssignRhsInstruction() { this = MkCompoundAssignRhsNode(assgn) } + + /** Gets the underlying assignment of this instruction. */ + CompoundAssignStmt getAssignment() { result = assgn } + + override Type getResultType() { result = assgn.getRhs().getType() } + + override ControlFlow::Root getRoot() { result.isRootOf(assgn) } + + override string toString() { result = assgn.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + assgn.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction selecting one of multiple values returned by a function, or either the key + * or the value of the iterator in a range loop, or the result or success value from a type + * assertion. + */ + class ExtractTupleElementInstruction extends Instruction, MkExtractNode { + AstNode s; + int i; + + ExtractTupleElementInstruction() { this = MkExtractNode(s, i) } + + /** Gets the instruction computing the tuple value from which one value is extracted. */ + Instruction getBase() { + exists(Expr baseExpr | + baseExpr = s.(Assignment).getRhs() or + baseExpr = s.(ValueSpec).getInit() + | + result = evalExprInstruction(baseExpr) + ) + or + result = MkNextNode(s) + or + result = evalExprInstruction(s.(ReturnStmt).getExpr()) + or + result = evalExprInstruction(s.(CallExpr).getArgument(0).stripParens()) + } + + /** Holds if this extracts the `idx`th value of the result of `base`. */ + predicate extractsElement(Instruction base, int idx) { base = this.getBase() and idx = i } + + override Type getResultType() { + exists(CallExpr c | this.getBase() = evalExprInstruction(c) | + result = c.getTarget().getResultType(i) + ) + or + exists(Expr e | this.getBase() = evalExprInstruction(e) | + result = e.getType().(TupleType).getComponentType(pragma[only_bind_into](i)) + ) + or + exists(Type rangeType | rangeType = s.(RangeStmt).getDomain().getType().getUnderlyingType() | + exists(Type baseType | + baseType = rangeType.(ArrayType).getElementType() or + baseType = + rangeType.(PointerType).getBaseType().getUnderlyingType().(ArrayType).getElementType() or + baseType = rangeType.(SliceType).getElementType() + | + i = 0 and + result instanceof IntType + or + i = 1 and + result = baseType + ) + or + rangeType instanceof StringType and + ( + i = 0 and + result instanceof IntType + or + result = Builtin::rune().getType() + ) + or + exists(MapType map | map = rangeType | + i = 0 and + result = map.getKeyType() + or + i = 1 and + result = map.getValueType() + ) + or + i = 0 and + result = rangeType.(RecvChanType).getElementType() + or + i = 0 and + result = rangeType.(SendRecvChanType).getElementType() + ) + } + + override ControlFlow::Root getRoot() { result.isRootOf(s) } + + override string toString() { result = s + "[" + i + "]" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + s.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that computes the zero value for a variable or constant. + */ + class EvalImplicitInitInstruction extends Instruction, MkZeroInitNode { + ValueEntity v; + + EvalImplicitInitInstruction() { this = MkZeroInitNode(v) } + + override Type getResultType() { result = v.getType() } + + override ControlFlow::Root getRoot() { result.isRootOf(v.getDeclaration()) } + + override int getIntValue() { + v.getType().getUnderlyingType() instanceof IntegerType and result = 0 + } + + override float getFloatValue() { + v.getType().getUnderlyingType() instanceof FloatType and result = 0.0 + } + + override string getStringValue() { + v.getType().getUnderlyingType() instanceof StringType and result = "" + } + + override boolean getBoolValue() { + v.getType().getUnderlyingType() instanceof BoolType and result = false + } + + override string getExactValue() { + result = this.getIntValue().toString() or + result = this.getFloatValue().toString() or + result = this.getStringValue().toString() or + result = this.getBoolValue().toString() + } + + override predicate isConst() { any() } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = "zero value for " + v } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + v.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that corresponds to the declaration of a function. + */ + class DeclareFunctionInstruction extends Instruction, MkFuncDeclNode { + FuncDecl fd; + + DeclareFunctionInstruction() { this = MkFuncDeclNode(fd) } + + override Type getResultType() { result = fd.getType() } + + override string toString() { result = fd.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + fd.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that corresponds to a `defer` statement. + */ + class DeferInstruction extends Instruction, MkDeferNode { + DeferStmt defer; + + DeferInstruction() { this = MkDeferNode(defer) } + + override ControlFlow::Root getRoot() { result.isRootOf(defer) } + + override string toString() { result = defer.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + defer.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that corresponds to a `go` statement. + */ + class GoInstruction extends Instruction, MkGoNode { + GoStmt go; + + GoInstruction() { this = MkGoNode(go) } + + override ControlFlow::Root getRoot() { result.isRootOf(go) } + + override string toString() { result = go.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + go.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that corresponds to an increment or decrement statement. + */ + class IncDecInstruction extends WriteInstruction, MkIncDecNode { + IncDecStmt ids; + + IncDecInstruction() { this = MkIncDecNode(ids) } + + override Instruction getRhs() { result = MkIncDecRhs(ids) } + + override ControlFlow::Root getRoot() { result.isRootOf(ids) } + + override string toString() { result = ids.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ids.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that computes the (implicit) right-hand side of an increment or + * decrement statement. + */ + class EvalIncDecRhsInstruction extends Instruction, MkIncDecRhs { + IncDecStmt ids; + + EvalIncDecRhsInstruction() { this = MkIncDecRhs(ids) } + + /** Gets the corresponding increment or decrement statement. */ + IncDecStmt getStmt() { result = ids } + + override Type getResultType() { result = ids.getOperand().getType() } + + override ControlFlow::Root getRoot() { result.isRootOf(ids) } + + override string toString() { result = "rhs of " + ids } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ids.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction computing the implicit operand `1` in an increment or decrement statement. + */ + class EvalImplicitOneInstruction extends Instruction, MkImplicitOne { + IncDecStmt ids; + + EvalImplicitOneInstruction() { this = MkImplicitOne(ids) } + + /** Gets the corresponding increment or decrement statement. */ + IncDecStmt getStmt() { result = ids } + + override Type getResultType() { result = ids.getOperand().getType() } + + override ControlFlow::Root getRoot() { result.isRootOf(ids) } + + override int getIntValue() { result = 1 } + + override string getExactValue() { result = "1" } + + override predicate isConst() { any() } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = "1" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ids.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction corresponding to a return from a function. + */ + class ReturnInstruction extends Instruction, MkReturnNode { + ReturnStmt ret; + + ReturnInstruction() { this = MkReturnNode(ret) } + + /** Gets the corresponding `ReturnStmt`. */ + ReturnStmt getReturnStmt() { result = ret } + + /** Holds if this statement returns multiple results. */ + predicate returnsMultipleResults() { exists(MkExtractNode(ret, _)) or ret.getNumExpr() > 1 } + + /** Gets the instruction whose result is the (unique) result returned by this statement. */ + Instruction getResult() { + not this.returnsMultipleResults() and + result = evalExprInstruction(ret.getExpr()) + } + + /** Gets the instruction whose result is the `i`th result returned by this statement. */ + Instruction getResult(int i) { + result = MkExtractNode(ret, i) + or + not exists(MkExtractNode(ret, _)) and + result = evalExprInstruction(ret.getExpr(i)) + } + + override ControlFlow::Root getRoot() { result.isRootOf(ret) } + + override string toString() { result = ret.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ret.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that represents the implicit assignment to a result variable + * performed by a return statement. + */ + class WriteResultInstruction extends WriteInstruction, MkResultWriteNode { + ResultVariable var; + int i; + ReturnInstruction ret; + + WriteResultInstruction() { + exists(ReturnStmt retstmt | + this = MkResultWriteNode(var, i, retstmt) and + ret = MkReturnNode(retstmt) + ) + } + + override Instruction getRhs() { result = ret.getResult(i) } + + /** Gets the result variable being assigned. */ + ResultVariable getResultVariable() { result = var } + + override Type getResultType() { result = var.getType() } + + override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } + + override string toString() { result = "implicit write of " + var } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ret.getResult(i).hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that reads the final value of a result variable upon returning + * from a function. + */ + class ReadResultInstruction extends Instruction, MkResultReadNode { + ResultVariable var; + + ReadResultInstruction() { this = MkResultReadNode(var) } + + override predicate reads(ValueEntity v) { v = var } + + override Type getResultType() { result = var.getType() } + + override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } + + override string toString() { result = "implicit read of " + var } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + var.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction corresponding to a `select` statement. + */ + class SelectInstruction extends Instruction, MkSelectNode { + SelectStmt sel; + + SelectInstruction() { this = MkSelectNode(sel) } + + override ControlFlow::Root getRoot() { result.isRootOf(sel) } + + override string toString() { result = sel.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + sel.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction corresponding to a send statement. + */ + class SendInstruction extends Instruction, MkSendNode { + SendStmt send; + + SendInstruction() { this = MkSendNode(send) } + + override ControlFlow::Root getRoot() { result.isRootOf(send) } + + override string toString() { result = send.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + send.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction initializing a parameter to the corresponding argument. + */ + class InitParameterInstruction extends WriteInstruction, MkParameterInit { + Parameter parm; + + InitParameterInstruction() { this = MkParameterInit(parm) } + + override Instruction getRhs() { result = MkArgumentNode(parm) } + + override ControlFlow::Root getRoot() { result = parm.getFunction() } + + override string toString() { result = "initialization of " + parm } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + parm.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction reading the value of a function argument. + */ + class ReadArgumentInstruction extends Instruction, MkArgumentNode { + Parameter parm; + + ReadArgumentInstruction() { this = MkArgumentNode(parm) } + + override Type getResultType() { result = parm.getType() } + + override ControlFlow::Root getRoot() { result = parm.getFunction() } + + override string toString() { result = "argument corresponding to " + parm } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + parm.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction initializing a result variable to its zero value. + */ + class InitResultInstruction extends WriteInstruction, MkResultInit { + ResultVariable res; + + InitResultInstruction() { this = MkResultInit(res) } + + override Instruction getRhs() { result = MkZeroInitNode(res) } + + override ControlFlow::Root getRoot() { result = res.getFunction() } + + override string toString() { result = "initialization of " + res } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + res.getDeclaration().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction that gets the next key-value pair in a range loop. + */ + class GetNextEntryInstruction extends Instruction, MkNextNode { + RangeStmt rs; + + GetNextEntryInstruction() { this = MkNextNode(rs) } + + /** + * Gets the instruction computing the value whose key-value pairs this instruction reads. + */ + Instruction getDomain() { result = evalExprInstruction(rs.getDomain()) } + + override ControlFlow::Root getRoot() { result.isRootOf(rs) } + + override string toString() { result = "next key-value pair in range" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + rs.getDomain().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction computing the implicit `true` value in an expression-less `switch` statement. + */ + class EvalImplicitTrueInstruction extends Instruction, MkImplicitTrue { + Stmt stmt; + + EvalImplicitTrueInstruction() { this = MkImplicitTrue(stmt) } + + override Type getResultType() { result instanceof BoolType } + + override ControlFlow::Root getRoot() { result.isRootOf(stmt) } + + override boolean getBoolValue() { result = true } + + override string getExactValue() { result = "true" } + + override predicate isConst() { any() } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = "true" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + stmt.hasLocationInfo(filepath, startline, startcolumn, _, _) and + endline = startline and + endcolumn = startcolumn + } + } + + /** + * An instruction corresponding to the implicit comparison or type check performed by an + * expression in a `case` clause. + * + * For example, consider this `switch` statement: + * + * ```go + * switch x { + * case 2, y+1: + * ... + * } + * ``` + * + * The expressions `2` and `y+1` are implicitly compared to `x`. These comparisons are + * represented by case instructions. + */ + class CaseInstruction extends Instruction, MkCaseCheckNode { + CaseClause cc; + int i; + + CaseInstruction() { this = MkCaseCheckNode(cc, i) } + + override ControlFlow::Root getRoot() { result.isRootOf(cc) } + + override string toString() { result = "case " + cc.getExpr(i) } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + cc.getExpr(i).hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction computing the implicit lower slice bound of zero in a slice expression without + * an explicit lower bound. + */ + class EvalImplicitLowerSliceBoundInstruction extends Instruction, MkImplicitLowerSliceBound { + SliceExpr slice; + + EvalImplicitLowerSliceBoundInstruction() { this = MkImplicitLowerSliceBound(slice) } + + override Type getResultType() { result instanceof IntType } + + override ControlFlow::Root getRoot() { result.isRootOf(slice) } + + override int getIntValue() { result = 0 } + + override string getExactValue() { result = "0" } + + override predicate isConst() { any() } + + override predicate isPlatformIndependentConstant() { any() } + + override string toString() { result = "0" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + slice.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction computing the implicit upper slice bound in a slice expression without an + * explicit upper bound. + */ + class EvalImplicitUpperSliceBoundInstruction extends Instruction, MkImplicitUpperSliceBound { + SliceExpr slice; + + EvalImplicitUpperSliceBoundInstruction() { this = MkImplicitUpperSliceBound(slice) } + + override ControlFlow::Root getRoot() { result.isRootOf(slice) } + + override Type getResultType() { result instanceof IntType } + + override string toString() { result = "len" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + slice.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction computing the implicit maximum slice bound in a slice expression without an + * explicit maximum bound. + */ + class EvalImplicitMaxSliceBoundInstruction extends Instruction, MkImplicitMaxSliceBound { + SliceExpr slice; + + EvalImplicitMaxSliceBoundInstruction() { this = MkImplicitMaxSliceBound(slice) } + + override ControlFlow::Root getRoot() { result.isRootOf(slice) } + + override Type getResultType() { result instanceof IntType } + + override string toString() { result = "cap" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + slice.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An instruction implicitly dereferencing the base in a field or method reference through a + * pointer, or the base in an element or slice reference through a pointer. + */ + class EvalImplicitDerefInstruction extends Instruction, MkImplicitDeref { + Expr e; + + EvalImplicitDerefInstruction() { this = MkImplicitDeref(e) } + + /** Gets the operand that is being dereferenced. */ + Expr getOperand() { result = e } + + override Type getResultType() { + result = e.getType().getUnderlyingType().(PointerType).getBaseType() + } + + override ControlFlow::Root getRoot() { result.isRootOf(e) } + + override string toString() { result = "implicit dereference" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + e.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** A representation of the target of a write instruction. */ + class WriteTarget extends TWriteTarget { + ControlFlow::Node w; + + WriteTarget() { + this = MkLhs(w, _) or this = MkLiteralElementTarget(w) or this = MkResultWriteTarget(w) + } + + /** Gets the write instruction of which this is the target. */ + WriteInstruction getWrite() { result = w } + + /** Gets the name of the variable or field being written to, if any. */ + string getName() { none() } + + /** Gets the SSA variable being written to, if any. */ + SsaVariable asSsaVariable() { + this.getWrite() = result.getDefinition().(SsaExplicitDefinition).getInstruction() + } + + /** Holds if `e` is the variable or field being written to. */ + predicate refersTo(ValueEntity e) { none() } + + /** Gets a textual representation of this target. */ + string toString() { result = "write target" } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + filepath = "" and startline = 0 and startcolumn = 0 and endline = 0 and endcolumn = 0 + } + } + + /** A reference to a variable or constant, used as the target of a write. */ + class VarOrConstTarget extends WriteTarget { + Expr loc; + + VarOrConstTarget() { + this = MkLhs(_, loc) and + ( + loc instanceof Ident + or + loc instanceof SelectorExpr and + not loc.(SelectorExpr).getBase() instanceof ReferenceExpr + ) + or + exists(WriteResultInstruction wr | + this = MkResultWriteTarget(wr) and + evalExprInstruction(loc) = wr.getRhs() + ) + } + + override predicate refersTo(ValueEntity e) { + this instanceof MkLhs and + loc = e.getAReference() + or + exists(WriteResultInstruction wr | this = MkResultWriteTarget(wr) | + e = wr.getResultVariable() + ) + } + + override string getName() { + this = MkLhs(_, loc) and + ( + result = loc.(Ident).getName() + or + result = loc.(SelectorExpr).getSelector().getName() + ) + or + exists(WriteResultInstruction wr | this = MkResultWriteTarget(wr) | + result = wr.getResultVariable().getName() + ) + } + + /** Gets the variable this refers to, if any. */ + Variable getVariable() { this.refersTo(result) } + + /** Gets the constant this refers to, if any. */ + Constant getConstant() { this.refersTo(result) } + + override string toString() { result = this.getName() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + loc.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** A reference to a field, used as the target of a write. */ + class FieldTarget extends WriteTarget { + FieldTarget() { + exists(SelectorExpr sel | this = MkLhs(_, sel) | sel.getBase() instanceof ValueExpr) + or + w instanceof InitLiteralStructFieldInstruction + } + + /** Gets the instruction computing the base value on which this field is accessed. */ + Instruction getBase() { + exists(SelectorExpr sel | this = MkLhs(_, sel) | result = selectorBase(sel)) + or + result = w.(InitLiteralStructFieldInstruction).getBase() + } + + /** Get the type of the base of this field access, that is, the type that contains the field. */ + Type getBaseType() { result = this.getBase().getResultType() } + + override predicate refersTo(ValueEntity e) { + exists(SelectorExpr sel | this = MkLhs(_, sel) | sel.uses(e)) + or + e = w.(InitLiteralStructFieldInstruction).getField() + } + + override string getName() { exists(Field f | this.refersTo(f) | result = f.getName()) } + + /** Gets the field this refers to, if it can be determined. */ + Field getField() { this.refersTo(result) } + + override string toString() { + exists(SelectorExpr sel | this = MkLhs(_, sel) | + result = "field " + sel.getSelector().getName() + ) + or + result = "field " + w.(InitLiteralStructFieldInstruction).getFieldName() + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(SelectorExpr sel | this = MkLhs(_, sel) | + sel.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + ) + or + w.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * A reference to an element of an array, slice or map, used as the target of a write. + */ + class ElementTarget extends WriteTarget { + ElementTarget() { + this = MkLhs(_, any(IndexExpr idx)) + or + w instanceof InitLiteralElementInstruction + } + + /** Gets the instruction computing the base value of this element reference. */ + Instruction getBase() { + exists(IndexExpr idx | this = MkLhs(_, idx) | result = selectorBase(idx)) + or + result = w.(InitLiteralComponentInstruction).getBase() + } + + /** Gets the instruction computing the index of this element reference. */ + Instruction getIndex() { + exists(IndexExpr idx | this = MkLhs(_, idx) | result = evalExprInstruction(idx.getIndex())) + or + result = w.(InitLiteralElementInstruction).getIndex() + } + + override string toString() { result = "element" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(IndexExpr idx | this = MkLhs(_, idx) | + idx.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + ) + or + w.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * A pointer dereference, used as the target of a write. + */ + class PointerTarget extends WriteTarget { + Expr lhs; + + PointerTarget() { + this = MkLhs(_, lhs) and + (lhs instanceof StarExpr or lhs instanceof DerefExpr) + } + + /** Gets the instruction computing the pointer value being dereferenced. */ + Instruction getBase() { + exists(Expr base | base = lhs.(StarExpr).getBase() or base = lhs.(DerefExpr).getOperand() | + result = evalExprInstruction(base) + ) + } + + override string toString() { result = lhs.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + lhs.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * Gets the (final) instruction computing the value of `e`. + * + * Note that some expressions (such as type expressions or labels) have no corresponding + * instruction, so this predicate is undefined for them. + * + * Short-circuiting expressions that are purely used for control flow (meaning that their + * value is not stored in a variable or used to compute the value of a non-shortcircuiting + * expression) do not have a final instruction either. + */ + Instruction evalExprInstruction(Expr e) { + result = MkExprNode(e) or + result = evalExprInstruction(e.(ParenExpr).getExpr()) + } + + /** + * Gets the instruction corresponding to the initialization of `r`. + */ + InitParameterInstruction initRecvInstruction(ReceiverVariable r) { result = MkParameterInit(r) } + + /** + * Gets the instruction corresponding to the initialization of `p`. + */ + InitParameterInstruction initParamInstruction(Parameter p) { result = MkParameterInit(p) } + + /** + * Gets the instruction corresponding to the `i`th assignment happening at + * `assgn` (0-based). + */ + AssignInstruction assignInstruction(Assignment assgn, int i) { result = MkAssignNode(assgn, i) } + + /** + * Gets the instruction corresponding to the `i`th initialization happening + * at `spec` (0-based). + */ + AssignInstruction initInstruction(ValueSpec spec, int i) { result = MkAssignNode(spec, i) } + + /** + * Gets the instruction corresponding to the assignment of the key variable + * of range statement `rs`. + */ + AssignInstruction assignKeyInstruction(RangeStmt rs) { result = MkAssignNode(rs, 0) } + + /** + * Gets the instruction corresponding to the assignment of the value variable + * of range statement `rs`. + */ + AssignInstruction assignValueInstruction(RangeStmt rs) { result = MkAssignNode(rs, 1) } + + /** + * Gets the instruction corresponding to the implicit initialization of `v` + * to its zero value. + */ + EvalImplicitInitInstruction implicitInitInstruction(ValueEntity v) { result = MkZeroInitNode(v) } + + /** + * Gets the instruction corresponding to the extraction of the `idx`th element + * of the tuple produced by `base`. + */ + ExtractTupleElementInstruction extractTupleElement(Instruction base, int idx) { + result.extractsElement(base, idx) + } + + /** + * Gets the instruction corresponding to the implicit lower bound of slice `e`, if any. + */ + EvalImplicitLowerSliceBoundInstruction implicitLowerSliceBoundInstruction(SliceExpr e) { + result = MkImplicitLowerSliceBound(e) + } + + /** + * Gets the instruction corresponding to the implicit upper bound of slice `e`, if any. + */ + EvalImplicitUpperSliceBoundInstruction implicitUpperSliceBoundInstruction(SliceExpr e) { + result = MkImplicitUpperSliceBound(e) + } + + /** + * Gets the instruction corresponding to the implicit maximum bound of slice `e`, if any. + */ + EvalImplicitMaxSliceBoundInstruction implicitMaxSliceBoundInstruction(SliceExpr e) { + result = MkImplicitMaxSliceBound(e) + } + + /** + * Gets the implicit dereference instruction for `e`, where `e` is a pointer used as the base + * in a field/method access, element access, or slice expression. + */ + EvalImplicitDerefInstruction implicitDerefInstruction(Expr e) { result = MkImplicitDeref(e) } +} diff --git a/go/ql/lib/semmle/go/dataflow/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/DataFlow.qll new file mode 100644 index 00000000000..d99ce3bb554 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/DataFlow.qll @@ -0,0 +1,29 @@ +/** + * Provides a library for local (intra-procedural) and global (inter-procedural) + * data flow analysis: deciding whether data can flow from a _source_ to a + * _sink_. + * + * Unless configured otherwise, _flow_ means that the exact value of + * the source may reach the sink. We do not track flow across pointer + * dereferences or array indexing. To track these types of flow, where the + * exact value may not be preserved, import + * `semmle.code.go.dataflow.TaintTracking`. + * + * To use global (interprocedural) data flow, extend the class + * `DataFlow::Configuration` as documented on that class. To use local + * (intraprocedural) data flow, invoke `DataFlow::localFlow` or + * `DataFlow::LocalFlowStep` with arguments of type `DataFlow::Node`. + */ + +import go + +/** + * Provides a library for local (intra-procedural) and global (inter-procedural) + * data flow analysis. + */ +module DataFlow { + import semmle.go.dataflow.internal.DataFlowImpl + import Properties +} + +class Read = DataFlow::ReadNode; diff --git a/go/ql/lib/semmle/go/dataflow/DataFlow2.qll b/go/ql/lib/semmle/go/dataflow/DataFlow2.qll new file mode 100644 index 00000000000..a2bae8bd939 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/DataFlow2.qll @@ -0,0 +1,27 @@ +/** + * Provides a library for local (intra-procedural) and global (inter-procedural) + * data flow analysis: deciding whether data can flow from a _source_ to a + * _sink_. + * + * Unless configured otherwise, _flow_ means that the exact value of + * the source may reach the sink. We do not track flow across pointer + * dereferences or array indexing. To track these types of flow, where the + * exact value may not be preserved, import + * `semmle.code.go.dataflow.TaintTracking`. + * + * To use global (interprocedural) data flow, extend the class + * `DataFlow::Configuration` as documented on that class. To use local + * (intraprocedural) data flow, invoke `DataFlow::localFlow` or + * `DataFlow::LocalFlowStep` with arguments of type `DataFlow::Node`. + */ + +import go + +/** + * Provides a library for local (intra-procedural) and global (inter-procedural) + * data flow analysis. + */ +module DataFlow2 { + import semmle.go.dataflow.internal.DataFlowImpl2 + import Properties +} diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll new file mode 100644 index 00000000000..1716fa33ef7 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -0,0 +1,468 @@ +/** + * INTERNAL use only. This is an experimental API subject to change without notice. + * + * Provides classes and predicates for dealing with flow models specified in CSV format. + * + * The CSV specification has the following columns: + * - Sources: + * `namespace; type; subtypes; name; signature; ext; output; kind` + * - Sinks: + * `namespace; type; subtypes; name; signature; ext; input; kind` + * - Summaries: + * `namespace; type; subtypes; name; signature; ext; input; output; kind` + * + * The interpretation of a row is similar to API-graphs with a left-to-right + * reading. + * 1. The `namespace` column selects a package. + * 2. The `type` column selects a type within that package. + * 3. The `subtypes` is a boolean that indicates whether to jump to an + * arbitrary subtype of that type. + * 4. The `name` column optionally selects a specific named member of the type. + * 5. The `signature` column is always empty. + * 6. The `ext` column is always empty. + * 7. The `input` column specifies how data enters the element selected by the + * first 6 columns, and the `output` column specifies how data leaves the + * element selected by the first 6 columns. An `input` can be either "", + * "Argument[n]", or "Argument[n1..n2]": + * - "": Selects a write to the selected element in case this is a field. + * - "Argument[n]": Selects an argument in a call to the selected element. + * The arguments are zero-indexed, and `-1` specifies the qualifier. + * - "Argument[n1..n2]": Similar to "Argument[n]" but selects any argument + * in the given range. The range is inclusive at both ends. + * + * An `output` can be either "", "Argument[n]", "Argument[n1..n2]", "Parameter", + * "Parameter[n]", "Parameter[n1..n2]", , "ReturnValue", "ReturnValue[n]", or + * "ReturnValue[n1..n2]": + * - "": Selects a read of a selected field, or a selected parameter. + * - "Argument[n]": Selects the post-update value of an argument in a call to the + * selected element. That is, the value of the argument after the call returns. + * The arguments are zero-indexed, and `-1` specifies the qualifier. + * - "Argument[n1..n2]": Similar to "Argument[n]" but select any argument in + * the given range. The range is inclusive at both ends. + * - "Parameter": Selects the value of a parameter of the selected element. + * "Parameter" is also allowed in case the selected element is already a + * parameter itself. + * - "Parameter[n]": Similar to "Parameter" but restricted to a specific + * numbered parameter (zero-indexed, and `-1` specifies the value of `this`). + * - "Parameter[n1..n2]": Similar to "Parameter[n]" but selects any parameter + * in the given range. The range is inclusive at both ends. + * - "ReturnValue": Selects the first value being returned by the selected + * element. This requires that the selected element is a method with a + * body. + * - "ReturnValue[n]": Similar to "ReturnValue" but selects the specified + * return value. The return values are zero-indexed + * - "ReturnValue[n1..n2]": Similar to "ReturnValue[n]" but selects any + * return value in the given range. The range is inclusive at both ends. + * 8. The `kind` column is a tag that can be referenced from QL to determine to + * which classes the interpreted elements should be added. For example, for + * sources "remote" indicates a default remote flow source, and for summaries + * "taint" indicates a default additional taint step and "value" indicates a + * globally applicable value-preserving step. + */ + +private import go +private import internal.DataFlowPrivate +private import internal.FlowSummaryImpl::Private::External +private import internal.FlowSummaryImplSpecific +private import internal.AccessPathSyntax +private import FlowSummary + +/** + * A module importing the frameworks that provide external flow data, + * ensuring that they are visible to the taint tracking / data flow library. + */ +private module Frameworks { + private import semmle.go.frameworks.Stdlib +} + +private class BuiltinModel extends SummaryModelCsv { + override predicate row(string row) { + row = + [ + ";;false;append;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + ";;false;append;;;Argument[1];ReturnValue.ArrayElement;value" + ] + } +} + +private predicate sourceModelCsv(string row) { none() } + +private predicate sinkModelCsv(string row) { none() } + +private predicate summaryModelCsv(string row) { none() } + +/** + * A unit class for adding additional source model rows. + * + * Extend this class to add additional source definitions. + */ +class SourceModelCsv extends Unit { + /** Holds if `row` specifies a source definition. */ + abstract predicate row(string row); +} + +/** + * A unit class for adding additional sink model rows. + * + * Extend this class to add additional sink definitions. + */ +class SinkModelCsv extends Unit { + /** Holds if `row` specifies a sink definition. */ + abstract predicate row(string row); +} + +/** + * A unit class for adding additional summary model rows. + * + * Extend this class to add additional flow summary definitions. + */ +class SummaryModelCsv extends Unit { + /** Holds if `row` specifies a summary definition. */ + abstract predicate row(string row); +} + +private predicate sourceModel(string row) { + sourceModelCsv(row) or + any(SourceModelCsv s).row(row) +} + +private predicate sinkModel(string row) { + sinkModelCsv(row) or + any(SinkModelCsv s).row(row) +} + +private predicate summaryModel(string row) { + summaryModelCsv(row) or + any(SummaryModelCsv s).row(row) +} + +/** Holds if a source model exists for the given parameters. */ +predicate sourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind +) { + exists(string row | + sourceModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = output and + row.splitAt(";", 7) = kind + ) +} + +/** Holds if a sink model exists for the given parameters. */ +predicate sinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind +) { + exists(string row | + sinkModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = input and + row.splitAt(";", 7) = kind + ) +} + +/** Holds if a summary model exists for the given parameters. */ +predicate summaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind +) { + summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, _) +} + +/** Holds if a summary model `row` exists for the given parameters. */ +predicate summaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string row +) { + summaryModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = input and + row.splitAt(";", 7) = output and + row.splitAt(";", 8) = kind +} + +/** Holds if `package` have CSV framework coverage. */ +private predicate packageHasCsvCoverage(string package) { + sourceModel(package, _, _, _, _, _, _, _) or + sinkModel(package, _, _, _, _, _, _, _) or + summaryModel(package, _, _, _, _, _, _, _, _) +} + +/** + * Holds if `package` and `subpkg` have CSV framework coverage and `subpkg` + * is a subpackage of `package`. + */ +private predicate packageHasASubpackage(string package, string subpkg) { + packageHasCsvCoverage(package) and + packageHasCsvCoverage(subpkg) and + subpkg.prefix(subpkg.indexOf(".")) = package +} + +/** + * Holds if `package` has CSV framework coverage and it is not a subpackage of + * any other package with CSV framework coverage. + */ +private predicate canonicalPackage(string package) { + packageHasCsvCoverage(package) and not packageHasASubpackage(_, package) +} + +/** + * Holds if `package` and `subpkg` have CSV framework coverage, `subpkg` is a + * subpackage of `package` (or they are the same), and `package` is not a + * subpackage of any other package with CSV framework coverage. + */ +private predicate canonicalPackageHasASubpackage(string package, string subpkg) { + canonicalPackage(package) and + (subpkg = package or packageHasASubpackage(package, subpkg)) +} + +/** + * Holds if CSV framework coverage of `package` is `n` api endpoints of the + * kind `(kind, part)`, and `pkgs` is the number of subpackages of `package` + * which have CSV framework coverage (including `package` itself). + */ +predicate modelCoverage(string package, int pkgs, string kind, string part, int n) { + pkgs = strictcount(string subpkg | canonicalPackageHasASubpackage(package, subpkg)) and + ( + part = "source" and + n = + strictcount(string subpkg, string type, boolean subtypes, string name, string signature, + string ext, string output | + canonicalPackageHasASubpackage(package, subpkg) and + sourceModel(subpkg, type, subtypes, name, signature, ext, output, kind) + ) + or + part = "sink" and + n = + strictcount(string subpkg, string type, boolean subtypes, string name, string signature, + string ext, string input | + canonicalPackageHasASubpackage(package, subpkg) and + sinkModel(subpkg, type, subtypes, name, signature, ext, input, kind) + ) + or + part = "summary" and + n = + strictcount(string subpkg, string type, boolean subtypes, string name, string signature, + string ext, string input, string output | + canonicalPackageHasASubpackage(package, subpkg) and + summaryModel(subpkg, type, subtypes, name, signature, ext, input, output, kind) + ) + ) +} + +/** Provides a query predicate to check the CSV data for validation errors. */ +module CsvValidation { + /** Holds if some row in a CSV-based flow model appears to contain typos. */ + query predicate invalidModelRow(string msg) { + exists(string pred, string namespace, string type, string name, string signature, string ext | + sourceModel(namespace, type, _, name, signature, ext, _, _) and pred = "source" + or + sinkModel(namespace, type, _, name, signature, ext, _, _) and pred = "sink" + or + summaryModel(namespace, type, _, name, signature, ext, _, _, _) and pred = "summary" + | + not namespace.regexpMatch("[a-zA-Z0-9_\\./]*") and + msg = "Dubious namespace \"" + namespace + "\" in " + pred + " model." + or + not type.regexpMatch("[a-zA-Z0-9_\\$<>]*") and + msg = "Dubious type \"" + type + "\" in " + pred + " model." + or + not name.regexpMatch("[a-zA-Z0-9_]*") and + msg = "Dubious name \"" + name + "\" in " + pred + " model." + or + not signature.regexpMatch("|\\([a-zA-Z0-9_\\.\\$<>,\\[\\]]*\\)") and + msg = "Dubious signature \"" + signature + "\" in " + pred + " model." + or + not ext.regexpMatch("|Annotated") and + msg = "Unrecognized extra API graph element \"" + ext + "\" in " + pred + " model." + ) + or + exists(string pred, AccessPath input, string part | + sinkModel(_, _, _, _, _, _, input, _) and pred = "sink" + or + summaryModel(_, _, _, _, _, _, input, _, _) and pred = "summary" + | + ( + invalidSpecComponent(input, part) and + not part = "" and + not parseArg(part, _) + or + part = input.getToken(_) and + parseParam(part, _) + ) and + msg = "Unrecognized input specification \"" + part + "\" in " + pred + " model." + ) + or + exists(string pred, string output, string part | + sourceModel(_, _, _, _, _, _, output, _) and pred = "source" + or + summaryModel(_, _, _, _, _, _, _, output, _) and pred = "summary" + | + invalidSpecComponent(output, part) and + not part = "" and + not (part = "Parameter" and pred = "source") and + msg = "Unrecognized output specification \"" + part + "\" in " + pred + " model." + ) + or + exists(string pred, string row, int expect | + sourceModel(row) and expect = 8 and pred = "source" + or + sinkModel(row) and expect = 8 and pred = "sink" + or + summaryModel(row) and expect = 9 and pred = "summary" + | + exists(int cols | + cols = 1 + max(int n | exists(row.splitAt(";", n))) and + cols != expect and + msg = + "Wrong number of columns in " + pred + " model row, expected " + expect + ", got " + cols + + "." + ) + or + exists(string b | + b = row.splitAt(";", 2) and + not b = ["true", "false"] and + msg = "Invalid boolean \"" + b + "\" in " + pred + " model." + ) + ) + } +} + +pragma[nomagic] +private predicate elementSpec( + string namespace, string type, boolean subtypes, string name, string signature, string ext +) { + sourceModel(namespace, type, subtypes, name, signature, ext, _, _) or + sinkModel(namespace, type, subtypes, name, signature, ext, _, _) or + summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _) +} + +private string paramsStringPart(Function f, int i) { + i = -1 and result = "(" + or + exists(int n, string p | f.getParameterType(n).toString() = p | + i = 2 * n and result = p + or + i = 2 * n - 1 and result = "," and n != 0 + ) + or + i = 2 * f.getNumParameter() and result = ")" +} + +/** + * Gets a parenthesized string containing all parameter types of this callable, separated by a comma. + * + * Returns the empty string if the callable has no parameters. + * Parameter types are represented by their type erasure. + */ +string paramsString(Function f) { result = concat(int i | | paramsStringPart(f, i) order by i) } + +/** Gets the source/sink/summary element corresponding to the supplied parameters. */ +SourceOrSinkElement interpretElement( + string pkg, string type, boolean subtypes, string name, string signature, string ext +) { + elementSpec(pkg, type, subtypes, name, signature, ext) and + // Go does not need to distinguish functions with signature + signature = "" and + ( + exists(Field f | f.hasQualifiedName(pkg, type, name) | result.asEntity() = f) + or + exists(Method m | m.hasQualifiedName(pkg, type, name) | + result.asEntity() = m + or + subtypes = true and result.asEntity().(Method).implements(m) + ) + or + type = "" and + exists(Entity e | e.hasQualifiedName(pkg, name) | result.asEntity() = e) + ) +} + +/** Holds if there is an external specification for `f`. */ +predicate hasExternalSpecification(Function f) { + f = any(SummarizedCallable sc).asFunction() + or + exists(SourceOrSinkElement e | f = e.asEntity() | sourceElement(e, _, _) or sinkElement(e, _, _)) +} + +private predicate parseField(AccessPathToken c, DataFlow::FieldContent f) { + exists(string fieldRegex, string package, string className, string fieldName | + fieldRegex = "^Field\\[(.*)\\.([^.]+)\\.([^.]+)\\]$" and + package = c.regexpCapture(fieldRegex, 1) and + className = c.regexpCapture(fieldRegex, 2) and + fieldName = c.regexpCapture(fieldRegex, 3) and + f.getField().hasQualifiedName(package, className, fieldName) + ) +} + +/** A string representing a synthetic instance field. */ +class SyntheticField extends string { + SyntheticField() { parseSynthField(_, this) } + + /** + * Gets the type of this field. The default type is `interface{}`, but this can be + * overridden. + */ + Type getType() { result instanceof EmptyInterfaceType } +} + +private predicate parseSynthField(AccessPathToken c, string f) { + c.regexpCapture("SyntheticField\\[([.a-zA-Z0-9]+)\\]", 1) = f +} + +/** Holds if the specification component parses as a `Content`. */ +predicate parseContent(string component, DataFlow::Content content) { + parseField(component, content) + or + parseSynthField(component, content.(DataFlow::SyntheticFieldContent).getField()) + or + component = "ArrayElement" and content instanceof DataFlow::ArrayContent + or + component = "Element" and content instanceof DataFlow::CollectionContent + or + component = "MapKey" and content instanceof DataFlow::MapKeyContent + or + component = "MapValue" and content instanceof DataFlow::MapValueContent +} + +cached +private module Cached { + /** + * Holds if `node` is specified as a source with the given kind in a CSV flow + * model. + */ + cached + predicate sourceNode(DataFlow::Node node, string kind) { + exists(InterpretNode n | isSourceNode(n, kind) and n.asNode() = node) + } + + /** + * Holds if `node` is specified as a sink with the given kind in a CSV flow + * model. + */ + cached + predicate sinkNode(DataFlow::Node node, string kind) { + exists(InterpretNode n | isSinkNode(n, kind) and n.asNode() = node) + } +} + +import Cached diff --git a/go/ql/lib/semmle/go/dataflow/FlowSummary.qll b/go/ql/lib/semmle/go/dataflow/FlowSummary.qll new file mode 100644 index 00000000000..39f8774716a --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/FlowSummary.qll @@ -0,0 +1,49 @@ +/** + * Provides classes and predicates for definining flow summaries. + */ + +import go +private import internal.FlowSummaryImpl as Impl +private import internal.DataFlowDispatch +private import internal.DataFlowUtil + +// import all instances below +private module Summaries { } + +class SummaryComponent = Impl::Public::SummaryComponent; + +/** Provides predicates for constructing summary components. */ +module SummaryComponent { + import Impl::Public::SummaryComponent + + /** Gets a summary component that represents a qualifier. */ + SummaryComponent qualifier() { result = argument(-1) } + + /** Gets a summary component for field `f`. */ + SummaryComponent field(Field f) { result = content(any(FieldContent c | c.getField() = f)) } + + /** Gets a summary component that represents the return value of a call. */ + SummaryComponent return() { result = return(_) } +} + +class SummaryComponentStack = Impl::Public::SummaryComponentStack; + +/** Provides predicates for constructing stacks of summary components. */ +module SummaryComponentStack { + import Impl::Public::SummaryComponentStack + + /** Gets a singleton stack representing a qualifier. */ + SummaryComponentStack qualifier() { result = singleton(SummaryComponent::qualifier()) } + + /** Gets a stack representing a field `f` of `object`. */ + SummaryComponentStack fieldOf(Field f, SummaryComponentStack object) { + result = push(SummaryComponent::field(f), object) + } + + /** Gets a singleton stack representing a (normal) return. */ + SummaryComponentStack return() { result = singleton(SummaryComponent::return()) } +} + +class SummarizedCallable = Impl::Public::SummarizedCallable; + +class RequiredSummaryComponentStack = Impl::Public::RequiredSummaryComponentStack; diff --git a/go/ql/lib/semmle/go/dataflow/FunctionInputsAndOutputs.qll b/go/ql/lib/semmle/go/dataflow/FunctionInputsAndOutputs.qll new file mode 100644 index 00000000000..c1653f5b3ad --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/FunctionInputsAndOutputs.qll @@ -0,0 +1,310 @@ +/** + * Provides QL classes for indicating data flow through a function parameter, return value, + * or receiver. + */ + +import go +private import semmle.go.dataflow.internal.DataFlowPrivate + +/** + * An abstract representation of an input to a function, which is either a parameter + * or the receiver parameter. + */ +private newtype TFunctionInput = + TInParameter(int i) { exists(SignatureType s | exists(s.getParameterType(i))) } or + TInReceiver() or + TInResult(int index) { + // the one and only result + index = -1 + or + // one among several results + exists(SignatureType s | exists(s.getResultType(index))) + } + +/** + * An abstract representation of an input to a function, which is either a parameter + * or the receiver parameter. + */ +class FunctionInput extends TFunctionInput { + /** Holds if this represents the `i`th parameter of a function. */ + predicate isParameter(int i) { none() } + + /** Holds if this represents the receiver of a function. */ + predicate isReceiver() { none() } + + /** Holds if this represents the result of a function. */ + predicate isResult() { none() } + + /** Holds if this represents the `i`th result of a function. */ + predicate isResult(int i) { none() } + + /** Gets the data-flow node corresponding to this input for the call `c`. */ + final DataFlow::Node getNode(DataFlow::CallNode c) { result = getEntryNode(c) } + + /** Gets the data-flow node through which data is passed into this input for the call `c`. */ + abstract DataFlow::Node getEntryNode(DataFlow::CallNode c); + + /** Gets the data-flow node through which data from this input enters function `f`. */ + abstract DataFlow::Node getExitNode(FuncDef f); + + /** Gets a textual representation of this element. */ + abstract string toString(); +} + +/** Defines convenience methods that get particular `FunctionInput` instances. */ +module FunctionInput { + /** Gets a `FunctionInput` representing the `i`th parameter. */ + FunctionInput parameter(int i) { result.isParameter(i) } + + /** Gets a `FunctionInput` representing the receiver. */ + FunctionInput receiver() { result.isReceiver() } + + /** Gets a `FunctionInput` representing the result of a single-result function. */ + FunctionInput functionResult() { result.isResult() } + + /** Gets a `FunctionInput` representing the `i`th result. */ + FunctionInput functionResult(int i) { result.isResult(i) } +} + +/** A parameter position of a function, viewed as a source of input. */ +private class ParameterInput extends FunctionInput, TInParameter { + int index; + + ParameterInput() { this = TInParameter(index) } + + override predicate isParameter(int i) { i = index } + + override DataFlow::Node getEntryNode(DataFlow::CallNode c) { result = c.getArgument(index) } + + override DataFlow::Node getExitNode(FuncDef f) { + result = DataFlow::parameterNode(f.getParameter(index)) + } + + override string toString() { result = "parameter " + index } +} + +/** The receiver of a function, viewed as a source of input. */ +private class ReceiverInput extends FunctionInput, TInReceiver { + override predicate isReceiver() { any() } + + override DataFlow::Node getEntryNode(DataFlow::CallNode c) { + result = c.(DataFlow::MethodCallNode).getReceiver() + } + + override DataFlow::Node getExitNode(FuncDef f) { + result = DataFlow::receiverNode(f.(MethodDecl).getReceiver()) + } + + override string toString() { result = "receiver" } +} + +/** + * A result position of a function, viewed as an input. + * + * Results are usually outputs rather than inputs, but for taint tracking it can be useful to + * think of taint propagating backwards from a result of a function to its arguments. For instance, + * the function `bufio.NewWriter` returns a writer `bw` that buffers write operations to an + * underlying writer `w`. If tainted data is written to `bw`, then it makes sense to propagate + * that taint back to the underlying writer `w`, which can be modeled by saying that + * `bufio.NewWriter` propagates taint from its result to its first argument. + */ +private class ResultInput extends FunctionInput, TInResult { + int index; + + ResultInput() { this = TInResult(index) } + + override predicate isResult() { index = -1 } + + override predicate isResult(int i) { + i = 0 and isResult() + or + i = index and i >= 0 + } + + override DataFlow::Node getEntryNode(DataFlow::CallNode c) { + exists(DataFlow::Node pred | + index = -1 and + pred = c.getResult() + or + index >= 0 and + pred = c.getResult(index) + | + // if the result is assigned to an SSA variable, we want to propagate mutations backwards + // through that variable + exists(DataFlow::SsaNode ssa | ssa.getInit() = pred | result = ssa) + or + // otherwise the entry node is simply the result + not exists(DataFlow::SsaNode ssa | ssa.getInit() = pred) and + result = pred + ) + } + + override DataFlow::Node getExitNode(FuncDef f) { none() } + + override string toString() { + index = -1 and result = "result" + or + index >= 0 and result = "result " + index + } +} + +/** + * An abstract representation of an output of a function, which is one of its results. + */ +private newtype TFunctionOutput = + TOutResult(int index) { + // the one and only result + index = -1 + or + // one among several results + exists(SignatureType s | exists(s.getResultType(index))) + } or + TOutReceiver() or + TOutParameter(int index) { exists(SignatureType s | exists(s.getParameterType(index))) } + +/** + * An abstract representation of an output of a function, which is one of its results + * or a parameter with mutable type. + */ +class FunctionOutput extends TFunctionOutput { + /** Holds if this represents the (single) result of a function. */ + predicate isResult() { none() } + + /** Holds if this represents the `i`th result of a function. */ + predicate isResult(int i) { none() } + + /** Holds if this represents the receiver of a function. */ + predicate isReceiver() { none() } + + /** Holds if this represents the `i`th parameter of a function. */ + predicate isParameter(int i) { none() } + + /** Gets the data-flow node corresponding to this output for the call `c`. */ + final DataFlow::Node getNode(DataFlow::CallNode c) { result = getExitNode(c) } + + /** Gets the data-flow node through which data is passed into this output for the function `f`. */ + abstract DataFlow::Node getEntryNode(FuncDef f); + + /** Gets the data-flow node through which data is returned from this output for the call `c`. */ + abstract DataFlow::Node getExitNode(DataFlow::CallNode c); + + /** Gets a textual representation of this element. */ + abstract string toString(); +} + +/** Defines convenience methods that get particular `FunctionOutput` instances. */ +module FunctionOutput { + /** Gets a `FunctionOutput` representing the result of a single-result function. */ + FunctionOutput functionResult() { result.isResult() } + + /** Gets a `FunctionOutput` representing the `i`th result. */ + FunctionOutput functionResult(int i) { result.isResult(i) } + + /** Gets a `FunctionOutput` representing the receiver after a function returns. */ + FunctionOutput receiver() { result.isReceiver() } + + /** Gets a `FunctionOutput` representing the `i`th parameter after a function returns. */ + FunctionOutput parameter(int i) { result.isParameter(i) } +} + +/** A result position of a function, viewed as an output. */ +private class OutResult extends FunctionOutput, TOutResult { + int index; + + OutResult() { this = TOutResult(index) } + + override predicate isResult() { index = -1 } + + override predicate isResult(int i) { + i = 0 and isResult() + or + i = index and i >= 0 + } + + override DataFlow::Node getEntryNode(FuncDef f) { + // return expressions + exists(IR::ReturnInstruction ret | f = ret.getRoot() | + index = -1 and + result = DataFlow::instructionNode(ret.getResult()) + or + index >= 0 and + ret.returnsMultipleResults() and + result = DataFlow::instructionNode(ret.getResult(index)) + ) + or + // expressions assigned to result variables + exists(Write w, int nr | nr = f.getType().getNumResult() | + index = -1 and + nr = 1 and + w.writes(f.getResultVar(0), result) + or + index >= 0 and + nr > 1 and + w.writes(f.getResultVar(index), result) + ) + } + + override DataFlow::Node getExitNode(DataFlow::CallNode c) { + index = -1 and result = c.getResult() + or + result = c.getResult(index) + } + + override string toString() { + index = -1 and result = "result" + or + index >= 0 and result = "result " + index + } +} + +/** The receiver of a function, viewed as an output. */ +private class OutReceiver extends FunctionOutput, TOutReceiver { + override predicate isReceiver() { any() } + + override DataFlow::Node getEntryNode(FuncDef f) { + // there is no generic way of assigning to a receiver; operations that taint a receiver + // have to be handled on a case-by-case basis + none() + } + + override DataFlow::Node getExitNode(DataFlow::CallNode c) { + exists(DataFlow::Node arg | + arg = getArgument(c, -1) and + result.(DataFlow::PostUpdateNode).getPreUpdateNode() = arg + ) + } + + override string toString() { result = "receiver" } +} + +/** + * A parameter of a function, viewed as an output. + * + * Note that slices passed to varargs parameters using `...` are not included, since in this + * case it is ambiguous whether the output should be the slice itself or one of its elements. + */ +private class OutParameter extends FunctionOutput, TOutParameter { + int index; + + OutParameter() { this = TOutParameter(index) } + + override predicate isParameter(int i) { i = index } + + override DataFlow::Node getEntryNode(FuncDef f) { + // there is no generic way of assigning to a parameter; operations that taint a parameter + // have to be handled on a case-by-case basis + none() + } + + override DataFlow::Node getExitNode(DataFlow::CallNode c) { + exists(DataFlow::Node arg | + arg = getArgument(c, index) and + // exclude slices passed to varargs parameters using `...` calls + not (c.hasEllipsis() and index = c.getNumArgument() - 1) + | + result.(DataFlow::PostUpdateNode).getPreUpdateNode() = arg + ) + } + + override string toString() { result = "parameter " + index } +} diff --git a/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll new file mode 100644 index 00000000000..c9c0c58b33e --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll @@ -0,0 +1,591 @@ +/** + * Provides an implementation of Global Value Numbering. + * See https://en.wikipedia.org/wiki/Global_value_numbering + * + * The predicate `globalValueNumber` converts an expression into a `GVN`, + * which is an abstract type representing the value of the expression. If + * two expressions have the same `GVN` then they compute the same value. + * For example: + * + * ``` + * func f(x int, y int) { + * g(x+y, x+y); + * } + * ``` + * + * In this example, both arguments in the call to `g` compute the same value, + * so both arguments have the same `GVN`. In other words, we can find + * this call with the following query: + * + * ``` + * from CallExpr call, GVN v + * where v = globalValueNumber(call.getArgument(0)) + * and v = globalValueNumber(call.getArgument(1)) + * select call + * ``` + * + * The analysis is conservative, so two expressions might have different + * `GVN`s even though the actually always compute the same value. The most + * common reason for this is that the analysis cannot prove that there + * are no side-effects that might cause the computed value to change. + */ + +/* + * Note to developers: the correctness of this module depends on the + * definitions of GVN, globalValueNumber, and analyzableExpr being kept in + * sync with each other. If you change this module then make sure that the + * change is symmetric across all three. + */ + +import go + +/** + * Holds if the result is a control flow node that might change the + * value of any package variable. This is used in the implementation + * of `MkOtherVariable`, because we need to be quite conservative when + * we assign a value number to a package variable. For example: + * + * ``` + * x = g+1; + * dosomething(); + * y = g+1; + * ``` + * + * It is not safe to assign the same value number to both instances + * of `g+1` in this example, because the call to `dosomething` might + * change the value of `g`. + */ +private ControlFlow::Node nodeWithPossibleSideEffect() { + exists(DataFlow::CallNode call | + call.getCall().mayHaveOwnSideEffects() and + not isPureFn(call.getTarget()) and + result = call.asInstruction() + ) + or + // If the lhs of an assignment is not analyzable by SSA, then + // we need to treat the assignment as having a possible side-effect. + result instanceof Write and + not exists(SsaExplicitDefinition ssa | result = ssa.getInstruction()) +} + +private predicate isPureFn(Function f) { + f.(BuiltinFunction).isPure() + or + isPureStmt(f.(DeclaredFunction).getBody()) +} + +private predicate isPureStmt(Stmt s) { + exists(BlockStmt blk | blk = s | forall(Stmt ch | ch = blk.getAStmt() | isPureStmt(ch))) + or + isPureExpr(s.(ReturnStmt).getExpr()) +} + +private predicate isPureExpr(Expr e) { + e instanceof BasicLit + or + exists(FuncDef f | f = e.getEnclosingFunction() | + e = f.getAParameter().getAReference() + or + e = f.(MethodDecl).getReceiver().getAReference() + ) + or + isPureExpr(e.(SelectorExpr).getBase()) + or + exists(CallExpr ce | e = ce | + isPureFn(ce.getTarget()) and + forall(Expr arg | arg = ce.getAnArgument() | isPureExpr(arg)) + ) +} + +/** + * Gets the entry node of the control flow graph of which `node` is a + * member. + */ +private ControlFlow::Node getControlFlowEntry(ControlFlow::Node node) { + result = node.getRoot().getEntryNode() +} + +private predicate entryNode(ControlFlow::Node node) { node.isEntryNode() } + +/** + * Holds if there is a control flow edge from `src` to `dst` or + * if `dst` is an expression with a possible side-effect. The idea + * is to treat side effects as entry points in the control flow + * graph so that we can use the dominator tree to find the most recent + * side-effect. + */ +private predicate sideEffectCFG(ControlFlow::Node src, ControlFlow::Node dst) { + src.getASuccessor() = dst + or + // Add an edge from the entry point to any node that might have a side + // effect. + dst = nodeWithPossibleSideEffect() and + src = getControlFlowEntry(dst) +} + +/** + * Holds if `dominator` is the immediate dominator of `node` in + * the side-effect CFG. + */ +private predicate iDomEffect(ControlFlow::Node dominator, ControlFlow::Node node) = + idominance(entryNode/1, sideEffectCFG/2)(_, dominator, node) + +/** + * Gets the most recent side effect. To be more precise, `result` is a + * dominator of `node` and no side-effects can occur between `result` and + * `node`. + * + * `sideEffectCFG` has an edge from the function entry to every node with a + * side-effect. This means that every node with a side-effect has the + * function entry as its immediate dominator. So if node `x` dominates node + * `y` then there can be no side effects between `x` and `y` unless `x` is + * the function entry. So the optimal choice for `result` has the function + * entry as its immediate dominator. + * + * Example: + * + * ``` + * 000: int f(int a, int b, int *p) { + * 001: int r = 0; + * 002: if (a) { + * 003: if (b) { + * 004: sideEffect1(); + * 005: } + * 006: } else { + * 007: sideEffect2(); + * 008: } + * 009: if (a) { + * 010: r++; // Not a side-effect, because r is an SSA variable. + * 011: } + * 012: if (b) { + * 013: r++; // Not a side-effect, because r is an SSA variable. + * 014: } + * 015: return *p; + * 016: } + * ``` + * + * Suppose we want to find the most recent side-effect for the dereference + * of `p` on line 015. The `sideEffectCFG` has an edge from the function + * entry (line 000) to the side effects at lines 004 and 007. Therefore, + * the immediate dominator tree looks like this: + * + * 000 - 001 - 002 - 003 + * - 004 + * - 007 + * - 009 - 010 + * - 012 - 013 + * - 015 + * + * The immediate dominator path to line 015 is 000 - 009 - 012 - 015. + * Therefore, the most recent side effect for line 015 is line 009. + */ +cached +private ControlFlow::Node mostRecentSideEffect(ControlFlow::Node node) { + exists(ControlFlow::Node entry | + entryNode(entry) and + iDomEffect(entry, result) and + iDomEffect*(result, node) + ) +} + +/** Used to represent the "global value number" of an expression. */ +cached +private newtype GVNBase = + MkNumericConst(string val) { mkNumericConst(_, val) } or + MkStringConst(string val) { mkStringConst(_, val) } or + MkBoolConst(boolean val) { mkBoolConst(_, val) } or + MkIndirectSsa(SsaDefinition def) { not ssaInit(def, _) } or + MkFunc(Function fn) { mkFunc(_, fn) } or + // Variables with no SSA information. As a crude (but safe) + // approximation, we use `mostRecentSideEffect` to compute a definition + // location for the variable. This ensures that two instances of the same + // global variable will only get the same value number if they are + // guaranteed to have the same value. + MkOtherVariable(ValueEntity x, ControlFlow::Node dominator) { mkOtherVariable(_, x, dominator) } or + MkMethodAccess(GVN base, Function m) { mkMethodAccess(_, base, m) } or + MkFieldRead(GVN base, Field f, ControlFlow::Node dominator) { mkFieldRead(_, base, f, dominator) } or + MkPureCall(Function f, GVN callee, GVNList args) { mkPureCall(_, f, callee, args) } or + MkIndex(GVN base, GVN index, ControlFlow::Node dominator) { mkIndex(_, base, index, dominator) } or + // Dereference a pointer. The value might have changed since the last + // time the pointer was dereferenced, so we need to include a definition + // location. As a crude (but safe) approximation, we use + // `mostRecentSideEffect` to compute a definition location. + MkDeref(GVN base, ControlFlow::Node dominator) { mkDeref(_, base, dominator) } or + MkBinaryOp(GVN lhs, GVN rhs, string op) { mkBinaryOp(_, lhs, rhs, op) } or + MkUnaryOp(GVN child, string op) { mkUnaryOp(_, child, op) } or + // Any expression that is not handled by the cases above is + // given a unique number based on the expression itself. + MkUnanalyzable(DataFlow::Node e) { not analyzableExpr(e) } + +private newtype GVNList = + MkNil() or + MkCons(GVN head, GVNList tail) { globalValueNumbers(_, _, head, tail) } + +private GVNList globalValueNumbers(DataFlow::CallNode ce, int start) { + analyzableCall(ce, _) and + start = ce.getNumArgument() and + result = MkNil() + or + exists(GVN head, GVNList tail | + globalValueNumbers(ce, start, head, tail) and + result = MkCons(head, tail) + ) +} + +private predicate globalValueNumbers(DataFlow::CallNode ce, int start, GVN head, GVNList tail) { + analyzableCall(ce, _) and + head = globalValueNumber(ce.getArgument(start)) and + tail = globalValueNumbers(ce, start + 1) +} + +/** + * A Global Value Number. A GVN is an abstract representation of the value + * computed by an expression. The relationship between `Expr` and `GVN` is + * many-to-one: every `Expr` has exactly one `GVN`, but multiple + * expressions can have the same `GVN`. If two expressions have the same + * `GVN`, it means that they compute the same value at run time. The `GVN` + * is an opaque value, so you cannot deduce what the run-time value of an + * expression will be from its `GVN`. The only use for the `GVN` of an + * expression is to find other expressions that compute the same value. + * Use the predicate `globalValueNumber` to get the `GVN` for an `Expr`. + * + * Note: `GVN` has `toString` and `getLocation` methods, so that it can be + * displayed in a results list. These work by picking an arbitrary + * expression with this `GVN` and using its `toString` and `getLocation` + * methods. + */ +class GVN extends GVNBase { + GVN() { this instanceof GVNBase } + + /** Gets a data-flow node that has this GVN. */ + DataFlow::Node getANode() { this = globalValueNumber(result) } + + /** Gets the kind of the GVN. This can be useful for debugging. */ + string getKind() { + this instanceof MkNumericConst and result = "NumericConst" + or + this instanceof MkStringConst and result = "StringConst" + or + this instanceof MkBoolConst and result = "BoolConst" + or + this instanceof MkIndirectSsa and result = "IndirectSsa" + or + this instanceof MkFunc and result = "Func" + or + this instanceof MkOtherVariable and result = "OtherVariable" + or + this instanceof MkMethodAccess and result = "MethodAccess" + or + this instanceof MkFieldRead and result = "FieldRead" + or + this instanceof MkPureCall and result = "PureCall" + or + this instanceof MkIndex and result = "Index" + or + this instanceof MkDeref and result = "Deref" + or + this instanceof MkBinaryOp and result = "BinaryOp" + or + this instanceof MkUnaryOp and result = "UnaryOp" + or + this instanceof MkUnanalyzable and result = "Unanalyzable" + } + + /** + * Gets an example of a data-flow node with this GVN. + * This is useful for things like implementing toString(). + */ + private DataFlow::Node exampleNode() { + // Pick the expression with the minimum source location. This is + // just an arbitrary way to pick an expression with this `GVN`. + result = + min(DataFlow::Node e, string f, int l, int c, string k | + e = getANode() and e.hasLocationInfo(f, l, c, _, _) and k = e.getNodeKind() + | + e order by f, l, c, k + ) + } + + /** Gets a textual representation of this element. */ + string toString() { result = exampleNode().toString() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exampleNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +private predicate mkNumericConst(DataFlow::Node nd, string val) { + nd.getType().getUnderlyingType() instanceof NumericType and + val = nd.getExactValue() and + nd.isPlatformIndependentConstant() +} + +private predicate mkStringConst(DataFlow::Node nd, string val) { + val = nd.getStringValue() and + nd.isPlatformIndependentConstant() +} + +private predicate mkBoolConst(DataFlow::Node nd, boolean val) { + val = nd.getBoolValue() and + nd.isPlatformIndependentConstant() +} + +private predicate mkFunc(DataFlow::Node nd, Function f) { + nd = f.getARead() and + not f instanceof Method +} + +private predicate analyzableConst(DataFlow::Node e) { + mkNumericConst(e, _) or mkStringConst(e, _) or mkBoolConst(e, _) or mkFunc(e, _) +} + +private predicate analyzableMethodAccess(Read access, DataFlow::Node receiver, Method m) { + exists(IR::ReadInstruction r | r = access.asInstruction() | + r.readsMethod(receiver.asInstruction(), m) and + not r.isConst() + ) +} + +private predicate mkMethodAccess(DataFlow::Node access, GVN qualifier, Method m) { + exists(DataFlow::Node base | + analyzableMethodAccess(access, base, m) and + qualifier = globalValueNumber(base) + ) +} + +private predicate analyzableFieldRead(Read fread, DataFlow::Node base, Field f) { + exists(IR::ReadInstruction r | r = fread.asInstruction() | + r.readsField(base.asInstruction(), f) and + strictcount(mostRecentSideEffect(r)) = 1 and + not r.isConst() + ) +} + +private predicate mkFieldRead( + DataFlow::Node fread, GVN qualifier, Field v, ControlFlow::Node dominator +) { + exists(DataFlow::Node base | + analyzableFieldRead(fread, base, v) and + qualifier = globalValueNumber(base) and + dominator = mostRecentSideEffect(fread.asInstruction()) + ) +} + +private predicate analyzableCall(DataFlow::CallNode ce, Function f) { + f = ce.getTarget() and + isPureFn(f) and + not ce.isConst() +} + +private predicate mkPureCall(DataFlow::CallNode ce, Function f, GVN callee, GVNList args) { + analyzableCall(ce, f) and + callee = globalValueNumber(ce.getCalleeNode()) and + args = globalValueNumbers(ce, 0) +} + +/** + * Holds if `v` is a variable whose value changes are not, or at least not fully, captured by SSA. + * + * This is the case for package variables (for which no SSA information exists), but also for + * variables of non-primitive type (for which deep mutations are not captured by SSA). + */ +private predicate incompleteSsa(ValueEntity v) { + not v instanceof Field and + ( + not v instanceof SsaSourceVariable + or + v.(SsaSourceVariable).mayHaveIndirectReferences() + or + exists(Type tp | tp = v.(DeclaredVariable).getType().getUnderlyingType() | + not tp instanceof BasicType + ) + ) +} + +/** + * Holds if `access` is an access to a variable `target` for which SSA information is incomplete. + */ +private predicate analyzableOtherVariable(DataFlow::Node access, ValueEntity target) { + access.asInstruction().reads(target) and + incompleteSsa(target) and + strictcount(mostRecentSideEffect(access.asInstruction())) = 1 and + not access.isConst() and + not target instanceof Function +} + +private predicate mkOtherVariable(DataFlow::Node access, ValueEntity x, ControlFlow::Node dominator) { + analyzableOtherVariable(access, x) and + dominator = mostRecentSideEffect(access.asInstruction()) +} + +private predicate analyzableBinaryOp( + DataFlow::BinaryOperationNode op, string opname, DataFlow::Node lhs, DataFlow::Node rhs +) { + opname = op.getOperator() and + not op.mayHaveSideEffects() and + lhs = op.getLeftOperand() and + rhs = op.getRightOperand() and + not op.isConst() +} + +private predicate mkBinaryOp(DataFlow::Node op, GVN lhs, GVN rhs, string opname) { + exists(DataFlow::Node l, DataFlow::Node r | + analyzableBinaryOp(op, opname, l, r) and + lhs = globalValueNumber(l) and + rhs = globalValueNumber(r) + ) +} + +private predicate analyzableUnaryOp(DataFlow::UnaryOperationNode op) { + not op.mayHaveSideEffects() and + not op.isConst() +} + +private predicate mkUnaryOp(DataFlow::UnaryOperationNode op, GVN child, string opname) { + analyzableUnaryOp(op) and + child = globalValueNumber(op.getOperand()) and + opname = op.getOperator() +} + +private predicate analyzableIndexExpr(DataFlow::ElementReadNode ae) { + strictcount(mostRecentSideEffect(ae.asInstruction())) = 1 and + not ae.isConst() +} + +private predicate mkIndex( + DataFlow::ElementReadNode ae, GVN base, GVN offset, ControlFlow::Node dominator +) { + analyzableIndexExpr(ae) and + base = globalValueNumber(ae.getBase()) and + offset = globalValueNumber(ae.getIndex()) and + dominator = mostRecentSideEffect(ae.asInstruction()) +} + +private predicate analyzablePointerDereferenceExpr(DataFlow::PointerDereferenceNode deref) { + strictcount(mostRecentSideEffect(deref.asInstruction())) = 1 and + not deref.isConst() +} + +private predicate mkDeref(DataFlow::PointerDereferenceNode deref, GVN p, ControlFlow::Node dominator) { + analyzablePointerDereferenceExpr(deref) and + p = globalValueNumber(deref.getOperand()) and + dominator = mostRecentSideEffect(deref.asInstruction()) +} + +private predicate ssaInit(SsaExplicitDefinition ssa, DataFlow::Node rhs) { + ssa.getRhs() = rhs.asInstruction() +} + +/** Gets the global value number of data-flow node `nd`. */ +cached +GVN globalValueNumber(DataFlow::Node nd) { + exists(string val | + mkNumericConst(nd, val) and + result = MkNumericConst(val) + ) + or + exists(string val | + mkStringConst(nd, val) and + result = MkStringConst(val) + ) + or + exists(boolean val | + mkBoolConst(nd, val) and + result = MkBoolConst(val) + ) + or + exists(Function f | + mkFunc(nd, f) and + result = MkFunc(f) + ) + or + exists(ValueEntity x, ControlFlow::Node dominator | + mkOtherVariable(nd, x, dominator) and + result = MkOtherVariable(x, dominator) + ) + or + exists(GVN qualifier, Function target | + mkMethodAccess(nd, qualifier, target) and + result = MkMethodAccess(qualifier, target) + ) + or + exists(GVN qualifier, Entity target, ControlFlow::Node dominator | + mkFieldRead(nd, qualifier, target, dominator) and + result = MkFieldRead(qualifier, target, dominator) + ) + or + exists(Function f, GVN callee, GVNList args | + mkPureCall(nd, f, callee, args) and + result = MkPureCall(f, callee, args) + ) + or + exists(GVN lhs, GVN rhs, string opname | + mkBinaryOp(nd, lhs, rhs, opname) and + result = MkBinaryOp(lhs, rhs, opname) + ) + or + exists(GVN child, string opname | + mkUnaryOp(nd, child, opname) and + result = MkUnaryOp(child, opname) + ) + or + exists(GVN x, GVN i, ControlFlow::Node dominator | + mkIndex(nd, x, i, dominator) and + result = MkIndex(x, i, dominator) + ) + or + exists(GVN p, ControlFlow::Node dominator | + mkDeref(nd, p, dominator) and + result = MkDeref(p, dominator) + ) + or + not analyzableExpr(nd) and + result = MkUnanalyzable(nd) + or + exists(DataFlow::SsaNode ssa | + nd = ssa.getAUse() and + not incompleteSsa(ssa.getSourceVariable()) and + result = globalValueNumber(ssa) + ) + or + exists(SsaDefinition ssa | ssa = nd.(DataFlow::SsaNode).getDefinition() | + // Local variable with a defining value. + exists(DataFlow::Node init | + ssaInit(ssa, init) and + result = globalValueNumber(init) + ) + or + // Local variable without a defining value. + not ssaInit(ssa, _) and + result = MkIndirectSsa(ssa) + ) +} + +/** + * Holds if the expression is explicitly handled by `globalValueNumber`. + * Unanalyzable expressions still need to be given a global value number, + * but it will be a unique number that is not shared with any other + * expression. + */ +private predicate analyzableExpr(DataFlow::Node e) { + analyzableConst(e) or + any(DataFlow::SsaNode ssa).getAUse() = e or + e instanceof DataFlow::SsaNode or + analyzableOtherVariable(e, _) or + analyzableMethodAccess(e, _, _) or + analyzableFieldRead(e, _, _) or + analyzableCall(e, _) or + analyzableBinaryOp(e, _, _, _) or + analyzableUnaryOp(e) or + analyzableIndexExpr(e) or + analyzablePointerDereferenceExpr(e) +} diff --git a/go/ql/lib/semmle/go/dataflow/Properties.qll b/go/ql/lib/semmle/go/dataflow/Properties.qll new file mode 100644 index 00000000000..f7df3391f40 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/Properties.qll @@ -0,0 +1,101 @@ +/** + * Provides a class for representing and reasoning about properties of data-flow nodes. + */ + +import go + +private newtype TProperty = + IsBoolean(Boolean b) or + IsNil(Boolean b) + +/** + * A property which may or may not hold of a data-flow node. + * + * Supported properties currently are Boolean truth and `nil`-ness. + */ +class Property extends TProperty { + private predicate checkOnExpr(Expr test, Boolean outcome, DataFlow::Node nd) { + exists(EqualityTestExpr eq, Expr e, boolean isTrue | + eq = test and eq.hasOperands(nd.asExpr(), e) + | + this = IsBoolean(isTrue) and + isTrue = eq.getPolarity().booleanXor(e.getBoolValue().booleanXor(outcome)) + or + this = IsNil(isTrue) and + e = Builtin::nil().getAReference() and + isTrue = eq.getPolarity().booleanXor(outcome).booleanNot() + ) + or + // if test = outcome ==> nd matches this + // then !test = !outcome ==> nd matches this + this.checkOnExpr(test.(NotExpr).getOperand(), outcome.booleanNot(), nd) + or + // if test = outcome ==> nd matches this + // then (test) = outcome ==> nd matches this + this.checkOnExpr(test.(ParenExpr).getExpr(), outcome, nd) + or + // if test = true ==> nd matches this + // then (test && e) = true ==> nd matches this + outcome = true and + this.checkOnExpr(test.(LandExpr).getAnOperand(), outcome, nd) + or + // if test = false ==> nd matches this + // then (test || e) = false ==> nd matches this + outcome = false and + this.checkOnExpr(test.(LorExpr).getAnOperand(), outcome, nd) + or + test = nd.asExpr() and + test instanceof ValueExpr and + test.getType().getUnderlyingType() instanceof BoolType and + this = IsBoolean(outcome) + } + + /** + * Holds if `test` evaluating to `outcome` means that this property holds of `nd`, where `nd` is a + * subexpression of `test`. + */ + predicate checkOn(DataFlow::Node test, Boolean outcome, DataFlow::Node nd) { + this.checkOnExpr(test.asExpr(), outcome, nd) + } + + /** Holds if this is the property of having the Boolean value `b`. */ + predicate isBoolean(boolean b) { this = IsBoolean(b) } + + /** Returns the boolean represented by this property if it is a boolean. */ + boolean asBoolean() { this = IsBoolean(result) } + + /** Holds if this is the property of being `nil`. */ + predicate isNil() { this = IsNil(true) } + + /** Holds if this is the property of being non-`nil`. */ + predicate isNonNil() { this = IsNil(false) } + + /** Gets a textual representation of this property. */ + string toString() { + exists(boolean b | + this = IsBoolean(b) and + result = "is " + b + ) + or + this = IsNil(true) and + result = "is nil" + or + this = IsNil(false) and + result = "is not nil" + } +} + +/** + * Gets a `Property` representing truth outcome `b`. + */ +Property booleanProperty(boolean b) { result = IsBoolean(b) } + +/** + * Gets a `Property` representing `nil`-ness. + */ +Property nilProperty() { result = IsNil(true) } + +/** + * Gets a `Property` representing non-`nil`-ness. + */ +Property notNilProperty() { result = IsNil(false) } diff --git a/go/ql/lib/semmle/go/dataflow/SSA.qll b/go/ql/lib/semmle/go/dataflow/SSA.qll new file mode 100644 index 00000000000..713b02e8325 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/SSA.qll @@ -0,0 +1,411 @@ +/** + * Provides classes for working with static single assignment form (SSA). + */ + +import go +private import SsaImpl + +/** + * A variable that can be SSA converted, that is, a local variable, but not a variable + * declared in file scope. + */ +class SsaSourceVariable extends LocalVariable { + SsaSourceVariable() { not this.getScope() instanceof FileScope } + + /** + * Holds if there may be indirect references of this variable that are not covered by `getAReference()`. + * + * This is the case for variables that have their address taken, and for variables whose + * name resolution information may be incomplete (for instance due to an extractor error). + */ + predicate mayHaveIndirectReferences() { + // variables that have their address taken + exists(AddressExpr addr | addr.getOperand().stripParens() = this.getAReference()) + or + exists(DataFlow::MethodReadNode mrn | + mrn.getReceiver() = this.getARead() and + mrn.getMethod().getReceiverType() instanceof PointerType + ) + or + // variables where there is an unresolved reference with the same name in the same + // scope or a nested scope, suggesting that name resolution information may be incomplete + exists(FunctionScope scope, FuncDef inner | + scope = this.getScope().(LocalScope).getEnclosingFunctionScope() and + unresolvedReference(this.getName(), inner) and + inner.getScope().getOuterScope*() = scope + ) + } +} + +/** + * Holds if there is an unresolved reference to `name` in `fn`. + */ +private predicate unresolvedReference(string name, FuncDef fn) { + exists(Ident unresolved | + unresolvedIdentifier(unresolved, name) and + not unresolved = any(SelectorExpr sel).getSelector() and + fn = unresolved.getEnclosingFunction() + ) +} + +/** + * Holds if `id` is an unresolved identifier with the given `name`. + */ +pragma[noinline] +private predicate unresolvedIdentifier(Ident id, string name) { + id.getName() = name and + id instanceof ReferenceExpr and + not id.refersTo(_) +} + +/** + * An SSA variable. + */ +class SsaVariable extends TSsaDefinition { + /** Gets the source variable corresponding to this SSA variable. */ + SsaSourceVariable getSourceVariable() { result = this.(SsaDefinition).getSourceVariable() } + + /** Gets the (unique) definition of this SSA variable. */ + SsaDefinition getDefinition() { result = this } + + /** Gets the type of this SSA variable. */ + Type getType() { result = this.getSourceVariable().getType() } + + /** Gets a use in basic block `bb` that refers to this SSA variable. */ + IR::Instruction getAUseIn(ReachableBasicBlock bb) { + exists(int i, SsaSourceVariable v | v = this.getSourceVariable() | + result = bb.getNode(i) and + this = getDefinition(bb, i, v) + ) + } + + /** Gets a use that refers to this SSA variable. */ + IR::Instruction getAUse() { result = this.getAUseIn(_) } + + /** Gets a textual representation of this element. */ + string toString() { result = this.getDefinition().prettyPrintRef() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getDefinition().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * An SSA definition. + */ +class SsaDefinition extends TSsaDefinition { + /** Gets the SSA variable defined by this definition. */ + SsaVariable getVariable() { result = this } + + /** Gets the source variable defined by this definition. */ + abstract SsaSourceVariable getSourceVariable(); + + /** + * Gets the basic block to which this definition belongs. + */ + abstract ReachableBasicBlock getBasicBlock(); + + /** + * INTERNAL: Use `getBasicBlock()` and `getSourceVariable()` instead. + * + * Holds if this is a definition of source variable `v` at index `idx` in basic block `bb`. + * + * Phi nodes are considered to be at index `-1`, all other definitions at the index of + * the control flow node they correspond to. + */ + abstract predicate definesAt(ReachableBasicBlock bb, int idx, SsaSourceVariable v); + + /** + * INTERNAL: Use `toString()` instead. + * + * Gets a pretty-printed representation of this SSA definition. + */ + abstract string prettyPrintDef(); + + /** + * INTERNAL: Do not use. + * + * Gets a pretty-printed representation of a reference to this SSA definition. + */ + abstract string prettyPrintRef(); + + /** Gets the innermost function or file to which this SSA definition belongs. */ + ControlFlow::Root getRoot() { result = this.getBasicBlock().getRoot() } + + /** Gets a textual representation of this element. */ + string toString() { result = this.prettyPrintDef() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + abstract predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ); +} + +/** + * An SSA definition that corresponds to an explicit assignment or other variable definition. + */ +class SsaExplicitDefinition extends SsaDefinition, TExplicitDef { + /** Gets the instruction where the definition happens. */ + IR::Instruction getInstruction() { + exists(BasicBlock bb, int i | this = TExplicitDef(bb, i, _) | result = bb.getNode(i)) + } + + /** Gets the right-hand side of the definition. */ + IR::Instruction getRhs() { this.getInstruction().writes(_, result) } + + override predicate definesAt(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + this = TExplicitDef(bb, i, v) + } + + override ReachableBasicBlock getBasicBlock() { this.definesAt(result, _, _) } + + override SsaSourceVariable getSourceVariable() { this = TExplicitDef(_, _, result) } + + override string prettyPrintRef() { + exists(int l, int c | this.hasLocationInfo(_, l, c, _, _) | result = "def@" + l + ":" + c) + } + + override string prettyPrintDef() { result = "definition of " + this.getSourceVariable() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getInstruction().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** Provides a helper predicate for working with explicit SSA definitions. */ +module SsaExplicitDefinition { + /** + * Gets the SSA definition corresponding to definition `def`. + */ + SsaExplicitDefinition of(IR::Instruction def) { result.getInstruction() = def } +} + +/** + * An SSA definition that does not correspond to an explicit variable definition. + */ +abstract class SsaImplicitDefinition extends SsaDefinition { + /** + * INTERNAL: Do not use. + * + * Gets the definition kind to include in `prettyPrintRef`. + */ + abstract string getKind(); + + override string prettyPrintRef() { + exists(int l, int c | this.hasLocationInfo(_, l, c, _, _) | + result = this.getKind() + "@" + l + ":" + c + ) + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + endline = startline and + endcolumn = startcolumn and + this.getBasicBlock().hasLocationInfo(filepath, startline, startcolumn, _, _) + } +} + +/** + * An SSA definition representing the capturing of an SSA-convertible variable + * in the closure of a nested function. + * + * Capturing definitions appear at the beginning of such functions, as well as + * at any function call that may affect the value of the variable. + */ +class SsaVariableCapture extends SsaImplicitDefinition, TCapture { + override predicate definesAt(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + this = TCapture(bb, i, v) + } + + override ReachableBasicBlock getBasicBlock() { this.definesAt(result, _, _) } + + override SsaSourceVariable getSourceVariable() { this.definesAt(_, _, result) } + + override string getKind() { result = "capture" } + + override string prettyPrintDef() { result = "capture variable " + this.getSourceVariable() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(ReachableBasicBlock bb, int i | this.definesAt(bb, i, _) | + bb.getNode(i).hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + ) + } +} + +/** + * An SSA definition such as a phi node that has no actual semantics, but simply serves to + * merge or filter data flow. + */ +abstract class SsaPseudoDefinition extends SsaImplicitDefinition { + /** + * Gets an input of this pseudo-definition. + */ + abstract SsaVariable getAnInput(); + + /** + * Gets a textual representation of the inputs of this pseudo-definition + * in lexicographical order. + */ + string ppInputs() { result = concat(this.getAnInput().getDefinition().prettyPrintRef(), ", ") } +} + +/** + * An SSA phi node, that is, a pseudo-definition for a variable at a point + * in the flow graph where otherwise two or more definitions for the variable + * would be visible. + */ +class SsaPhiNode extends SsaPseudoDefinition, TPhi { + override SsaVariable getAnInput() { + result = getDefReachingEndOf(this.getBasicBlock().getAPredecessor(), this.getSourceVariable()) + } + + override predicate definesAt(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + bb = this.getBasicBlock() and v = this.getSourceVariable() and i = -1 + } + + override ReachableBasicBlock getBasicBlock() { this = TPhi(result, _) } + + override SsaSourceVariable getSourceVariable() { this = TPhi(_, result) } + + override string getKind() { result = "phi" } + + override string prettyPrintDef() { + result = this.getSourceVariable() + " = phi(" + this.ppInputs() + ")" + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + endline = startline and + endcolumn = startcolumn and + this.getBasicBlock().hasLocationInfo(filepath, startline, startcolumn, _, _) + } +} + +/** + * An SSA variable, possibly with a chain of field reads on it. + */ +private newtype TSsaWithFields = + TRoot(SsaVariable v) or + TStep(SsaWithFields base, Field f) { exists(accessPathAux(base, f)) } + +/** + * Gets a representation of `nd` as an ssa-with-fields value if there is one. + */ +private TSsaWithFields accessPath(IR::Instruction insn) { + exists(SsaVariable v | insn = v.getAUse() | result = TRoot(v)) + or + exists(SsaWithFields base, Field f | insn = accessPathAux(base, f) | result = TStep(base, f)) +} + +/** + * Gets a data-flow node that reads a field `f` from a node that is represented + * by ssa-with-fields value `base`. + */ +private IR::Instruction accessPathAux(TSsaWithFields base, Field f) { + exists(IR::FieldReadInstruction fr, IR::Instruction frb | + fr.getBase() = frb or + fr.getBase() = IR::implicitDerefInstruction(frb.(IR::EvalInstruction).getExpr()) + | + base = accessPath(frb) and + f = fr.getField() and + result = fr + ) +} + +/** An SSA variable with zero or more fields read from it. */ +class SsaWithFields extends TSsaWithFields { + /** + * Gets the SSA variable corresponding to the base of this SSA variable with fields. + * + * For example, the SSA variable corresponding to `a` for the SSA variable with fields + * corresponding to `a.b`. + */ + SsaVariable getBaseVariable() { + this = TRoot(result) + or + exists(SsaWithFields base, Field f | this = TStep(base, f) | result = base.getBaseVariable()) + } + + /** Gets a use that refers to this SSA variable with fields. */ + DataFlow::Node getAUse() { this = accessPath(result.asInstruction()) } + + /** Gets the type of this SSA variable with fields. */ + Type getType() { + exists(SsaVariable var | this = TRoot(var) | result = var.getType()) + or + exists(Field f | this = TStep(_, f) | result = f.getType()) + } + + /** Gets a textual representation of this element. */ + string toString() { + exists(SsaVariable var | this = TRoot(var) | result = "(" + var + ")") + or + exists(SsaWithFields base, Field f | this = TStep(base, f) | result = base + "." + f.getName()) + } + + /** + * Gets an SSA-with-fields variable that is similar to this SSA-with-fields variable in the + * sense that it has the same root variable and the same sequence of field accesses. + */ + SsaWithFields similar() { + result.getBaseVariable().getSourceVariable() = this.getBaseVariable().getSourceVariable() and + result.getQualifiedName() = this.getQualifiedName() + } + + /** + * Gets the qualified name of the source variable or variable and fields that this represents. + * + * For example, for an SSA variable that represents the field `a.b`, this would get the string + * `"a.b"`. + */ + string getQualifiedName() { + exists(SsaVariable v | this = TRoot(v) and result = v.getSourceVariable().getName()) + or + exists(SsaWithFields base, Field f | this = TStep(base, f) | + result = base.getQualifiedName() + "." + f.getName() + ) + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getBaseVariable().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * Gets a read similar to `node`, according to the same rules as `SsaWithFields.similar()`. + */ +DataFlow::Node getASimilarReadNode(DataFlow::Node node) { + exists(SsaWithFields readFields | node = readFields.getAUse() | + result = readFields.similar().getAUse() + ) +} diff --git a/go/ql/lib/semmle/go/dataflow/SsaImpl.qll b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll new file mode 100644 index 00000000000..0db37ac03ce --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll @@ -0,0 +1,295 @@ +/** + * INTERNAL: Analyses should use module `SSA` instead. + * + * Provides predicates for constructing an SSA representation for functions. + */ + +import go + +cached +private module Internal { + /** Holds if the `i`th node of `bb` defines `v`. */ + cached + predicate defAt(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + bb.getNode(i).(IR::Instruction).writes(v, _) + } + + /** Holds if the `i`th node of `bb` reads `v`. */ + cached + predicate useAt(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + bb.getNode(i).(IR::Instruction).reads(v) + } + + /** + * A data type representing SSA definitions. + * + * We distinguish three kinds of SSA definitions: + * + * 1. Variable definitions, including declarations, assignments and increments/decrements. + * 2. Pseudo-definitions for captured variables at the beginning of the capturing function + * as well as after calls. + * 3. Phi nodes. + * + * SSA definitions are only introduced where necessary. In particular, + * unreachable code has no SSA definitions associated with it, and neither + * have dead assignments (that is, assignments whose value is never read). + */ + cached + newtype TSsaDefinition = + /** + * An SSA definition that corresponds to an explicit assignment or other variable definition. + */ + TExplicitDef(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + defAt(bb, i, v) and + (liveAfterDef(bb, i, v) or v.isCaptured()) + } or + /** + * An SSA definition representing the capturing of an SSA-convertible variable + * in the closure of a nested function. + * + * Capturing definitions appear at the beginning of such functions, as well as + * at any function call that may affect the value of the variable. + */ + TCapture(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + mayCapture(bb, i, v) and + liveAfterDef(bb, i, v) + } or + /** + * An SSA phi node, that is, a pseudo-definition for a variable at a point + * in the flow graph where otherwise two or more definitions for the variable + * would be visible. + */ + TPhi(ReachableJoinBlock bb, SsaSourceVariable v) { + liveAtEntry(bb, v) and + inDefDominanceFrontier(bb, v) + } + + /** + * Holds if `bb` is in the dominance frontier of a block containing a definition of `v`. + */ + pragma[noinline] + private predicate inDefDominanceFrontier(ReachableJoinBlock bb, SsaSourceVariable v) { + exists(ReachableBasicBlock defbb, SsaDefinition def | + def.definesAt(defbb, _, v) and + bb.inDominanceFrontierOf(defbb) + ) + } + + /** + * Holds if `v` is a captured variable which is declared in `declFun` and read in `useFun`. + */ + private predicate readsCapturedVar(FuncDef useFun, SsaSourceVariable v, FuncDef declFun) { + declFun = v.getDeclaringFunction() and + useFun = any(IR::Instruction u | u.reads(v)).getRoot() and + v.isCaptured() + } + + /** Holds if the `i`th node of `bb` in function `f` is an entry node. */ + private predicate entryNode(FuncDef f, ReachableBasicBlock bb, int i) { + f = bb.getRoot() and + bb.getNode(i).isEntryNode() + } + + /** + * Holds if the `i`th node of `bb` in function `f` is a function call. + */ + private predicate callNode(FuncDef f, ReachableBasicBlock bb, int i) { + f = bb.getRoot() and + bb.getNode(i).(IR::EvalInstruction).getExpr() instanceof CallExpr + } + + /** + * Holds if the `i`th node of basic block `bb` may induce a pseudo-definition for + * modeling updates to captured variable `v`. Whether the definition is actually + * introduced depends on whether `v` is live at this point in the program. + */ + private predicate mayCapture(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + exists(FuncDef capturingContainer, FuncDef declContainer | + // capture initial value of variable declared in enclosing scope + readsCapturedVar(capturingContainer, v, declContainer) and + capturingContainer != declContainer and + entryNode(capturingContainer, bb, i) + or + // re-capture value of variable after a call if it is assigned non-locally + readsCapturedVar(capturingContainer, v, declContainer) and + assignedThroughClosure(v) and + callNode(capturingContainer, bb, i) + ) + } + + /** A classification of variable references into reads and writes. */ + private newtype RefKind = + ReadRef() or + WriteRef() + + /** + * Holds if the `i`th node of basic block `bb` is a reference to `v`, either a read + * (when `tp` is `ReadRef()`) or a direct or indirect write (when `tp` is `WriteRef()`). + */ + private predicate ref(ReachableBasicBlock bb, int i, SsaSourceVariable v, RefKind tp) { + useAt(bb, i, v) and tp = ReadRef() + or + (mayCapture(bb, i, v) or defAt(bb, i, v)) and + tp = WriteRef() + } + + /** + * Gets the (1-based) rank of the reference to `v` at the `i`th node of basic block `bb`, + * which has the given reference kind `tp`. + */ + private int refRank(ReachableBasicBlock bb, int i, SsaSourceVariable v, RefKind tp) { + i = rank[result](int j | ref(bb, j, v, _)) and + ref(bb, i, v, tp) + } + + /** + * Gets the maximum rank among all references to `v` in basic block `bb`. + */ + private int maxRefRank(ReachableBasicBlock bb, SsaSourceVariable v) { + result = max(refRank(bb, _, v, _)) + } + + /** + * Holds if variable `v` is live after the `i`th node of basic block `bb`, where + * `i` is the index of a node that may assign or capture `v`. + * + * For the purposes of this predicate, function calls are considered as writes of captured variables. + */ + private predicate liveAfterDef(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + exists(int r | r = refRank(bb, i, v, WriteRef()) | + // the next reference to `v` inside `bb` is a read + r + 1 = refRank(bb, _, v, ReadRef()) + or + // this is the last reference to `v` inside `bb`, but `v` is live at entry + // to a successor basic block of `bb` + r = maxRefRank(bb, v) and + liveAtSuccEntry(bb, v) + ) + } + + /** + * Holds if variable `v` is live at the beginning of basic block `bb`. + * + * For the purposes of this predicate, function calls are considered as writes of captured variables. + */ + private predicate liveAtEntry(ReachableBasicBlock bb, SsaSourceVariable v) { + // the first reference to `v` inside `bb` is a read + refRank(bb, _, v, ReadRef()) = 1 + or + // there is no reference to `v` inside `bb`, but `v` is live at entry + // to a successor basic block of `bb` + not exists(refRank(bb, _, v, _)) and + liveAtSuccEntry(bb, v) + } + + /** + * Holds if `v` is live at the beginning of any successor of basic block `bb`. + */ + private predicate liveAtSuccEntry(ReachableBasicBlock bb, SsaSourceVariable v) { + liveAtEntry(bb.getASuccessor(), v) + } + + /** + * Holds if `v` is assigned outside its declaring function. + */ + private predicate assignedThroughClosure(SsaSourceVariable v) { + any(IR::Instruction def | def.writes(v, _)).getRoot() != v.getDeclaringFunction() + } + + /** + * Holds if the `i`th node of `bb` is a use or an SSA definition of variable `v`, with + * `k` indicating whether it is the former or the latter. + */ + private predicate ssaRef(ReachableBasicBlock bb, int i, SsaSourceVariable v, RefKind k) { + useAt(bb, i, v) and k = ReadRef() + or + any(SsaDefinition def).definesAt(bb, i, v) and k = WriteRef() + } + + /** + * Gets the (1-based) rank of the `i`th node of `bb` among all SSA definitions + * and uses of `v` in `bb`, with `k` indicating whether it is a definition or a use. + * + * For example, if `bb` is a basic block with a phi node for `v` (considered + * to be at index -1), uses `v` at node 2 and defines it at node 5, we have: + * + * ``` + * ssaRefRank(bb, -1, v, WriteRef()) = 1 // phi node + * ssaRefRank(bb, 2, v, ReadRef()) = 2 // use at node 2 + * ssaRefRank(bb, 5, v, WriteRef()) = 3 // definition at node 5 + * ``` + */ + private int ssaRefRank(ReachableBasicBlock bb, int i, SsaSourceVariable v, RefKind k) { + i = rank[result](int j | ssaRef(bb, j, v, _)) and + ssaRef(bb, i, v, k) + } + + /** + * Gets the minimum rank of a read in `bb` such that all references to `v` between that + * read and the read at index `i` are reads (and not writes). + */ + private int rewindReads(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + exists(int r | r = ssaRefRank(bb, i, v, ReadRef()) | + exists(int j, RefKind k | r - 1 = ssaRefRank(bb, j, v, k) | + k = ReadRef() and result = rewindReads(bb, j, v) + or + k = WriteRef() and result = r + ) + or + r = 1 and result = r + ) + } + + /** + * Gets the SSA definition of `v` in `bb` that reaches the read of `v` at node `i`, if any. + */ + private SsaDefinition getLocalDefinition(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + exists(int r | r = rewindReads(bb, i, v) | + exists(int j | result.definesAt(bb, j, v) and ssaRefRank(bb, j, v, _) = r - 1) + ) + } + + /** + * Gets an SSA definition of `v` that reaches the end of the immediate dominator of `bb`. + */ + pragma[noinline] + private SsaDefinition getDefReachingEndOfImmediateDominator( + ReachableBasicBlock bb, SsaSourceVariable v + ) { + result = getDefReachingEndOf(bb.getImmediateDominator(), v) + } + + /** + * Gets an SSA definition of `v` that reaches the end of basic block `bb`. + */ + cached + SsaDefinition getDefReachingEndOf(ReachableBasicBlock bb, SsaSourceVariable v) { + exists(int lastRef | lastRef = max(int i | ssaRef(bb, i, v, _)) | + result = getLocalDefinition(bb, lastRef, v) + or + result.definesAt(bb, lastRef, v) and + liveAtSuccEntry(bb, v) + ) + or + // In SSA form, the (unique) reaching definition of a use is the closest + // definition that dominates the use. If two definitions dominate a node + // then one must dominate the other, so we can find the reaching definition + // by following the idominance relation backwards. + result = getDefReachingEndOfImmediateDominator(bb, v) and + not exists(SsaDefinition ssa | ssa.definesAt(bb, _, v)) and + liveAtSuccEntry(bb, v) + } + + /** + * Gets the unique SSA definition of `v` whose value reaches the `i`th node of `bb`, + * which is a use of `v`. + */ + cached + SsaDefinition getDefinition(ReachableBasicBlock bb, int i, SsaSourceVariable v) { + result = getLocalDefinition(bb, i, v) + or + rewindReads(bb, i, v) = 1 and result = getDefReachingEndOf(bb.getImmediateDominator(), v) + } +} + +import Internal diff --git a/go/ql/lib/semmle/go/dataflow/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/TaintTracking.qll new file mode 100644 index 00000000000..096116d4bee --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/TaintTracking.qll @@ -0,0 +1,14 @@ +/** + * Provides classes for performing local (intra-procedural) and + * global (inter-procedural) taint-tracking analyses. + */ + +import semmle.go.dataflow.DataFlow + +/** + * Provides classes for performing local (intra-procedural) and + * global (inter-procedural) taint-tracking analyses. + */ +module TaintTracking { + import semmle.go.dataflow.internal.tainttracking1.TaintTrackingImpl +} diff --git a/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll b/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll new file mode 100644 index 00000000000..6b1b2487e5b --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll @@ -0,0 +1,12 @@ +/** + * Provides classes for performing local (intra-procedural) and + * global (inter-procedural) taint-tracking analyses. + */ + +/** + * Provides classes for performing local (intra-procedural) and + * global (inter-procedural) taint-tracking analyses. + */ +module TaintTracking2 { + import semmle.go.dataflow.internal.tainttracking2.TaintTrackingImpl +} diff --git a/go/ql/lib/semmle/go/dataflow/barrierguardutil/RedirectCheckBarrierGuard.qll b/go/ql/lib/semmle/go/dataflow/barrierguardutil/RedirectCheckBarrierGuard.qll new file mode 100644 index 00000000000..6ce0f9014fa --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/barrierguardutil/RedirectCheckBarrierGuard.qll @@ -0,0 +1,21 @@ +/** + * Provides an implementation of a commonly used barrier guard for sanitizing untrusted URLs. + */ + +import go + +/** + * A call to a function called `isLocalUrl`, `isValidRedirect`, or similar, which is + * considered a barrier guard for sanitizing untrusted URLs. + */ +class RedirectCheckBarrierGuard extends DataFlow::BarrierGuard, DataFlow::CallNode { + RedirectCheckBarrierGuard() { + this.getCalleeName().regexpMatch("(?i)(is_?)?(local_?url|valid_?redir(ect)?)(ur[li])?") + } + + override predicate checks(Expr e, boolean outcome) { + // `isLocalUrl(e)` is a barrier for `e` if it evaluates to `true` + this.getAnArgument().asExpr() = e and + outcome = true + } +} diff --git a/go/ql/lib/semmle/go/dataflow/barrierguardutil/RegexpCheck.qll b/go/ql/lib/semmle/go/dataflow/barrierguardutil/RegexpCheck.qll new file mode 100644 index 00000000000..64cff45ab62 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/barrierguardutil/RegexpCheck.qll @@ -0,0 +1,33 @@ +/** + * Provides an implementation of a commonly used barrier guard for sanitizing untrusted URLs. + */ + +import go + +/** + * A call to a regexp match function, considered as a barrier guard for sanitizing untrusted URLs. + * + * This is overapproximate: we do not attempt to reason about the correctness of the regexp. + * + * Use this if you want to define a derived `DataFlow::BarrierGuard` without + * make the type recursive. Otherwise use `RegexpCheck`. + */ +predicate regexpFunctionChecksExpr(DataFlow::Node resultNode, Expr checked, boolean branch) { + exists(RegexpMatchFunction matchfn, DataFlow::CallNode call | + matchfn.getACall() = call and + resultNode = matchfn.getResult().getNode(call).getASuccessor*() and + checked = matchfn.getValue().getNode(call).asExpr() and + (branch = false or branch = true) + ) +} + +/** + * A call to a regexp match function, considered as a barrier guard for sanitizing untrusted URLs. + * + * This is overapproximate: we do not attempt to reason about the correctness of the regexp. + */ +class RegexpCheck extends DataFlow::BarrierGuard { + RegexpCheck() { regexpFunctionChecksExpr(this, _, _) } + + override predicate checks(Expr e, boolean branch) { regexpFunctionChecksExpr(this, e, branch) } +} diff --git a/go/ql/lib/semmle/go/dataflow/barrierguardutil/UrlCheck.qll b/go/ql/lib/semmle/go/dataflow/barrierguardutil/UrlCheck.qll new file mode 100644 index 00000000000..8aefc67ee38 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/barrierguardutil/UrlCheck.qll @@ -0,0 +1,32 @@ +/** + * Provides an implementation of a commonly used barrier guard for sanitizing untrusted URLs. + */ + +import go + +/** + * An equality check comparing a data-flow node against a constant string, considered as + * a barrier guard for sanitizing untrusted URLs. + * + * Additionally, a check comparing `url.Hostname()` against a constant string is also + * considered a barrier guard for `url`. + */ +class UrlCheck extends DataFlow::BarrierGuard, DataFlow::EqualityTestNode { + DataFlow::Node url; + + UrlCheck() { + exists(this.getAnOperand().getStringValue()) and + ( + url = this.getAnOperand() + or + exists(DataFlow::MethodCallNode mc | mc = this.getAnOperand() | + mc.getTarget().getName() = "Hostname" and + url = mc.getReceiver() + ) + ) + } + + override predicate checks(Expr e, boolean outcome) { + e = url.asExpr() and outcome = this.getPolarity() + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/AccessPathSyntax.qll b/go/ql/lib/semmle/go/dataflow/internal/AccessPathSyntax.qll new file mode 100644 index 00000000000..ecb6f542955 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/AccessPathSyntax.qll @@ -0,0 +1,79 @@ +/** + * Module for parsing access paths from CSV models, both the identifying access path used + * by dynamic languages, and the input/output specifications for summary steps. + * + * This file is used by the shared data flow library and by the JavaScript libraries + * (which does not use the shared data flow libraries). + */ + +/** Companion module to the `AccessPath` class. */ +module AccessPath { + /** A string that should be parsed as an access path. */ + abstract class Range extends string { + bindingset[this] + Range() { any() } + } +} + +/** Gets the `n`th token on the access path as a string. */ +private string getRawToken(AccessPath path, int n) { + // Avoid splitting by '.' since tokens may contain dots, e.g. `Field[foo.Bar.x]`. + // Instead use regexpFind to match valid tokens, and supplement with a final length + // check (in `AccessPath.hasSyntaxError`) to ensure all characters were included in a token. + result = path.regexpFind("\\w+(?:\\[[^\\]]*\\])?(?=\\.|$)", n, _) +} + +/** + * A string that occurs as an access path (either identifying or input/output spec) + * which might be relevant for this database. + */ +class AccessPath extends string instanceof AccessPath::Range { + /** Holds if this string is not a syntactically valid access path. */ + predicate hasSyntaxError() { + // If the lengths match, all characters must haven been included in a token + // or seen by the `.` lookahead pattern. + this != "" and + not this.length() = sum(int n | | getRawToken(this, n).length() + 1) - 1 + } + + /** Gets the `n`th token on the access path (if there are no syntax errors). */ + AccessPathToken getToken(int n) { + result = getRawToken(this, n) and + not this.hasSyntaxError() + } + + /** Gets the number of tokens on the path (if there are no syntax errors). */ + int getNumToken() { + result = count(int n | exists(getRawToken(this, n))) and + not this.hasSyntaxError() + } +} + +/** + * An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths. + */ +class AccessPathToken extends string { + AccessPathToken() { this = getRawToken(any(AccessPath path), _) } + + private string getPart(int part) { + result = this.regexpCapture("([^\\[]+)(?:\\[([^\\]]*)\\])?", part) + } + + /** Gets the name of the token, such as `Member` from `Member[x]` */ + string getName() { result = this.getPart(1) } + + /** + * Gets the argument list, such as `1,2` from `Member[1,2]`, + * or has no result if there are no arguments. + */ + string getArgumentList() { result = this.getPart(2) } + + /** Gets the `n`th argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getArgument(int n) { result = this.getArgumentList().splitAt(",", n).trim() } + + /** Gets an argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of arguments to this token, such as 2 for `Member[x,y]` or zero for `ReturnValue`. */ + int getNumArgument() { result = count(int n | exists(this.getArgument(n))) } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll new file mode 100644 index 00000000000..b6c1005daac --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -0,0 +1,71 @@ +/** Contains predicates for dealing with container flow. */ + +import go +private import DataFlowNodes +private import DataFlowPrivate +private import DataFlowUtil +private import semmle.go.dataflow.ExternalFlow + +/** + * Holds if the step from `node1` to `node2` stores a value in an array, a + * slice, a collection or a map. Thus, `node2` references an object with a + * content `c` that contains the value of `node1`. This covers array + * assignments and initializers as well as implicit array creations for + * varargs. + */ +predicate containerStoreStep(Node node1, Node node2, Content c) { + c instanceof ArrayContent and + ( + ( + node2.getType() instanceof ArrayType or + node2.getType() instanceof SliceType + ) and + exists(Write w | w.writesElement(node2, _, node1)) + ) + or + c instanceof CollectionContent and + exists(SendStmt send | + send.getChannel() = node2.(ExprNode).asExpr() and send.getValue() = node1.(ExprNode).asExpr() + ) + or + c instanceof MapKeyContent and + node2.getType() instanceof MapType and + exists(Write w | w.writesElement(node2, node1, _)) + or + c instanceof MapValueContent and + node2.getType() instanceof MapType and + exists(Write w | w.writesElement(node2, _, node1)) +} + +/** + * Holds if the step from `node1` to `node2` reads a value from an array, a + * slice, a collection or a map. Thus, `node1` references an object with a + * content `c` whose value ends up in `node2`. This covers ordinary array reads + * as well as array iteration through enhanced `for` statements. + */ +predicate containerReadStep(Node node1, Node node2, Content c) { + c instanceof ArrayContent and + ( + node2.(Read).readsElement(node1, _) and + ( + node1.getType() instanceof ArrayType or + node1.getType() instanceof SliceType + ) + or + node2.(RangeElementNode).getBase() = node1 + ) + or + c instanceof CollectionContent and + exists(UnaryOperationNode recv | recv = node2 | + node1 = recv.getOperand() and + recv.getOperator() = "<-" + ) + or + c instanceof MapKeyContent and + node1.getType() instanceof MapType and + node2.(RangeIndexNode).getBase() = node1 + or + c instanceof MapValueContent and + node1.getType() instanceof MapType and + node2.(Read).readsElement(node1, _) +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll new file mode 100644 index 00000000000..019d2831e5d --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowDispatch.qll @@ -0,0 +1,110 @@ +private import go +private import DataFlowPrivate + +/** + * Holds if `call` is an interface call to method `m`, meaning that its receiver `recv` has + * interface type `tp`. + */ +private predicate isInterfaceCallReceiver( + DataFlow::CallNode call, DataFlow::Node recv, InterfaceType tp, string m +) { + call.getReceiver() = recv and + recv.getType().getUnderlyingType() = tp and + m = call.getACalleeIncludingExternals().asFunction().getName() +} + +/** Gets a data-flow node that may flow into the receiver value of `call`, which is an interface value. */ +private DataFlow::Node getInterfaceCallReceiverSource(DataFlow::CallNode call) { + exists(DataFlow::Node succ | basicLocalFlowStep*(result, succ) | + isInterfaceCallReceiver(call, succ, _, _) + ) +} + +/** Gets the type of `nd`, which must be a valid type and not an interface type. */ +private Type getConcreteType(DataFlow::Node nd) { + result = nd.getType() and + not result.getUnderlyingType() instanceof InterfaceType and + not result instanceof InvalidType +} + +/** + * Holds if all concrete (that is, non-interface) types of `nd` concrete types can be determined by + * local reasoning. + * + * `nd` is restricted to nodes that flow into the receiver value of an interface call, since that is + * all we are ultimately interested in. + */ +private predicate isConcreteValue(DataFlow::Node nd) { + nd = getInterfaceCallReceiverSource(_) and + ( + exists(getConcreteType(nd)) + or + forex(DataFlow::Node pred | basicLocalFlowStep(pred, nd) | isConcreteValue(pred)) + ) +} + +/** + * Holds if `call` is an interface call to method `m` with receiver `recv`, where the concrete + * types of `recv` can be established by local reasoning. + */ +private predicate isConcreteInterfaceCall(DataFlow::Node call, DataFlow::Node recv, string m) { + isInterfaceCallReceiver(call, recv, _, m) and isConcreteValue(recv) +} + +/** + * Gets a function that might be called by `call`, where the receiver of `call` has interface type, + * but its concrete types can be determined by local reasoning. + */ +private DataFlowCallable getConcreteTarget(DataFlow::CallNode call) { + exists(DataFlow::Node recv, string m | isConcreteInterfaceCall(call, recv, m) | + exists(Type concreteReceiverType | + concreteReceiverType = getConcreteType(getInterfaceCallReceiverSource(call)) and + result.asFunction() = concreteReceiverType.getMethod(m) + ) + ) +} + +/** + * Holds if `call` is a method call whose receiver has an interface type. + */ +private predicate isInterfaceMethodCall(DataFlow::CallNode call) { + isInterfaceCallReceiver(call, _, _, _) +} + +/** + * Gets a method that might be called by `call`, where we restrict the result to + * implement the interface type of the receiver of `call`. + */ +private DataFlowCallable getRestrictedInterfaceTarget(DataFlow::CallNode call) { + exists(InterfaceType tp, Type recvtp, string m | + isInterfaceCallReceiver(call, _, tp, m) and + result.asFunction() = recvtp.getMethod(m) and + recvtp.implements(tp) + ) +} + +/** + * Gets a function that might be called by `call`. + */ +DataFlowCallable viableCallable(CallExpr ma) { + exists(DataFlow::CallNode call | call.asExpr() = ma | + if isConcreteInterfaceCall(call, _, _) + then result = getConcreteTarget(call) + else + if isInterfaceMethodCall(call) + then result = getRestrictedInterfaceTarget(call) + else result.asCallable() = call.getACalleeIncludingExternals() + ) +} + +/** + * Holds if the set of viable implementations that can be called by `call` + * might be improved by knowing the call context. + */ +predicate mayBenefitFromCallContext(DataFlowCall call, DataFlowCallable f) { none() } + +/** + * Gets a viable dispatch target of `call` in the context `ctx`. This is + * restricted to those `call`s for which a context might make a difference. + */ +DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { none() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll new file mode 100644 index 00000000000..f535bef3231 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -0,0 +1,4697 @@ +/** + * Provides an implementation of global (interprocedural) data flow. This file + * re-exports the local (intraprocedural) data flow analysis from + * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed + * through the `Configuration` class. This file exists in several identical + * copies, allowing queries to use multiple `Configuration` classes that depend + * on each other without introducing mutual recursion among those configurations. + */ + +private import DataFlowImplCommon +private import DataFlowImplSpecific::Private +import DataFlowImplSpecific::Public +import DataFlowImplCommonPublic + +/** + * A configuration of interprocedural data flow analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the global data flow library must define its own unique extension + * of this abstract class. To create a configuration, extend this class with + * a subclass whose characteristic predicate is a unique singleton string. + * For example, write + * + * ```ql + * class MyAnalysisConfiguration extends DataFlow::Configuration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isBarrier`. + * // Optionally override `isAdditionalFlowStep`. + * } + * ``` + * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and + * the edges are those data-flow steps that preserve the value of the node + * along with any additional edges defined by `isAdditionalFlowStep`. + * Specifying nodes in `isBarrier` will remove those nodes from the graph, and + * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going + * and/or out-going edges from those nodes, respectively. + * + * Then, to query whether there is flow between some `source` and `sink`, + * write + * + * ```ql + * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) + * ``` + * + * Multiple configurations can coexist, but two classes extending + * `DataFlow::Configuration` should never depend on each other. One of them + * should instead depend on a `DataFlow2::Configuration`, a + * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. + */ +abstract class Configuration extends string { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant data flow source. + */ + abstract predicate isSource(Node source); + + /** + * Holds if `sink` is a relevant data flow sink. + */ + abstract predicate isSink(Node sink); + + /** + * Holds if data flow through `node` is prohibited. This completely removes + * `node` from the data flow graph. + */ + predicate isBarrier(Node node) { none() } + + /** Holds if data flow into `node` is prohibited. */ + predicate isBarrierIn(Node node) { none() } + + /** Holds if data flow out of `node` is prohibited. */ + predicate isBarrierOut(Node node) { none() } + + /** Holds if data flow through nodes guarded by `guard` is prohibited. */ + predicate isBarrierGuard(BarrierGuard guard) { none() } + + /** + * Holds if the additional flow step from `node1` to `node2` must be taken + * into account in the analysis. + */ + predicate isAdditionalFlowStep(Node node1, Node node2) { none() } + + /** + * Holds if an arbitrary number of implicit read steps of content `c` may be + * taken at `node`. + */ + predicate allowImplicitRead(Node node, Content c) { none() } + + /** + * Gets the virtual dispatch branching limit when calculating field flow. + * This can be overridden to a smaller value to improve performance (a + * value of 0 disables field flow), or a larger value to get more results. + */ + int fieldFlowBranchLimit() { result = 2 } + + /** + * Gets a data flow configuration feature to add restrictions to the set of + * valid flow paths. + * + * - `FeatureHasSourceCallContext`: + * Assume that sources have some existing call context to disallow + * conflicting return-flow directly following the source. + * - `FeatureHasSinkCallContext`: + * Assume that sinks have some existing call context to disallow + * conflicting argument-to-parameter flow directly preceding the sink. + * - `FeatureEqualSourceSinkCallContext`: + * Implies both of the above and additionally ensures that the entire flow + * path preserves the call context. + */ + FlowFeature getAFeature() { none() } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + */ + predicate hasFlow(Node source, Node sink) { flowsTo(source, sink, this) } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + * + * The corresponding paths are generated from the end-points and the graph + * included in the module `PathGraph`. + */ + predicate hasFlowPath(PathNode source, PathNode sink) { flowsTo(source, sink, _, _, this) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowTo(Node sink) { this.hasFlow(_, sink) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } + + /** + * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * measured in approximate number of interprocedural steps. + */ + int explorationLimit() { none() } + + /** + * Holds if there is a partial data flow path from `source` to `node`. The + * approximate distance between `node` and the closest source is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards sink definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sources is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + */ + final predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + partialFlow(source, node, this) and + dist = node.getSourceDistance() + } + + /** + * Holds if there is a partial data flow path from `node` to `sink`. The + * approximate distance between `node` and the closest sink is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards source definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sinks is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + * + * Note that reverse flow has slightly lower precision than the corresponding + * forward flow, as reverse flow disregards type pruning among other features. + */ + final predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + revPartialFlow(node, sink, this) and + dist = node.getSinkDistance() + } +} + +/** + * This class exists to prevent mutual recursion between the user-overridden + * member predicates of `Configuration` and the rest of the data-flow library. + * Good performance cannot be guaranteed in the presence of such recursion, so + * it should be replaced by using more than one copy of the data flow library. + */ +abstract private class ConfigurationRecursionPrevention extends Configuration { + bindingset[this] + ConfigurationRecursionPrevention() { any() } + + override predicate hasFlow(Node source, Node sink) { + strictcount(Node n | this.isSource(n)) < 0 + or + strictcount(Node n | this.isSink(n)) < 0 + or + strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 + or + super.hasFlow(source, sink) + } +} + +private newtype TNodeEx = + TNodeNormal(Node n) or + TNodeImplicitRead(Node n, boolean hasRead) { + any(Configuration c).allowImplicitRead(n, _) and hasRead = [false, true] + } + +private class NodeEx extends TNodeEx { + string toString() { + result = this.asNode().toString() + or + exists(Node n | this.isImplicitReadNode(n, _) | result = n.toString() + " [Ext]") + } + + Node asNode() { this = TNodeNormal(result) } + + predicate isImplicitReadNode(Node n, boolean hasRead) { this = TNodeImplicitRead(n, hasRead) } + + Node projectToNode() { this = TNodeNormal(result) or this = TNodeImplicitRead(result, _) } + + pragma[nomagic] + private DataFlowCallable getEnclosingCallable0() { + nodeEnclosingCallable(this.projectToNode(), result) + } + + pragma[inline] + DataFlowCallable getEnclosingCallable() { + pragma[only_bind_out](this).getEnclosingCallable0() = pragma[only_bind_into](result) + } + + pragma[nomagic] + private DataFlowType getDataFlowType0() { nodeDataFlowType(this.asNode(), result) } + + pragma[inline] + DataFlowType getDataFlowType() { + pragma[only_bind_out](this).getDataFlowType0() = pragma[only_bind_into](result) + } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.projectToNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +private class ArgNodeEx extends NodeEx { + ArgNodeEx() { this.asNode() instanceof ArgNode } +} + +private class ParamNodeEx extends NodeEx { + ParamNodeEx() { this.asNode() instanceof ParamNode } + + predicate isParameterOf(DataFlowCallable c, int i) { + this.asNode().(ParamNode).isParameterOf(c, i) + } + + int getPosition() { this.isParameterOf(_, result) } + + predicate allowParameterReturnInSelf() { allowParameterReturnInSelfCached(this.asNode()) } +} + +private class RetNodeEx extends NodeEx { + RetNodeEx() { this.asNode() instanceof ReturnNodeExt } + + ReturnPosition getReturnPosition() { result = getReturnPosition(this.asNode()) } + + ReturnKindExt getKind() { result = this.asNode().(ReturnNodeExt).getKind() } +} + +private predicate inBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierIn(n) and + config.isSource(n) + ) +} + +private predicate outBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierOut(n) and + config.isSink(n) + ) +} + +pragma[nomagic] +private predicate fullBarrier(NodeEx node, Configuration config) { + exists(Node n | node.asNode() = n | + config.isBarrier(n) + or + config.isBarrierIn(n) and + not config.isSource(n) + or + config.isBarrierOut(n) and + not config.isSink(n) + or + exists(BarrierGuard g | + config.isBarrierGuard(g) and + n = g.getAGuardedNode() + ) + ) +} + +pragma[nomagic] +private predicate sourceNode(NodeEx node, Configuration config) { + config.isSource(node.asNode()) and + not fullBarrier(node, config) +} + +pragma[nomagic] +private predicate sinkNode(NodeEx node, Configuration config) { config.isSink(node.asNode()) } + +/** Provides the relevant barriers for a step from `node1` to `node2`. */ +pragma[inline] +private predicate stepFilter(NodeEx node1, NodeEx node2, Configuration config) { + not outBarrier(node1, config) and + not inBarrier(node2, config) and + not fullBarrier(node1, config) and + not fullBarrier(node2, config) +} + +/** + * Holds if data can flow in one local step from `node1` to `node2`. + */ +private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.asNode() = n and + node2.isImplicitReadNode(n, false) and + not fullBarrier(node1, config) + ) +} + +/** + * Holds if the additional step from `node1` to `node2` does not jump between callables. + */ +private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + pragma[only_bind_into](config) + .isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and + getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.isImplicitReadNode(n, true) and + node2.asNode() = n and + not fullBarrier(node2, config) + ) +} + +/** + * Holds if data can flow from `node1` to `node2` in a way that discards call contexts. + */ +private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +/** + * Holds if the additional step from `node1` to `node2` jumps between callables. + */ +private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + pragma[only_bind_into](config) + .isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and + getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + read(pragma[only_bind_into](n1), c, pragma[only_bind_into](n2)) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + node2.isImplicitReadNode(n, true) and + node1.isImplicitReadNode(n, _) and + config.allowImplicitRead(n, c) + ) +} + +private predicate store( + NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config +) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + store(pragma[only_bind_into](n1), tc, pragma[only_bind_into](n2), contentType) and + read(_, tc.getContent(), _, config) and + stepFilter(node1, node2, config) + ) +} + +pragma[nomagic] +private predicate viableReturnPosOutEx(DataFlowCall call, ReturnPosition pos, NodeEx out) { + viableReturnPosOut(call, pos, out.asNode()) +} + +pragma[nomagic] +private predicate viableParamArgEx(DataFlowCall call, ParamNodeEx p, ArgNodeEx arg) { + viableParamArg(call, p.asNode(), arg.asNode()) +} + +/** + * Holds if field flow should be used for the given configuration. + */ +private predicate useFieldFlow(Configuration config) { config.fieldFlowBranchLimit() >= 1 } + +private predicate hasSourceCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSourceCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate hasSinkCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSinkCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private module Stage1 { + class ApApprox = Unit; + + class Ap = Unit; + + class ApOption = Unit; + + class Cc = boolean; + + /* Begin: Stage 1 logic. */ + /** + * Holds if `node` is reachable from a source in the configuration `config`. + * + * The Boolean `cc` records whether the node is reached through an + * argument in a call. + */ + predicate fwdFlow(NodeEx node, Cc cc, Configuration config) { + sourceNode(node, config) and + if hasSourceCallCtx(config) then cc = true else cc = false + or + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + localFlowStep(mid, node, config) + ) + or + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + additionalLocalFlowStep(mid, node, config) + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, config) and + jumpStep(mid, node, config) and + cc = false + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, config) and + additionalJumpStep(mid, node, config) and + cc = false + ) + or + // store + exists(NodeEx mid | + useFieldFlow(config) and + fwdFlow(mid, cc, config) and + store(mid, _, node, _, config) + ) + or + // read + exists(Content c | + fwdFlowRead(c, node, cc, config) and + fwdFlowConsCand(c, config) + ) + or + // flow into a callable + exists(NodeEx arg | + fwdFlow(arg, _, config) and + viableParamArgEx(_, node, arg) and + cc = true and + not fullBarrier(node, config) + ) + or + // flow out of a callable + exists(DataFlowCall call | + fwdFlowOut(call, node, false, config) and + cc = false + or + fwdFlowOutFromArg(call, node, config) and + fwdFlowIsEntered(call, cc, config) + ) + } + + private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } + + pragma[nomagic] + private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + read(mid, c, node, config) + ) + } + + /** + * Holds if `c` is the target of a store in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node, TypedContent tc | + not fullBarrier(node, config) and + useFieldFlow(config) and + fwdFlow(mid, _, config) and + store(mid, tc, node, _, config) and + c = tc.getContent() + ) + } + + pragma[nomagic] + private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { + exists(RetNodeEx ret | + fwdFlow(ret, cc, config) and + ret.getReturnPosition() = pos + ) + } + + pragma[nomagic] + private predicate fwdFlowOut(DataFlowCall call, NodeEx out, Cc cc, Configuration config) { + exists(ReturnPosition pos | + fwdFlowReturnPosition(pos, cc, config) and + viableReturnPosOutEx(call, pos, out) and + not fullBarrier(out, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg(DataFlowCall call, NodeEx out, Configuration config) { + fwdFlowOut(call, out, true, config) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered(DataFlowCall call, Cc cc, Configuration config) { + exists(ArgNodeEx arg | + fwdFlow(arg, cc, config) and + viableParamArgEx(call, _, arg) + ) + } + + /** + * Holds if `node` is part of a path from a source to a sink in the + * configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from + * the enclosing callable in order to reach a sink. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, Configuration config) { + revFlow0(node, toReturn, config) and + fwdFlow(node, config) + } + + pragma[nomagic] + private predicate revFlow0(NodeEx node, boolean toReturn, Configuration config) { + fwdFlow(node, config) and + sinkNode(node, config) and + if hasSinkCallCtx(config) then toReturn = true else toReturn = false + or + exists(NodeEx mid | + localFlowStep(node, mid, config) and + revFlow(mid, toReturn, config) + ) + or + exists(NodeEx mid | + additionalLocalFlowStep(node, mid, config) and + revFlow(mid, toReturn, config) + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, config) and + toReturn = false + ) + or + exists(NodeEx mid | + additionalJumpStep(node, mid, config) and + revFlow(mid, _, config) and + toReturn = false + ) + or + // store + exists(Content c | + revFlowStore(c, node, toReturn, config) and + revFlowConsCand(c, config) + ) + or + // read + exists(NodeEx mid, Content c | + read(node, c, mid, config) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + revFlow(mid, toReturn, pragma[only_bind_into](config)) + ) + or + // flow into a callable + exists(DataFlowCall call | + revFlowIn(call, node, false, config) and + toReturn = false + or + revFlowInToReturn(call, node, config) and + revFlowIsReturned(call, toReturn, config) + ) + or + // flow out of a callable + exists(ReturnPosition pos | + revFlowOut(pos, config) and + node.(RetNodeEx).getReturnPosition() = pos and + toReturn = true + ) + } + + /** + * Holds if `c` is the target of a read in the flow covered by `revFlow`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node | + fwdFlow(node, pragma[only_bind_into](config)) and + read(node, c, mid, config) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate revFlowStore(Content c, NodeEx node, boolean toReturn, Configuration config) { + exists(NodeEx mid, TypedContent tc | + revFlow(mid, toReturn, pragma[only_bind_into](config)) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + store(node, tc, mid, _, config) and + c = tc.getContent() + ) + } + + /** + * Holds if `c` is the target of both a read and a store in the flow covered + * by `revFlow`. + */ + private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + revFlowConsCand(c, conf) and + revFlowStore(c, _, _, conf) + } + + pragma[nomagic] + predicate viableReturnPosOutNodeCandFwd1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config + ) { + fwdFlowReturnPosition(pos, _, config) and + viableReturnPosOutEx(call, pos, out) + } + + pragma[nomagic] + private predicate revFlowOut(ReturnPosition pos, Configuration config) { + exists(DataFlowCall call, NodeEx out | + revFlow(out, _, config) and + viableReturnPosOutNodeCandFwd1(call, pos, out, config) + ) + } + + pragma[nomagic] + predicate viableParamArgNodeCandFwd1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config + ) { + viableParamArgEx(call, p, arg) and + fwdFlow(arg, config) + } + + pragma[nomagic] + private predicate revFlowIn( + DataFlowCall call, ArgNodeEx arg, boolean toReturn, Configuration config + ) { + exists(ParamNodeEx p | + revFlow(p, toReturn, config) and + viableParamArgNodeCandFwd1(call, p, arg, config) + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn(DataFlowCall call, ArgNodeEx arg, Configuration config) { + revFlowIn(call, arg, true, config) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned(DataFlowCall call, boolean toReturn, Configuration config) { + exists(NodeEx out | + revFlow(out, toReturn, config) and + fwdFlowOutFromArg(call, out, config) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Content c | + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + revFlow(node2, pragma[only_bind_into](config)) and + store(node1, tc, node2, contentType, config) and + c = tc.getContent() and + exists(ap1) + ) + } + + pragma[nomagic] + predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) and + read(n1, c, n2, pragma[only_bind_into](config)) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, config) } + + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow(node, toReturn, config) and exists(returnAp) and exists(ap) + } + + private predicate throughFlowNodeCand(NodeEx node, Configuration config) { + revFlow(node, true, config) and + fwdFlow(node, true, config) and + not inBarrier(node, config) and + not outBarrier(node, config) + } + + /** Holds if flow may return from `callable`. */ + pragma[nomagic] + private predicate returnFlowCallableNodeCand( + DataFlowCallable callable, ReturnKindExt kind, Configuration config + ) { + exists(RetNodeEx ret | + throughFlowNodeCand(ret, config) and + callable = ret.getEnclosingCallable() and + kind = ret.getKind() + ) + } + + /** + * Holds if flow may enter through `p` and reach a return node making `p` a + * candidate for the origin of a summary. + */ + pragma[nomagic] + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(ReturnKindExt kind | + throughFlowNodeCand(p, config) and + returnFlowCallableNodeCand(c, kind, config) and + p.getEnclosingCallable() = c and + exists(ap) and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = p.getPosition() + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(ArgNodeEx arg, boolean toReturn | + revFlow(arg, toReturn, config) and + revFlowInToReturn(call, arg, config) and + revFlowIsReturned(call, toReturn, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, config)) and + fields = count(Content f0 | fwdFlowConsCand(f0, config)) and + conscand = -1 and + tuples = count(NodeEx n, boolean b | fwdFlow(n, b, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, config)) and + fields = count(Content f0 | revFlowConsCand(f0, config)) and + conscand = -1 and + tuples = count(NodeEx n, boolean b | revFlow(n, b, config)) + } + /* End: Stage 1 logic. */ +} + +pragma[noinline] +private predicate localFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + localFlowStep(node1, node2, config) +} + +pragma[noinline] +private predicate additionalLocalFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + additionalLocalFlowStep(node1, node2, config) +} + +pragma[nomagic] +private predicate viableReturnPosOutNodeCand1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config +) { + Stage1::revFlow(out, config) and + Stage1::viableReturnPosOutNodeCandFwd1(call, pos, out, config) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, Configuration config +) { + viableReturnPosOutNodeCand1(call, ret.getReturnPosition(), out, config) and + Stage1::revFlow(ret, config) and + not outBarrier(ret, config) and + not inBarrier(out, config) +} + +pragma[nomagic] +private predicate viableParamArgNodeCand1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config +) { + Stage1::viableParamArgNodeCandFwd1(call, p, arg, config) and + Stage1::revFlow(arg, config) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, Configuration config +) { + viableParamArgNodeCand1(call, p, arg, config) and + Stage1::revFlow(p, config) and + not outBarrier(arg, config) and + not inBarrier(p, config) +} + +/** + * Gets the amount of forward branching on the origin of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int branch(NodeEx n1, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n1, n, conf) or flowIntoCallNodeCand1(_, n1, n, conf) + ) +} + +/** + * Gets the amount of backward branching on the target of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int join(NodeEx n2, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n, n2, conf) or flowIntoCallNodeCand1(_, n, n2, conf) + ) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. The + * `allowsFieldFlow` flag indicates whether the branching is within the limit + * specified by the configuration. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, ret, out, config) and + exists(int b, int j | + b = branch(ret, config) and + j = join(out, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. The `allowsFieldFlow` flag indicates whether + * the branching is within the limit specified by the configuration. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config +) { + flowIntoCallNodeCand1(call, arg, p, config) and + exists(int b, int j | + b = branch(arg, config) and + j = join(p, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +private module Stage2 { + module PrevStage = Stage1; + + class ApApprox = PrevStage::Ap; + + class Ap = boolean; + + class ApNil extends Ap { + ApNil() { this = false } + } + + bindingset[result, ap] + private ApApprox getApprox(Ap ap) { any() } + + private ApNil getApNil(NodeEx node) { PrevStage::revFlow(node, _) and exists(result) } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = true and exists(tc) and exists(tail) } + + pragma[inline] + private Content getHeadContent(Ap ap) { exists(result) and ap = true } + + class ApOption = BooleanOption; + + ApOption apNone() { result = TBooleanNone() } + + ApOption apSome(Ap ap) { result = TBooleanSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSiteDispatch(call, c) + then result = TSpecificCall(call) + else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + ( + preservesValue = true and + localFlowStepNodeCand1(node1, node2, config) + or + preservesValue = false and + additionalLocalFlowStepNodeCand1(node1, node2, config) + ) and + exists(ap) and + exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand1/5; + + private predicate flowIntoCall = flowIntoCallNodeCand1/5; + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { any() } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 2 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 2 logic. */ +} + +pragma[nomagic] +private predicate flowOutOfCallNodeCand2( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlow(node1, pragma[only_bind_into](config)) +} + +pragma[nomagic] +private predicate flowIntoCallNodeCand2( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config +) { + flowIntoCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlow(node1, pragma[only_bind_into](config)) +} + +private module LocalFlowBigStep { + /** + * A node where some checking is required, and hence the big-step relation + * is not allowed to step over. + */ + private class FlowCheckNode extends NodeEx { + FlowCheckNode() { + castNode(this.asNode()) or + clearsContentCached(this.asNode(), _) + } + } + + /** + * Holds if `node` can be the first node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + predicate localFlowEntry(NodeEx node, Configuration config) { + Stage2::revFlow(node, config) and + ( + sourceNode(node, config) or + jumpStep(_, node, config) or + additionalJumpStep(_, node, config) or + node instanceof ParamNodeEx or + node.asNode() instanceof OutNodeExt or + store(_, _, node, _, config) or + read(_, _, node, config) or + node instanceof FlowCheckNode + ) + } + + /** + * Holds if `node` can be the last node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + private predicate localFlowExit(NodeEx node, Configuration config) { + exists(NodeEx next | Stage2::revFlow(next, config) | + jumpStep(node, next, config) or + additionalJumpStep(node, next, config) or + flowIntoCallNodeCand1(_, node, next, config) or + flowOutOfCallNodeCand1(_, node, next, config) or + store(node, _, next, _, config) or + read(node, _, next, config) + ) + or + node instanceof FlowCheckNode + or + sinkNode(node, config) + } + + pragma[noinline] + private predicate additionalLocalFlowStepNodeCand2( + NodeEx node1, NodeEx node2, Configuration config + ) { + additionalLocalFlowStepNodeCand1(node1, node2, config) and + Stage2::revFlow(node1, _, _, false, pragma[only_bind_into](config)) and + Stage2::revFlow(node2, _, _, false, pragma[only_bind_into](config)) + } + + /** + * Holds if the local path from `node1` to `node2` is a prefix of a maximal + * subsequence of local flow steps in a dataflow path. + * + * This is the transitive closure of `[additional]localFlowStep` beginning + * at `localFlowEntry`. + */ + pragma[nomagic] + private predicate localFlowStepPlus( + NodeEx node1, NodeEx node2, boolean preservesValue, DataFlowType t, Configuration config, + LocalCallContext cc + ) { + not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and + ( + localFlowEntry(node1, pragma[only_bind_into](config)) and + ( + localFlowStepNodeCand1(node1, node2, config) and + preservesValue = true and + t = node1.getDataFlowType() // irrelevant dummy value + or + additionalLocalFlowStepNodeCand2(node1, node2, config) and + preservesValue = false and + t = node2.getDataFlowType() + ) and + node1 != node2 and + cc.relevantFor(node1.getEnclosingCallable()) and + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + or + exists(NodeEx mid | + localFlowStepPlus(node1, mid, preservesValue, t, pragma[only_bind_into](config), cc) and + localFlowStepNodeCand1(mid, node2, config) and + not mid instanceof FlowCheckNode and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + ) + or + exists(NodeEx mid | + localFlowStepPlus(node1, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, node2, config) and + not mid instanceof FlowCheckNode and + preservesValue = false and + t = node2.getDataFlowType() and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + ) + ) + } + + /** + * Holds if `node1` can step to `node2` in one or more local steps and this + * path can occur as a maximal subsequence of local steps in a dataflow path. + */ + pragma[nomagic] + predicate localFlowBigStep( + NodeEx node1, NodeEx node2, boolean preservesValue, AccessPathFrontNil apf, + Configuration config, LocalCallContext callContext + ) { + localFlowStepPlus(node1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, config) + } +} + +private import LocalFlowBigStep + +private module Stage3 { + module PrevStage = Stage2; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathFront; + + class ApNil = AccessPathFrontNil; + + private ApApprox getApprox(Ap ap) { result = ap.toBoolNonEmpty() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TFrontNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result.getHead() = tc and exists(tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathFrontOption; + + ApOption apNone() { result = TAccessPathFrontNone() } + + ApOption apSome(Ap ap) { result = TAccessPathFrontSome(ap) } + + class Cc = boolean; + + class CcCall extends Cc { + CcCall() { this = true } + + /** Holds if this call context may be `call`. */ + predicate matchesCall(DataFlowCall call) { any() } + } + + class CcNoCall extends Cc { + CcNoCall() { this = false } + } + + Cc ccNone() { result = false } + + CcCall ccSomeCall() { result = true } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { any() } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, node2, preservesValue, ap, config, _) and exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand2/5; + + private predicate flowIntoCall = flowIntoCallNodeCand2/5; + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + + pragma[nomagic] + private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { + not clear(node, ap) and + if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { + // We need to typecheck stores here, since reverse flow through a getter + // might have a different type here compared to inside the getter. + compatibleTypes(ap.getType(), contentType) + } + + /* Begin: Stage 3 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 3 logic. */ +} + +/** + * Holds if `argApf` is recorded as the summary context for flow reaching `node` + * and remains relevant for the following pruning stage. + */ +private predicate flowCandSummaryCtx(NodeEx node, AccessPathFront argApf, Configuration config) { + exists(AccessPathFront apf | + Stage3::revFlow(node, true, _, apf, config) and + Stage3::fwdFlow(node, any(Stage3::CcCall ccc), TAccessPathFrontSome(argApf), apf, config) + ) +} + +/** + * Holds if a length 2 access path approximation with the head `tc` is expected + * to be expensive. + */ +private predicate expensiveLen2unfolding(TypedContent tc, Configuration config) { + exists(int tails, int nodes, int apLimit, int tupleLimit | + tails = strictcount(AccessPathFront apf | Stage3::consCand(tc, apf, config)) and + nodes = + strictcount(NodeEx n | + Stage3::revFlow(n, _, _, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + or + flowCandSummaryCtx(n, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + ) and + accessPathApproxCostLimits(apLimit, tupleLimit) and + apLimit < tails and + tupleLimit < (tails - 1) * nodes and + not tc.forceHighPrecision() + ) +} + +private newtype TAccessPathApprox = + TNil(DataFlowType t) or + TConsNil(TypedContent tc, DataFlowType t) { + Stage3::consCand(tc, TFrontNil(t), _) and + not expensiveLen2unfolding(tc, _) + } or + TConsCons(TypedContent tc1, TypedContent tc2, int len) { + Stage3::consCand(tc1, TFrontHead(tc2), _) and + len in [2 .. accessPathLimit()] and + not expensiveLen2unfolding(tc1, _) + } or + TCons1(TypedContent tc, int len) { + len in [1 .. accessPathLimit()] and + expensiveLen2unfolding(tc, _) + } + +/** + * Conceptually a list of `TypedContent`s followed by a `DataFlowType`, but only + * the first two elements of the list and its length are tracked. If data flows + * from a source to a given node with a given `AccessPathApprox`, this indicates + * the sequence of dereference operations needed to get from the value in the node + * to the tracked object. The final type indicates the type of the tracked object. + */ +abstract private class AccessPathApprox extends TAccessPathApprox { + abstract string toString(); + + abstract TypedContent getHead(); + + abstract int len(); + + abstract DataFlowType getType(); + + abstract AccessPathFront getFront(); + + /** Gets the access path obtained by popping `head` from this path, if any. */ + abstract AccessPathApprox pop(TypedContent head); +} + +private class AccessPathApproxNil extends AccessPathApprox, TNil { + private DataFlowType t; + + AccessPathApproxNil() { this = TNil(t) } + + override string toString() { result = concat(": " + ppReprType(t)) } + + override TypedContent getHead() { none() } + + override int len() { result = 0 } + + override DataFlowType getType() { result = t } + + override AccessPathFront getFront() { result = TFrontNil(t) } + + override AccessPathApprox pop(TypedContent head) { none() } +} + +abstract private class AccessPathApproxCons extends AccessPathApprox { } + +private class AccessPathApproxConsNil extends AccessPathApproxCons, TConsNil { + private TypedContent tc; + private DataFlowType t; + + AccessPathApproxConsNil() { this = TConsNil(tc, t) } + + override string toString() { + // The `concat` becomes "" if `ppReprType` has no result. + result = "[" + tc.toString() + "]" + concat(" : " + ppReprType(t)) + } + + override TypedContent getHead() { result = tc } + + override int len() { result = 1 } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { head = tc and result = TNil(t) } +} + +private class AccessPathApproxConsCons extends AccessPathApproxCons, TConsCons { + private TypedContent tc1; + private TypedContent tc2; + private int len; + + AccessPathApproxConsCons() { this = TConsCons(tc1, tc2, len) } + + override string toString() { + if len = 2 + then result = "[" + tc1.toString() + ", " + tc2.toString() + "]" + else result = "[" + tc1.toString() + ", " + tc2.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc1 } + + override int len() { result = len } + + override DataFlowType getType() { result = tc1.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc1) } + + override AccessPathApprox pop(TypedContent head) { + head = tc1 and + ( + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + } +} + +private class AccessPathApproxCons1 extends AccessPathApproxCons, TCons1 { + private TypedContent tc; + private int len; + + AccessPathApproxCons1() { this = TCons1(tc, len) } + + override string toString() { + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc } + + override int len() { result = len } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { + head = tc and + ( + exists(TypedContent tc2 | Stage3::consCand(tc, TFrontHead(tc2), _) | + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + or + exists(DataFlowType t | + len = 1 and + Stage3::consCand(tc, TFrontNil(t), _) and + result = TNil(t) + ) + ) + } +} + +/** Gets the access path obtained by popping `tc` from `ap`, if any. */ +private AccessPathApprox pop(TypedContent tc, AccessPathApprox apa) { result = apa.pop(tc) } + +/** Gets the access path obtained by pushing `tc` onto `ap`. */ +private AccessPathApprox push(TypedContent tc, AccessPathApprox apa) { apa = pop(tc, result) } + +private newtype TAccessPathApproxOption = + TAccessPathApproxNone() or + TAccessPathApproxSome(AccessPathApprox apa) + +private class AccessPathApproxOption extends TAccessPathApproxOption { + string toString() { + this = TAccessPathApproxNone() and result = "" + or + this = TAccessPathApproxSome(any(AccessPathApprox apa | result = apa.toString())) + } +} + +private module Stage4 { + module PrevStage = Stage3; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathApprox; + + class ApNil = AccessPathApproxNil; + + private ApApprox getApprox(Ap ap) { result = ap.getFront() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = push(tc, tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathApproxOption; + + ApOption apNone() { result = TAccessPathApproxNone() } + + ApOption apSome(Ap ap) { result = TAccessPathApproxSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = LocalCallContext; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSite(call, c) then result = TSpecificCall(call) else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { + localFlowEntry(node, config) and + result = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + node.getEnclosingCallable()) + } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, node2, preservesValue, ap.getFront(), config, lcc) + } + + pragma[nomagic] + private predicate flowOutOfCall( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config + ) { + flowOutOfCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, _, _, _, pragma[only_bind_into](config)) and + PrevStage::revFlow(node1, _, _, _, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate flowIntoCall( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config + ) { + flowIntoCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, _, _, _, pragma[only_bind_into](config)) and + PrevStage::revFlow(node1, _, _, _, pragma[only_bind_into](config)) + } + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { any() } + + // Type checking is not necessary here as it has already been done in stage 3. + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 4 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 4 logic. */ +} + +bindingset[conf, result] +private Configuration unbindConf(Configuration conf) { + exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) +} + +private predicate nodeMayUseSummary(NodeEx n, AccessPathApprox apa, Configuration config) { + exists(DataFlowCallable c, AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, apa, _) and + Stage4::revFlow(n, true, _, apa0, config) and + Stage4::fwdFlow(n, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and + n.getEnclosingCallable() = c + ) +} + +private newtype TSummaryCtx = + TSummaryCtxNone() or + TSummaryCtxSome(ParamNodeEx p, AccessPath ap) { + Stage4::parameterMayFlowThrough(p, _, ap.getApprox(), _) + } + +/** + * A context for generating flow summaries. This represents flow entry through + * a specific parameter with an access path of a specific shape. + * + * Summaries are only created for parameters that may flow through. + */ +abstract private class SummaryCtx extends TSummaryCtx { + abstract string toString(); +} + +/** A summary context from which no flow summary can be generated. */ +private class SummaryCtxNone extends SummaryCtx, TSummaryCtxNone { + override string toString() { result = "" } +} + +/** A summary context from which a flow summary can be generated. */ +private class SummaryCtxSome extends SummaryCtx, TSummaryCtxSome { + private ParamNodeEx p; + private AccessPath ap; + + SummaryCtxSome() { this = TSummaryCtxSome(p, ap) } + + int getParameterPos() { p.isParameterOf(_, result) } + + ParamNodeEx getParamNode() { result = p } + + override string toString() { result = p + ": " + ap } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + p.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * Gets the number of length 2 access path approximations that correspond to `apa`. + */ +private int count1to2unfold(AccessPathApproxCons1 apa, Configuration config) { + exists(TypedContent tc, int len | + tc = apa.getHead() and + len = apa.len() and + result = + strictcount(AccessPathFront apf | + Stage4::consCand(tc, any(AccessPathApprox ap | ap.getFront() = apf and ap.len() = len - 1), + config) + ) + ) +} + +private int countNodesUsingAccessPath(AccessPathApprox apa, Configuration config) { + result = + strictcount(NodeEx n | + Stage4::revFlow(n, _, _, apa, config) or nodeMayUseSummary(n, apa, config) + ) +} + +/** + * Holds if a length 2 access path approximation matching `apa` is expected + * to be expensive. + */ +private predicate expensiveLen1to2unfolding(AccessPathApproxCons1 apa, Configuration config) { + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = count1to2unfold(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + apLimit < aps and + tupleLimit < (aps - 1) * nodes + ) +} + +private AccessPathApprox getATail(AccessPathApprox apa, Configuration config) { + exists(TypedContent head | + apa.pop(head) = result and + Stage4::consCand(head, result, config) + ) +} + +/** + * Holds with `unfold = false` if a precise head-tail representation of `apa` is + * expected to be expensive. Holds with `unfold = true` otherwise. + */ +private predicate evalUnfold(AccessPathApprox apa, boolean unfold, Configuration config) { + if apa.getHead().forceHighPrecision() + then unfold = true + else + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = countPotentialAps(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + if apLimit < aps and tupleLimit < (aps - 1) * nodes then unfold = false else unfold = true + ) +} + +/** + * Gets the number of `AccessPath`s that correspond to `apa`. + */ +private int countAps(AccessPathApprox apa, Configuration config) { + evalUnfold(apa, false, config) and + result = 1 and + (not apa instanceof AccessPathApproxCons1 or expensiveLen1to2unfolding(apa, config)) + or + evalUnfold(apa, false, config) and + result = count1to2unfold(apa, config) and + not expensiveLen1to2unfolding(apa, config) + or + evalUnfold(apa, true, config) and + result = countPotentialAps(apa, config) +} + +/** + * Gets the number of `AccessPath`s that would correspond to `apa` assuming + * that it is expanded to a precise head-tail representation. + */ +language[monotonicAggregates] +private int countPotentialAps(AccessPathApprox apa, Configuration config) { + apa instanceof AccessPathApproxNil and result = 1 + or + result = strictsum(AccessPathApprox tail | tail = getATail(apa, config) | countAps(tail, config)) +} + +private newtype TAccessPath = + TAccessPathNil(DataFlowType t) or + TAccessPathCons(TypedContent head, AccessPath tail) { + exists(AccessPathApproxCons apa | + not evalUnfold(apa, false, _) and + head = apa.getHead() and + tail.getApprox() = getATail(apa, _) + ) + } or + TAccessPathCons2(TypedContent head1, TypedContent head2, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + not expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head1 = apa.getHead() and + head2 = getATail(apa, _).getHead() + ) + } or + TAccessPathCons1(TypedContent head, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head = apa.getHead() + ) + } + +private newtype TPathNode = + TPathNodeMid(NodeEx node, CallContext cc, SummaryCtx sc, AccessPath ap, Configuration config) { + // A PathNode is introduced by a source ... + Stage4::revFlow(node, config) and + sourceNode(node, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap = TAccessPathNil(node.getDataFlowType()) + or + // ... or a step from an existing PathNode to another node. + exists(PathNodeMid mid | + pathStep(mid, node, cc, sc, ap) and + pragma[only_bind_into](config) = mid.getConfiguration() and + Stage4::revFlow(node, _, _, ap.getApprox(), pragma[only_bind_into](config)) + ) + } or + TPathNodeSink(NodeEx node, Configuration config) { + exists(PathNodeMid sink | + sink.isAtSink() and + node = sink.getNodeEx() and + config = sink.getConfiguration() + ) + } + +/** + * A list of `TypedContent`s followed by a `DataFlowType`. If data flows from a + * source to a given node with a given `AccessPath`, this indicates the sequence + * of dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ +abstract private class AccessPath extends TAccessPath { + /** Gets the head of this access path, if any. */ + abstract TypedContent getHead(); + + /** Gets the tail of this access path, if any. */ + abstract AccessPath getTail(); + + /** Gets the front of this access path. */ + abstract AccessPathFront getFront(); + + /** Gets the approximation of this access path. */ + abstract AccessPathApprox getApprox(); + + /** Gets the length of this access path. */ + abstract int length(); + + /** Gets a textual representation of this access path. */ + abstract string toString(); + + /** Gets the access path obtained by popping `tc` from this access path, if any. */ + final AccessPath pop(TypedContent tc) { + result = this.getTail() and + tc = this.getHead() + } + + /** Gets the access path obtained by pushing `tc` onto this access path. */ + final AccessPath push(TypedContent tc) { this = result.pop(tc) } +} + +private class AccessPathNil extends AccessPath, TAccessPathNil { + private DataFlowType t; + + AccessPathNil() { this = TAccessPathNil(t) } + + DataFlowType getType() { result = t } + + override TypedContent getHead() { none() } + + override AccessPath getTail() { none() } + + override AccessPathFrontNil getFront() { result = TFrontNil(t) } + + override AccessPathApproxNil getApprox() { result = TNil(t) } + + override int length() { result = 0 } + + override string toString() { result = concat(": " + ppReprType(t)) } +} + +private class AccessPathCons extends AccessPath, TAccessPathCons { + private TypedContent head; + private AccessPath tail; + + AccessPathCons() { this = TAccessPathCons(head, tail) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { result = tail } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { + result = TConsNil(head, tail.(AccessPathNil).getType()) + or + result = TConsCons(head, tail.getHead(), this.length()) + or + result = TCons1(head, this.length()) + } + + override int length() { result = 1 + tail.length() } + + private string toStringImpl(boolean needsSuffix) { + exists(DataFlowType t | + tail = TAccessPathNil(t) and + needsSuffix = false and + result = head.toString() + "]" + concat(" : " + ppReprType(t)) + ) + or + result = head + ", " + tail.(AccessPathCons).toStringImpl(needsSuffix) + or + exists(TypedContent tc2, TypedContent tc3, int len | tail = TAccessPathCons2(tc2, tc3, len) | + result = head + ", " + tc2 + ", " + tc3 + ", ... (" and len > 2 and needsSuffix = true + or + result = head + ", " + tc2 + ", " + tc3 + "]" and len = 2 and needsSuffix = false + ) + or + exists(TypedContent tc2, int len | tail = TAccessPathCons1(tc2, len) | + result = head + ", " + tc2 + ", ... (" and len > 1 and needsSuffix = true + or + result = head + ", " + tc2 + "]" and len = 1 and needsSuffix = false + ) + } + + override string toString() { + result = "[" + this.toStringImpl(true) + this.length().toString() + ")]" + or + result = "[" + this.toStringImpl(false) + } +} + +private class AccessPathCons2 extends AccessPath, TAccessPathCons2 { + private TypedContent head1; + private TypedContent head2; + private int len; + + AccessPathCons2() { this = TAccessPathCons2(head1, head2, len) } + + override TypedContent getHead() { result = head1 } + + override AccessPath getTail() { + Stage4::consCand(head1, result.getApprox(), _) and + result.getHead() = head2 and + result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head1) } + + override AccessPathApproxCons getApprox() { + result = TConsCons(head1, head2, len) or + result = TCons1(head1, len) + } + + override int length() { result = len } + + override string toString() { + if len = 2 + then result = "[" + head1.toString() + ", " + head2.toString() + "]" + else + result = "[" + head1.toString() + ", " + head2.toString() + ", ... (" + len.toString() + ")]" + } +} + +private class AccessPathCons1 extends AccessPath, TAccessPathCons1 { + private TypedContent head; + private int len; + + AccessPathCons1() { this = TAccessPathCons1(head, len) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { + Stage4::consCand(head, result.getApprox(), _) and result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { result = TCons1(head, len) } + + override int length() { result = len } + + override string toString() { + if len = 1 + then result = "[" + head.toString() + "]" + else result = "[" + head.toString() + ", ... (" + len.toString() + ")]" + } +} + +/** + * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. + * Only those `PathNode`s that are reachable from a source are generated. + */ +class PathNode extends TPathNode { + /** Gets a textual representation of this element. */ + string toString() { none() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { none() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + none() + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.(PathNodeImpl).getNodeEx().projectToNode() = result } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + private PathNode getASuccessorIfHidden() { + this.(PathNodeImpl).isHidden() and + result = this.(PathNodeImpl).getASuccessorImpl() + } + + /** Gets a successor of this node, if any. */ + final PathNode getASuccessor() { + result = this.(PathNodeImpl).getASuccessorImpl().getASuccessorIfHidden*() and + not this.(PathNodeImpl).isHidden() and + not result.(PathNodeImpl).isHidden() + } + + /** Holds if this node is a source. */ + predicate isSource() { none() } +} + +abstract private class PathNodeImpl extends PathNode { + abstract PathNode getASuccessorImpl(); + + abstract NodeEx getNodeEx(); + + predicate isHidden() { + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + } + + private string ppAp() { + this instanceof PathNodeSink and result = "" + or + exists(string s | s = this.(PathNodeMid).getAp().toString() | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + this instanceof PathNodeSink and result = "" + or + result = " <" + this.(PathNodeMid).getCallContext().toString() + ">" + } + + override string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + override string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** Holds if `n` can reach a sink. */ +private predicate directReach(PathNode n) { + n instanceof PathNodeSink or directReach(n.getASuccessor()) +} + +/** Holds if `n` can reach a sink or is used in a subpath. */ +private predicate reach(PathNode n) { directReach(n) or Subpaths::retReach(n) } + +/** Holds if `n1.getASuccessor() = n2` and `n2` can reach a sink. */ +private predicate pathSucc(PathNode n1, PathNode n2) { n1.getASuccessor() = n2 and directReach(n2) } + +private predicate pathSuccPlus(PathNode n1, PathNode n2) = fastTC(pathSucc/2)(n1, n2) + +/** + * Provides the query predicates needed to include a graph in a path-problem query. + */ +module PathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PathNode a, PathNode b) { a.getASuccessor() = b and reach(b) } + + /** Holds if `n` is a node in the graph of data flow path explanations. */ + query predicate nodes(PathNode n, string key, string val) { + reach(n) and key = "semmle.label" and val = n.toString() + } + + query predicate subpaths = Subpaths::subpaths/4; +} + +/** + * An intermediate flow graph node. This is a triple consisting of a `Node`, + * a `CallContext`, and a `Configuration`. + */ +private class PathNodeMid extends PathNodeImpl, TPathNodeMid { + NodeEx node; + CallContext cc; + SummaryCtx sc; + AccessPath ap; + Configuration config; + + PathNodeMid() { this = TPathNodeMid(node, cc, sc, ap, config) } + + override NodeEx getNodeEx() { result = node } + + CallContext getCallContext() { result = cc } + + SummaryCtx getSummaryCtx() { result = sc } + + AccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + private PathNodeMid getSuccMid() { + pathStep(this, result.getNodeEx(), result.getCallContext(), result.getSummaryCtx(), + result.getAp()) and + result.getConfiguration() = unbindConf(this.getConfiguration()) + } + + override PathNodeImpl getASuccessorImpl() { + // an intermediate step to another intermediate node + result = this.getSuccMid() + or + // a final step to a sink + result = this.getSuccMid().projectToSink() + } + + override predicate isSource() { + sourceNode(node, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap instanceof AccessPathNil + } + + predicate isAtSink() { + sinkNode(node, config) and + ap instanceof AccessPathNil and + if hasSinkCallCtx(config) + then + // For `FeatureHasSinkCallContext` the condition `cc instanceof CallContextNoCall` + // is exactly what we need to check. This also implies + // `sc instanceof SummaryCtxNone`. + // For `FeatureEqualSourceSinkCallContext` the initial call context was + // set to `CallContextSomeCall` and jumps are disallowed, so + // `cc instanceof CallContextNoCall` never holds. On the other hand, + // in this case there's never any need to enter a call except to identify + // a summary, so the condition in `pathIntoCallable` enforces this, which + // means that `sc instanceof SummaryCtxNone` holds if and only if we are + // in the call context of the source. + sc instanceof SummaryCtxNone or + cc instanceof CallContextNoCall + else any() + } + + PathNodeSink projectToSink() { + this.isAtSink() and + result.getNodeEx() = node and + result.getConfiguration() = unbindConf(config) + } +} + +/** + * A flow graph node corresponding to a sink. This is disjoint from the + * intermediate nodes in order to uniquely correspond to a given sink by + * excluding the `CallContext`. + */ +private class PathNodeSink extends PathNodeImpl, TPathNodeSink { + NodeEx node; + Configuration config; + + PathNodeSink() { this = TPathNodeSink(node, config) } + + override NodeEx getNodeEx() { result = node } + + override Configuration getConfiguration() { result = config } + + override PathNode getASuccessorImpl() { none() } + + override predicate isSource() { sourceNode(node, config) } +} + +/** + * Holds if data may flow from `mid` to `node`. The last step in or out of + * a callable is recorded by `cc`. + */ +private predicate pathStep( + PathNodeMid mid, NodeEx node, CallContext cc, SummaryCtx sc, AccessPath ap +) { + exists(AccessPath ap0, NodeEx midnode, Configuration conf, LocalCallContext localCC | + midnode = mid.getNodeEx() and + conf = mid.getConfiguration() and + cc = mid.getCallContext() and + sc = mid.getSummaryCtx() and + localCC = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + midnode.getEnclosingCallable()) and + ap0 = mid.getAp() + | + localFlowBigStep(midnode, node, true, _, conf, localCC) and + ap = ap0 + or + localFlowBigStep(midnode, node, false, ap.getFront(), conf, localCC) and + ap0 instanceof AccessPathNil + ) + or + jumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + ap = mid.getAp() + or + additionalJumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + mid.getAp() instanceof AccessPathNil and + ap = TAccessPathNil(node.getDataFlowType()) + or + exists(TypedContent tc | pathStoreStep(mid, node, ap.pop(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + exists(TypedContent tc | pathReadStep(mid, node, ap.push(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + pathIntoCallable(mid, node, _, cc, sc, _, _) and ap = mid.getAp() + or + pathOutOfCallable(mid, node, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone + or + pathThroughCallable(mid, node, cc, ap) and sc = mid.getSummaryCtx() +} + +pragma[nomagic] +private predicate pathReadStep( + PathNodeMid mid, NodeEx node, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + tc = ap0.getHead() and + Stage4::readStepCand(mid.getNodeEx(), tc.getContent(), node, mid.getConfiguration()) and + cc = mid.getCallContext() +} + +pragma[nomagic] +private predicate pathStoreStep( + PathNodeMid mid, NodeEx node, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + Stage4::storeStepCand(mid.getNodeEx(), _, tc, node, _, mid.getConfiguration()) and + cc = mid.getCallContext() +} + +private predicate pathOutOfCallable0( + PathNodeMid mid, ReturnPosition pos, CallContext innercc, AccessPathApprox apa, + Configuration config +) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + apa = mid.getAp().getApprox() and + config = mid.getConfiguration() +} + +pragma[nomagic] +private predicate pathOutOfCallable1( + PathNodeMid mid, DataFlowCall call, ReturnKindExt kind, CallContext cc, AccessPathApprox apa, + Configuration config +) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + pathOutOfCallable0(mid, pos, innercc, apa, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) +} + +pragma[noinline] +private NodeEx getAnOutNodeFlow( + ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config +) { + result.asNode() = kind.getAnOutNode(call) and + Stage4::revFlow(result, _, _, apa, config) +} + +/** + * Holds if data may flow from `mid` to `out`. The last step of this path + * is a return from a callable and is recorded by `cc`, if needed. + */ +pragma[noinline] +private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, CallContext cc) { + exists(ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config | + pathOutOfCallable1(mid, call, kind, cc, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` to the `i`th argument of `call` in `cc`. + */ +pragma[noinline] +private predicate pathIntoArg( + PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa, + Configuration config +) { + exists(ArgNode arg | + arg = mid.getNodeEx().asNode() and + cc = mid.getCallContext() and + arg.argumentOf(call, i) and + ap = mid.getAp() and + apa = ap.getApprox() and + config = mid.getConfiguration() + ) +} + +pragma[nomagic] +private predicate parameterCand( + DataFlowCallable callable, int i, AccessPathApprox apa, Configuration config +) { + exists(ParamNodeEx p | + Stage4::revFlow(p, _, _, apa, config) and + p.isParameterOf(callable, i) + ) +} + +pragma[nomagic] +private predicate pathIntoCallable0( + PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call, + AccessPath ap, Configuration config +) { + exists(AccessPathApprox apa | + pathIntoArg(mid, pragma[only_bind_into](i), outercc, call, ap, pragma[only_bind_into](apa), + pragma[only_bind_into](config)) and + callable = resolveCall(call, outercc) and + parameterCand(callable, pragma[only_bind_into](i), pragma[only_bind_into](apa), + pragma[only_bind_into](config)) + ) +} + +/** + * Holds if data may flow from `mid` to `p` through `call`. The contexts + * before and after entering the callable are `outercc` and `innercc`, + * respectively. + */ +pragma[nomagic] +private predicate pathIntoCallable( + PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc, + DataFlowCall call, Configuration config +) { + exists(int i, DataFlowCallable callable, AccessPath ap | + pathIntoCallable0(mid, callable, i, outercc, call, ap, config) and + p.isParameterOf(callable, i) and + ( + sc = TSummaryCtxSome(p, ap) + or + not exists(TSummaryCtxSome(p, ap)) and + sc = TSummaryCtxNone() and + // When the call contexts of source and sink needs to match then there's + // never any reason to enter a callable except to find a summary. See also + // the comment in `PathNodeMid::isAtSink`. + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) +} + +/** Holds if data may flow from a parameter given by `sc` to a return of kind `kind`. */ +pragma[nomagic] +private predicate paramFlowsThrough( + ReturnKindExt kind, CallContextCall cc, SummaryCtxSome sc, AccessPath ap, AccessPathApprox apa, + Configuration config +) { + exists(PathNodeMid mid, RetNodeEx ret, int pos | + mid.getNodeEx() = ret and + kind = ret.getKind() and + cc = mid.getCallContext() and + sc = mid.getSummaryCtx() and + config = mid.getConfiguration() and + ap = mid.getAp() and + apa = ap.getApprox() and + pos = sc.getParameterPos() and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + sc.getParamNode().allowParameterReturnInSelf() + ) + ) +} + +pragma[nomagic] +private predicate pathThroughCallable0( + DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap, + AccessPathApprox apa, Configuration config +) { + exists(CallContext innercc, SummaryCtx sc | + pathIntoCallable(mid, _, cc, innercc, sc, call, config) and + paramFlowsThrough(kind, innercc, sc, ap, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` through a callable to the node `out`. + * The context `cc` is restored to its value prior to entering the callable. + */ +pragma[noinline] +private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) { + exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config | + pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +private module Subpaths { + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths01( + PathNodeImpl arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, AccessPath apout + ) { + exists(Configuration config | + pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and + pathIntoCallable(arg, par, _, innercc, sc, _, config) and + paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config)) and + not arg.isHidden() + ) + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths02( + PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, AccessPath apout + ) { + subpaths01(arg, par, sc, innercc, kind, out, apout) and + out.asNode() = kind.getAnOutNode(_) + } + + pragma[nomagic] + private Configuration getPathNodeConf(PathNode n) { result = n.getConfiguration() } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple. + */ + pragma[nomagic] + private predicate subpaths03( + PathNode arg, ParamNodeEx par, PathNodeMid ret, NodeEx out, AccessPath apout + ) { + exists(SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, RetNodeEx retnode | + subpaths02(arg, par, sc, innercc, kind, out, apout) and + ret.getNodeEx() = retnode and + kind = retnode.getKind() and + innercc = ret.getCallContext() and + sc = ret.getSummaryCtx() and + ret.getConfiguration() = unbindConf(getPathNodeConf(arg)) and + apout = ret.getAp() + ) + } + + private PathNodeImpl localStepToHidden(PathNodeImpl n) { + n.getASuccessorImpl() = result and + result.isHidden() and + exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | + localFlowBigStep(n1, n2, _, _, _, _) or + store(n1, _, n2, _, _) or + read(n1, _, n2, _) + ) + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through + * a subpath between `par` and `ret` with the connecting edges `arg -> par` and + * `ret -> out` is summarized as the edge `arg -> out`. + */ + predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNodeMid out) { + exists(ParamNodeEx p, NodeEx o, AccessPath apout | + pragma[only_bind_into](arg).getASuccessor() = par and + pragma[only_bind_into](arg).getASuccessor() = out and + subpaths03(arg, p, localStepToHidden*(ret), o, apout) and + not ret.isHidden() and + par.getNodeEx() = p and + out.getNodeEx() = o and + out.getAp() = apout + ) + } + + /** + * Holds if `n` can reach a return node in a summarized subpath. + */ + predicate retReach(PathNode n) { + subpaths(_, _, n, _) + or + exists(PathNode mid | + retReach(mid) and + n.getASuccessor() = mid and + not subpaths(_, mid, _, _) + ) + } +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +private predicate flowsTo( + PathNode flowsource, PathNodeSink flowsink, Node source, Node sink, Configuration configuration +) { + flowsource.isSource() and + flowsource.getConfiguration() = configuration and + flowsource.(PathNodeImpl).getNodeEx().asNode() = source and + (flowsource = flowsink or pathSuccPlus(flowsource, flowsink)) and + flowsink.getNodeEx().asNode() = sink +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +predicate flowsTo(Node source, Node sink, Configuration configuration) { + flowsTo(_, _, source, sink, configuration) +} + +private predicate finalStats(boolean fwd, int nodes, int fields, int conscand, int tuples) { + fwd = true and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0)) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0)) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap)) and + tuples = count(PathNode pn) + or + fwd = false and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0 and reach(pn))) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0 and reach(pn))) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap and reach(pn))) and + tuples = count(PathNode pn | reach(pn)) +} + +/** + * INTERNAL: Only for debugging. + * + * Calculates per-stage metrics for data flow. + */ +predicate stageStats( + int n, string stage, int nodes, int fields, int conscand, int tuples, Configuration config +) { + stage = "1 Fwd" and n = 10 and Stage1::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "1 Rev" and n = 15 and Stage1::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "2 Fwd" and n = 20 and Stage2::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "2 Rev" and n = 25 and Stage2::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "3 Fwd" and n = 30 and Stage3::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "3 Rev" and n = 35 and Stage3::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "4 Fwd" and n = 40 and Stage4::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "4 Rev" and n = 45 and Stage4::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "5 Fwd" and n = 50 and finalStats(true, nodes, fields, conscand, tuples) + or + stage = "5 Rev" and n = 55 and finalStats(false, nodes, fields, conscand, tuples) +} + +private module FlowExploration { + private predicate callableStep(DataFlowCallable c1, DataFlowCallable c2, Configuration config) { + exists(NodeEx node1, NodeEx node2 | + jumpStep(node1, node2, config) + or + additionalJumpStep(node1, node2, config) + or + // flow into callable + viableParamArgEx(_, node2, node1) + or + // flow out of a callable + viableReturnPosOutEx(_, node1.(RetNodeEx).getReturnPosition(), node2) + | + c1 = node1.getEnclosingCallable() and + c2 = node2.getEnclosingCallable() and + c1 != c2 + ) + } + + private predicate interestingCallableSrc(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSource(n) and c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSrc(mid, config) and callableStep(mid, c, config) + ) + } + + private predicate interestingCallableSink(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSink(n) and c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSink(mid, config) and callableStep(c, mid, config) + ) + } + + private newtype TCallableExt = + TCallable(DataFlowCallable c, Configuration config) { + interestingCallableSrc(c, config) or + interestingCallableSink(c, config) + } or + TCallableSrc() or + TCallableSink() + + private predicate callableExtSrc(TCallableSrc src) { any() } + + private predicate callableExtSink(TCallableSink sink) { any() } + + private predicate callableExtStepFwd(TCallableExt ce1, TCallableExt ce2) { + exists(DataFlowCallable c1, DataFlowCallable c2, Configuration config | + callableStep(c1, c2, config) and + ce1 = TCallable(c1, pragma[only_bind_into](config)) and + ce2 = TCallable(c2, pragma[only_bind_into](config)) + ) + or + exists(Node n, Configuration config | + ce1 = TCallableSrc() and + config.isSource(n) and + ce2 = TCallable(getNodeEnclosingCallable(n), config) + ) + or + exists(Node n, Configuration config | + ce2 = TCallableSink() and + config.isSink(n) and + ce1 = TCallable(getNodeEnclosingCallable(n), config) + ) + } + + private predicate callableExtStepRev(TCallableExt ce1, TCallableExt ce2) { + callableExtStepFwd(ce2, ce1) + } + + private int distSrcExt(TCallableExt c) = + shortestDistances(callableExtSrc/1, callableExtStepFwd/2)(_, c, result) + + private int distSinkExt(TCallableExt c) = + shortestDistances(callableExtSink/1, callableExtStepRev/2)(_, c, result) + + private int distSrc(DataFlowCallable c, Configuration config) { + result = distSrcExt(TCallable(c, config)) - 1 + } + + private int distSink(DataFlowCallable c, Configuration config) { + result = distSinkExt(TCallable(c, config)) - 1 + } + + private newtype TPartialAccessPath = + TPartialNil(DataFlowType t) or + TPartialCons(TypedContent tc, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `TypedContent`s followed by a `Type`, but only the first + * element of the list and its length are tracked. If data flows from a source to + * a given node with a given `AccessPath`, this indicates the sequence of + * dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ + private class PartialAccessPath extends TPartialAccessPath { + abstract string toString(); + + TypedContent getHead() { this = TPartialCons(result, _) } + + int len() { + this = TPartialNil(_) and result = 0 + or + this = TPartialCons(_, result) + } + + DataFlowType getType() { + this = TPartialNil(result) + or + exists(TypedContent head | this = TPartialCons(head, _) | result = head.getContainerType()) + } + } + + private class PartialAccessPathNil extends PartialAccessPath, TPartialNil { + override string toString() { + exists(DataFlowType t | this = TPartialNil(t) | result = concat(": " + ppReprType(t))) + } + } + + private class PartialAccessPathCons extends PartialAccessPath, TPartialCons { + override string toString() { + exists(TypedContent tc, int len | this = TPartialCons(tc, len) | + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private newtype TRevPartialAccessPath = + TRevPartialNil() or + TRevPartialCons(Content c, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `Content`s, but only the first + * element of the list and its length are tracked. + */ + private class RevPartialAccessPath extends TRevPartialAccessPath { + abstract string toString(); + + Content getHead() { this = TRevPartialCons(result, _) } + + int len() { + this = TRevPartialNil() and result = 0 + or + this = TRevPartialCons(_, result) + } + } + + private class RevPartialAccessPathNil extends RevPartialAccessPath, TRevPartialNil { + override string toString() { result = "" } + } + + private class RevPartialAccessPathCons extends RevPartialAccessPath, TRevPartialCons { + override string toString() { + exists(Content c, int len | this = TRevPartialCons(c, len) | + if len = 1 + then result = "[" + c.toString() + "]" + else result = "[" + c.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private newtype TSummaryCtx1 = + TSummaryCtx1None() or + TSummaryCtx1Param(ParamNodeEx p) + + private newtype TSummaryCtx2 = + TSummaryCtx2None() or + TSummaryCtx2Some(PartialAccessPath ap) + + private newtype TRevSummaryCtx1 = + TRevSummaryCtx1None() or + TRevSummaryCtx1Some(ReturnPosition pos) + + private newtype TRevSummaryCtx2 = + TRevSummaryCtx2None() or + TRevSummaryCtx2Some(RevPartialAccessPath ap) + + private newtype TPartialPathNode = + TPartialPathNodeFwd( + NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, PartialAccessPath ap, + Configuration config + ) { + sourceNode(node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap = TPartialNil(node.getDataFlowType()) and + not fullBarrier(node, config) and + exists(config.explorationLimit()) + or + partialPathNodeMk0(node, cc, sc1, sc2, ap, config) and + distSrc(node.getEnclosingCallable(), config) <= config.explorationLimit() + } or + TPartialPathNodeRev( + NodeEx node, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, RevPartialAccessPath ap, + Configuration config + ) { + sinkNode(node, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = TRevPartialNil() and + not fullBarrier(node, config) and + exists(config.explorationLimit()) + or + exists(PartialPathNodeRev mid | + revPartialPathStep(mid, node, sc1, sc2, ap, config) and + not clearsContentCached(node.asNode(), ap.getHead()) and + not fullBarrier(node, config) and + distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() + ) + } + + pragma[nomagic] + private predicate partialPathNodeMk0( + NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, PartialAccessPath ap, + Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStep(mid, node, cc, sc1, sc2, ap, config) and + not fullBarrier(node, config) and + not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + if node.asNode() instanceof CastingNode + then compatibleTypes(node.getDataFlowType(), ap.getType()) + else any() + ) + } + + /** + * A `Node` augmented with a call context, an access path, and a configuration. + */ + class PartialPathNode extends TPartialPathNode { + /** Gets a textual representation of this element. */ + string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.getNodeEx().projectToNode() = result } + + private NodeEx getNodeEx() { + result = this.(PartialPathNodeFwd).getNodeEx() or + result = this.(PartialPathNodeRev).getNodeEx() + } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + /** Gets a successor of this node, if any. */ + PartialPathNode getASuccessor() { none() } + + /** + * Gets the approximate distance to the nearest source measured in number + * of interprocedural steps. + */ + int getSourceDistance() { + result = distSrc(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + /** + * Gets the approximate distance to the nearest sink measured in number + * of interprocedural steps. + */ + int getSinkDistance() { + result = distSink(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + private string ppAp() { + exists(string s | + s = this.(PartialPathNodeFwd).getAp().toString() or + s = this.(PartialPathNodeRev).getAp().toString() + | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + result = " <" + this.(PartialPathNodeFwd).getCallContext().toString() + ">" + } + + /** Holds if this is a source in a forward-flow path. */ + predicate isFwdSource() { this.(PartialPathNodeFwd).isSource() } + + /** Holds if this is a sink in a reverse-flow path. */ + predicate isRevSink() { this.(PartialPathNodeRev).isSink() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PartialPathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PartialPathNode a, PartialPathNode b) { a.getASuccessor() = b } + } + + private class PartialPathNodeFwd extends PartialPathNode, TPartialPathNodeFwd { + NodeEx node; + CallContext cc; + TSummaryCtx1 sc1; + TSummaryCtx2 sc2; + PartialAccessPath ap; + Configuration config; + + PartialPathNodeFwd() { this = TPartialPathNodeFwd(node, cc, sc1, sc2, ap, config) } + + NodeEx getNodeEx() { result = node } + + CallContext getCallContext() { result = cc } + + TSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TSummaryCtx2 getSummaryCtx2() { result = sc2 } + + PartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeFwd getASuccessor() { + partialPathStep(this, result.getNodeEx(), result.getCallContext(), result.getSummaryCtx1(), + result.getSummaryCtx2(), result.getAp(), result.getConfiguration()) + } + + predicate isSource() { + sourceNode(node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap instanceof TPartialNil + } + } + + private class PartialPathNodeRev extends PartialPathNode, TPartialPathNodeRev { + NodeEx node; + TRevSummaryCtx1 sc1; + TRevSummaryCtx2 sc2; + RevPartialAccessPath ap; + Configuration config; + + PartialPathNodeRev() { this = TPartialPathNodeRev(node, sc1, sc2, ap, config) } + + NodeEx getNodeEx() { result = node } + + TRevSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TRevSummaryCtx2 getSummaryCtx2() { result = sc2 } + + RevPartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeRev getASuccessor() { + revPartialPathStep(result, this.getNodeEx(), this.getSummaryCtx1(), this.getSummaryCtx2(), + this.getAp(), this.getConfiguration()) + } + + predicate isSink() { + sinkNode(node, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = TRevPartialNil() + } + } + + private predicate partialPathStep( + PartialPathNodeFwd mid, NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + PartialAccessPath ap, Configuration config + ) { + not isUnreachableInCallCached(node.asNode(), cc.(CallContextSpecificCall).getCall()) and + ( + localFlowStep(mid.getNodeEx(), node, config) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(mid.getNodeEx(), node, config) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + ) + or + jumpStep(mid.getNodeEx(), node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(mid.getNodeEx(), node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + or + partialPathStoreStep(mid, _, _, node, ap) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() + or + exists(PartialAccessPath ap0, TypedContent tc | + partialPathReadStep(mid, ap0, tc, node, cc, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + apConsFwd(ap, tc, ap0, config) + ) + or + partialPathIntoCallable(mid, node, _, cc, sc1, sc2, _, ap, config) + or + partialPathOutOfCallable(mid, node, cc, ap, config) and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() + or + partialPathThroughCallable(mid, node, cc, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() + } + + bindingset[result, i] + private int unbindInt(int i) { i <= result and i >= result } + + pragma[inline] + private predicate partialPathStoreStep( + PartialPathNodeFwd mid, PartialAccessPath ap1, TypedContent tc, NodeEx node, + PartialAccessPath ap2 + ) { + exists(NodeEx midNode, DataFlowType contentType | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + store(midNode, tc, node, contentType, mid.getConfiguration()) and + ap2.getHead() = tc and + ap2.len() = unbindInt(ap1.len() + 1) and + compatibleTypes(ap1.getType(), contentType) + ) + } + + pragma[nomagic] + private predicate apConsFwd( + PartialAccessPath ap1, TypedContent tc, PartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStoreStep(mid, ap1, tc, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate partialPathReadStep( + PartialPathNodeFwd mid, PartialAccessPath ap, TypedContent tc, NodeEx node, CallContext cc, + Configuration config + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + read(midNode, tc.getContent(), node, pragma[only_bind_into](config)) and + ap.getHead() = tc and + pragma[only_bind_into](config) = mid.getConfiguration() and + cc = mid.getCallContext() + ) + } + + private predicate partialPathOutOfCallable0( + PartialPathNodeFwd mid, ReturnPosition pos, CallContext innercc, PartialAccessPath ap, + Configuration config + ) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + ap = mid.getAp() and + config = mid.getConfiguration() + } + + pragma[nomagic] + private predicate partialPathOutOfCallable1( + PartialPathNodeFwd mid, DataFlowCall call, ReturnKindExt kind, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + partialPathOutOfCallable0(mid, pos, innercc, ap, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) + } + + private predicate partialPathOutOfCallable( + PartialPathNodeFwd mid, NodeEx out, CallContext cc, PartialAccessPath ap, Configuration config + ) { + exists(ReturnKindExt kind, DataFlowCall call | + partialPathOutOfCallable1(mid, call, kind, cc, ap, config) + | + out.asNode() = kind.getAnOutNode(call) + ) + } + + pragma[noinline] + private predicate partialPathIntoArg( + PartialPathNodeFwd mid, int i, CallContext cc, DataFlowCall call, PartialAccessPath ap, + Configuration config + ) { + exists(ArgNode arg | + arg = mid.getNodeEx().asNode() and + cc = mid.getCallContext() and + arg.argumentOf(call, i) and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate partialPathIntoCallable0( + PartialPathNodeFwd mid, DataFlowCallable callable, int i, CallContext outercc, + DataFlowCall call, PartialAccessPath ap, Configuration config + ) { + partialPathIntoArg(mid, i, outercc, call, ap, config) and + callable = resolveCall(call, outercc) + } + + private predicate partialPathIntoCallable( + PartialPathNodeFwd mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, + TSummaryCtx1 sc1, TSummaryCtx2 sc2, DataFlowCall call, PartialAccessPath ap, + Configuration config + ) { + exists(int i, DataFlowCallable callable | + partialPathIntoCallable0(mid, callable, i, outercc, call, ap, config) and + p.isParameterOf(callable, i) and + sc1 = TSummaryCtx1Param(p) and + sc2 = TSummaryCtx2Some(ap) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) + } + + pragma[nomagic] + private predicate paramFlowsThroughInPartialPath( + ReturnKindExt kind, CallContextCall cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + PartialAccessPath ap, Configuration config + ) { + exists(PartialPathNodeFwd mid, RetNodeEx ret | + mid.getNodeEx() = ret and + kind = ret.getKind() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() and + ap = mid.getAp() + ) + } + + pragma[noinline] + private predicate partialPathThroughCallable0( + DataFlowCall call, PartialPathNodeFwd mid, ReturnKindExt kind, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(CallContext innercc, TSummaryCtx1 sc1, TSummaryCtx2 sc2 | + partialPathIntoCallable(mid, _, cc, innercc, sc1, sc2, call, _, config) and + paramFlowsThroughInPartialPath(kind, innercc, sc1, sc2, ap, config) + ) + } + + private predicate partialPathThroughCallable( + PartialPathNodeFwd mid, NodeEx out, CallContext cc, PartialAccessPath ap, Configuration config + ) { + exists(DataFlowCall call, ReturnKindExt kind | + partialPathThroughCallable0(call, mid, kind, cc, ap, config) and + out.asNode() = kind.getAnOutNode(call) + ) + } + + private predicate revPartialPathStep( + PartialPathNodeRev mid, NodeEx node, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, + RevPartialAccessPath ap, Configuration config + ) { + localFlowStep(node, mid.getNodeEx(), config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(node, mid.getNodeEx(), config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + jumpStep(node, mid.getNodeEx(), config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(node, mid.getNodeEx(), config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + revPartialPathReadStep(mid, _, _, node, ap) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() + or + exists(RevPartialAccessPath ap0, Content c | + revPartialPathStoreStep(mid, ap0, c, node, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + apConsRev(ap, c, ap0, config) + ) + or + exists(ParamNodeEx p | + mid.getNodeEx() = p and + viableParamArgEx(_, p, node) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + or + exists(ReturnPosition pos | + revPartialPathIntoReturn(mid, pos, sc1, sc2, _, ap, config) and + pos = getReturnPosition(node.asNode()) + ) + or + revPartialPathThroughCallable(mid, node, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() + } + + pragma[inline] + private predicate revPartialPathReadStep( + PartialPathNodeRev mid, RevPartialAccessPath ap1, Content c, NodeEx node, + RevPartialAccessPath ap2 + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + read(node, c, midNode, mid.getConfiguration()) and + ap2.getHead() = c and + ap2.len() = unbindInt(ap1.len() + 1) + ) + } + + pragma[nomagic] + private predicate apConsRev( + RevPartialAccessPath ap1, Content c, RevPartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeRev mid | + revPartialPathReadStep(mid, ap1, c, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathStoreStep( + PartialPathNodeRev mid, RevPartialAccessPath ap, Content c, NodeEx node, Configuration config + ) { + exists(NodeEx midNode, TypedContent tc | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + store(node, tc, midNode, _, config) and + ap.getHead() = c and + config = mid.getConfiguration() and + tc.getContent() = c + ) + } + + pragma[nomagic] + private predicate revPartialPathIntoReturn( + PartialPathNodeRev mid, ReturnPosition pos, TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, + DataFlowCall call, RevPartialAccessPath ap, Configuration config + ) { + exists(NodeEx out | + mid.getNodeEx() = out and + viableReturnPosOutEx(call, pos, out) and + sc1 = TRevSummaryCtx1Some(pos) and + sc2 = TRevSummaryCtx2Some(ap) and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathFlowsThrough( + int pos, TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, RevPartialAccessPath ap, + Configuration config + ) { + exists(PartialPathNodeRev mid, ParamNodeEx p | + mid.getNodeEx() = p and + p.getPosition() = pos and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable0( + DataFlowCall call, PartialPathNodeRev mid, int pos, RevPartialAccessPath ap, + Configuration config + ) { + exists(TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2 | + revPartialPathIntoReturn(mid, _, sc1, sc2, call, _, config) and + revPartialPathFlowsThrough(pos, sc1, sc2, ap, config) + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable( + PartialPathNodeRev mid, ArgNodeEx node, RevPartialAccessPath ap, Configuration config + ) { + exists(DataFlowCall call, int pos | + revPartialPathThroughCallable0(call, mid, pos, ap, config) and + node.asNode().(ArgNode).argumentOf(call, pos) + ) + } +} + +import FlowExploration + +private predicate partialFlow( + PartialPathNode source, PartialPathNode node, Configuration configuration +) { + source.getConfiguration() = configuration and + source.isFwdSource() and + node = source.getASuccessor+() +} + +private predicate revPartialFlow( + PartialPathNode node, PartialPathNode sink, Configuration configuration +) { + sink.getConfiguration() = configuration and + sink.isRevSink() and + node.getASuccessor+() = sink +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll new file mode 100644 index 00000000000..42d7e89f20b --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll @@ -0,0 +1,4687 @@ +/** + * Provides an implementation of global (interprocedural) data flow. This file + * re-exports the local (intraprocedural) data flow analysis from + * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed + * through the `Configuration` class. This file exists in several identical + * copies, allowing queries to use multiple `Configuration` classes that depend + * on each other without introducing mutual recursion among those configurations. + */ + +private import DataFlowImplCommon +private import DataFlowImplSpecific::Private +import DataFlowImplSpecific::Public +import DataFlowImplCommonPublic + +/** + * A configuration of interprocedural data flow analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the global data flow library must define its own unique extension + * of this abstract class. To create a configuration, extend this class with + * a subclass whose characteristic predicate is a unique singleton string. + * For example, write + * + * ```ql + * class MyAnalysisConfiguration extends DataFlow::Configuration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isBarrier`. + * // Optionally override `isAdditionalFlowStep`. + * } + * ``` + * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and + * the edges are those data-flow steps that preserve the value of the node + * along with any additional edges defined by `isAdditionalFlowStep`. + * Specifying nodes in `isBarrier` will remove those nodes from the graph, and + * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going + * and/or out-going edges from those nodes, respectively. + * + * Then, to query whether there is flow between some `source` and `sink`, + * write + * + * ```ql + * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) + * ``` + * + * Multiple configurations can coexist, but two classes extending + * `DataFlow::Configuration` should never depend on each other. One of them + * should instead depend on a `DataFlow2::Configuration`, a + * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. + */ +abstract class Configuration extends string { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant data flow source. + */ + abstract predicate isSource(Node source); + + /** + * Holds if `sink` is a relevant data flow sink. + */ + abstract predicate isSink(Node sink); + + /** + * Holds if data flow through `node` is prohibited. This completely removes + * `node` from the data flow graph. + */ + predicate isBarrier(Node node) { none() } + + /** Holds if data flow into `node` is prohibited. */ + predicate isBarrierIn(Node node) { none() } + + /** Holds if data flow out of `node` is prohibited. */ + predicate isBarrierOut(Node node) { none() } + + /** Holds if data flow through nodes guarded by `guard` is prohibited. */ + predicate isBarrierGuard(BarrierGuard guard) { none() } + + /** + * Holds if the additional flow step from `node1` to `node2` must be taken + * into account in the analysis. + */ + predicate isAdditionalFlowStep(Node node1, Node node2) { none() } + + /** + * Holds if an arbitrary number of implicit read steps of content `c` may be + * taken at `node`. + */ + predicate allowImplicitRead(Node node, Content c) { none() } + + /** + * Gets the virtual dispatch branching limit when calculating field flow. + * This can be overridden to a smaller value to improve performance (a + * value of 0 disables field flow), or a larger value to get more results. + */ + int fieldFlowBranchLimit() { result = 2 } + + /** + * Gets a data flow configuration feature to add restrictions to the set of + * valid flow paths. + * + * - `FeatureHasSourceCallContext`: + * Assume that sources have some existing call context to disallow + * conflicting return-flow directly following the source. + * - `FeatureHasSinkCallContext`: + * Assume that sinks have some existing call context to disallow + * conflicting argument-to-parameter flow directly preceding the sink. + * - `FeatureEqualSourceSinkCallContext`: + * Implies both of the above and additionally ensures that the entire flow + * path preserves the call context. + */ + FlowFeature getAFeature() { none() } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + */ + predicate hasFlow(Node source, Node sink) { flowsTo(source, sink, this) } + + /** + * Holds if data may flow from `source` to `sink` for this configuration. + * + * The corresponding paths are generated from the end-points and the graph + * included in the module `PathGraph`. + */ + predicate hasFlowPath(PathNode source, PathNode sink) { flowsTo(source, sink, _, _, this) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowTo(Node sink) { this.hasFlow(_, sink) } + + /** + * Holds if data may flow from some source to `sink` for this configuration. + */ + predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } + + /** + * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * measured in approximate number of interprocedural steps. + */ + int explorationLimit() { none() } + + /** + * Holds if there is a partial data flow path from `source` to `node`. The + * approximate distance between `node` and the closest source is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards sink definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sources is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + */ + final predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + partialFlow(source, node, this) and + dist = node.getSourceDistance() + } + + /** + * Holds if there is a partial data flow path from `node` to `sink`. The + * approximate distance between `node` and the closest sink is `dist` and + * is restricted to be less than or equal to `explorationLimit()`. This + * predicate completely disregards source definitions. + * + * This predicate is intended for data-flow exploration and debugging and may + * perform poorly if the number of sinks is too big and/or the exploration + * limit is set too high without using barriers. + * + * This predicate is disabled (has no results) by default. Override + * `explorationLimit()` with a suitable number to enable this predicate. + * + * To use this in a `path-problem` query, import the module `PartialPathGraph`. + * + * Note that reverse flow has slightly lower precision than the corresponding + * forward flow, as reverse flow disregards type pruning among other features. + */ + final predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + revPartialFlow(node, sink, this) and + dist = node.getSinkDistance() + } +} + +/** + * This class exists to prevent mutual recursion between the user-overridden + * member predicates of `Configuration` and the rest of the data-flow library. + * Good performance cannot be guaranteed in the presence of such recursion, so + * it should be replaced by using more than one copy of the data flow library. + */ +abstract private class ConfigurationRecursionPrevention extends Configuration { + bindingset[this] + ConfigurationRecursionPrevention() { any() } + + override predicate hasFlow(Node source, Node sink) { + strictcount(Node n | this.isSource(n)) < 0 + or + strictcount(Node n | this.isSink(n)) < 0 + or + strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 + or + super.hasFlow(source, sink) + } +} + +private newtype TNodeEx = + TNodeNormal(Node n) or + TNodeImplicitRead(Node n, boolean hasRead) { + any(Configuration c).allowImplicitRead(n, _) and hasRead = [false, true] + } + +private class NodeEx extends TNodeEx { + string toString() { + result = this.asNode().toString() + or + exists(Node n | this.isImplicitReadNode(n, _) | result = n.toString() + " [Ext]") + } + + Node asNode() { this = TNodeNormal(result) } + + predicate isImplicitReadNode(Node n, boolean hasRead) { this = TNodeImplicitRead(n, hasRead) } + + Node projectToNode() { this = TNodeNormal(result) or this = TNodeImplicitRead(result, _) } + + pragma[nomagic] + private DataFlowCallable getEnclosingCallable0() { + nodeEnclosingCallable(this.projectToNode(), result) + } + + pragma[inline] + DataFlowCallable getEnclosingCallable() { + pragma[only_bind_out](this).getEnclosingCallable0() = pragma[only_bind_into](result) + } + + pragma[nomagic] + private DataFlowType getDataFlowType0() { nodeDataFlowType(this.asNode(), result) } + + pragma[inline] + DataFlowType getDataFlowType() { + pragma[only_bind_out](this).getDataFlowType0() = pragma[only_bind_into](result) + } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.projectToNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +private class ArgNodeEx extends NodeEx { + ArgNodeEx() { this.asNode() instanceof ArgNode } +} + +private class ParamNodeEx extends NodeEx { + ParamNodeEx() { this.asNode() instanceof ParamNode } + + predicate isParameterOf(DataFlowCallable c, int i) { + this.asNode().(ParamNode).isParameterOf(c, i) + } + + int getPosition() { this.isParameterOf(_, result) } + + predicate allowParameterReturnInSelf() { allowParameterReturnInSelfCached(this.asNode()) } +} + +private class RetNodeEx extends NodeEx { + RetNodeEx() { this.asNode() instanceof ReturnNodeExt } + + ReturnPosition getReturnPosition() { result = getReturnPosition(this.asNode()) } + + ReturnKindExt getKind() { result = this.asNode().(ReturnNodeExt).getKind() } +} + +private predicate inBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierIn(n) and + config.isSource(n) + ) +} + +private predicate outBarrier(NodeEx node, Configuration config) { + exists(Node n | + node.asNode() = n and + config.isBarrierOut(n) and + config.isSink(n) + ) +} + +pragma[nomagic] +private predicate fullBarrier(NodeEx node, Configuration config) { + exists(Node n | node.asNode() = n | + config.isBarrier(n) + or + config.isBarrierIn(n) and + not config.isSource(n) + or + config.isBarrierOut(n) and + not config.isSink(n) + or + exists(BarrierGuard g | + config.isBarrierGuard(g) and + n = g.getAGuardedNode() + ) + ) +} + +pragma[nomagic] +private predicate sourceNode(NodeEx node, Configuration config) { + config.isSource(node.asNode()) and + not fullBarrier(node, config) +} + +pragma[nomagic] +private predicate sinkNode(NodeEx node, Configuration config) { config.isSink(node.asNode()) } + +/** Provides the relevant barriers for a step from `node1` to `node2`. */ +pragma[inline] +private predicate stepFilter(NodeEx node1, NodeEx node2, Configuration config) { + not outBarrier(node1, config) and + not inBarrier(node2, config) and + not fullBarrier(node1, config) and + not fullBarrier(node2, config) +} + +/** + * Holds if data can flow in one local step from `node1` to `node2`. + */ +private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + simpleLocalFlowStepExt(n1, n2) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.asNode() = n and + node2.isImplicitReadNode(n, false) and + not fullBarrier(node1, config) + ) +} + +/** + * Holds if the additional step from `node1` to `node2` does not jump between callables. + */ +private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, n2) and + getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) + ) + or + exists(Node n | + config.allowImplicitRead(n, _) and + node1.isImplicitReadNode(n, true) and + node2.asNode() = n and + not fullBarrier(node2, config) + ) +} + +/** + * Holds if data can flow from `node1` to `node2` in a way that discards call contexts. + */ +private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + jumpStepCached(n1, n2) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +/** + * Holds if the additional step from `node1` to `node2` jumps between callables. + */ +private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration config) { + exists(Node n1, Node n2 | + node1.asNode() = n1 and + node2.asNode() = n2 and + config.isAdditionalFlowStep(n1, n2) and + getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and + stepFilter(node1, node2, config) and + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate read(NodeEx node1, Content c, NodeEx node2, Configuration config) { + read(node1.asNode(), c, node2.asNode()) and + stepFilter(node1, node2, config) + or + exists(Node n | + node2.isImplicitReadNode(n, true) and + node1.isImplicitReadNode(n, _) and + config.allowImplicitRead(n, c) + ) +} + +private predicate store( + NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config +) { + store(node1.asNode(), tc, node2.asNode(), contentType) and + read(_, tc.getContent(), _, config) and + stepFilter(node1, node2, config) +} + +pragma[nomagic] +private predicate viableReturnPosOutEx(DataFlowCall call, ReturnPosition pos, NodeEx out) { + viableReturnPosOut(call, pos, out.asNode()) +} + +pragma[nomagic] +private predicate viableParamArgEx(DataFlowCall call, ParamNodeEx p, ArgNodeEx arg) { + viableParamArg(call, p.asNode(), arg.asNode()) +} + +/** + * Holds if field flow should be used for the given configuration. + */ +private predicate useFieldFlow(Configuration config) { config.fieldFlowBranchLimit() >= 1 } + +private predicate hasSourceCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSourceCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private predicate hasSinkCallCtx(Configuration config) { + exists(FlowFeature feature | feature = config.getAFeature() | + feature instanceof FeatureHasSinkCallContext or + feature instanceof FeatureEqualSourceSinkCallContext + ) +} + +private module Stage1 { + class ApApprox = Unit; + + class Ap = Unit; + + class ApOption = Unit; + + class Cc = boolean; + + /* Begin: Stage 1 logic. */ + /** + * Holds if `node` is reachable from a source in the configuration `config`. + * + * The Boolean `cc` records whether the node is reached through an + * argument in a call. + */ + predicate fwdFlow(NodeEx node, Cc cc, Configuration config) { + sourceNode(node, config) and + if hasSourceCallCtx(config) then cc = true else cc = false + or + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + localFlowStep(mid, node, config) + ) + or + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + additionalLocalFlowStep(mid, node, config) + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, config) and + jumpStep(mid, node, config) and + cc = false + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, config) and + additionalJumpStep(mid, node, config) and + cc = false + ) + or + // store + exists(NodeEx mid | + useFieldFlow(config) and + fwdFlow(mid, cc, config) and + store(mid, _, node, _, config) + ) + or + // read + exists(Content c | + fwdFlowRead(c, node, cc, config) and + fwdFlowConsCand(c, config) + ) + or + // flow into a callable + exists(NodeEx arg | + fwdFlow(arg, _, config) and + viableParamArgEx(_, node, arg) and + cc = true and + not fullBarrier(node, config) + ) + or + // flow out of a callable + exists(DataFlowCall call | + fwdFlowOut(call, node, false, config) and + cc = false + or + fwdFlowOutFromArg(call, node, config) and + fwdFlowIsEntered(call, cc, config) + ) + } + + private predicate fwdFlow(NodeEx node, Configuration config) { fwdFlow(node, _, config) } + + pragma[nomagic] + private predicate fwdFlowRead(Content c, NodeEx node, Cc cc, Configuration config) { + exists(NodeEx mid | + fwdFlow(mid, cc, config) and + read(mid, c, node, config) + ) + } + + /** + * Holds if `c` is the target of a store in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node, TypedContent tc | + not fullBarrier(node, config) and + useFieldFlow(config) and + fwdFlow(mid, _, config) and + store(mid, tc, node, _, config) and + c = tc.getContent() + ) + } + + pragma[nomagic] + private predicate fwdFlowReturnPosition(ReturnPosition pos, Cc cc, Configuration config) { + exists(RetNodeEx ret | + fwdFlow(ret, cc, config) and + ret.getReturnPosition() = pos + ) + } + + pragma[nomagic] + private predicate fwdFlowOut(DataFlowCall call, NodeEx out, Cc cc, Configuration config) { + exists(ReturnPosition pos | + fwdFlowReturnPosition(pos, cc, config) and + viableReturnPosOutEx(call, pos, out) and + not fullBarrier(out, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg(DataFlowCall call, NodeEx out, Configuration config) { + fwdFlowOut(call, out, true, config) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered(DataFlowCall call, Cc cc, Configuration config) { + exists(ArgNodeEx arg | + fwdFlow(arg, cc, config) and + viableParamArgEx(call, _, arg) + ) + } + + /** + * Holds if `node` is part of a path from a source to a sink in the + * configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from + * the enclosing callable in order to reach a sink. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, Configuration config) { + revFlow0(node, toReturn, config) and + fwdFlow(node, config) + } + + pragma[nomagic] + private predicate revFlow0(NodeEx node, boolean toReturn, Configuration config) { + fwdFlow(node, config) and + sinkNode(node, config) and + if hasSinkCallCtx(config) then toReturn = true else toReturn = false + or + exists(NodeEx mid | + localFlowStep(node, mid, config) and + revFlow(mid, toReturn, config) + ) + or + exists(NodeEx mid | + additionalLocalFlowStep(node, mid, config) and + revFlow(mid, toReturn, config) + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, config) and + toReturn = false + ) + or + exists(NodeEx mid | + additionalJumpStep(node, mid, config) and + revFlow(mid, _, config) and + toReturn = false + ) + or + // store + exists(Content c | + revFlowStore(c, node, toReturn, config) and + revFlowConsCand(c, config) + ) + or + // read + exists(NodeEx mid, Content c | + read(node, c, mid, config) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + revFlow(mid, toReturn, pragma[only_bind_into](config)) + ) + or + // flow into a callable + exists(DataFlowCall call | + revFlowIn(call, node, false, config) and + toReturn = false + or + revFlowInToReturn(call, node, config) and + revFlowIsReturned(call, toReturn, config) + ) + or + // flow out of a callable + exists(ReturnPosition pos | + revFlowOut(pos, config) and + node.(RetNodeEx).getReturnPosition() = pos and + toReturn = true + ) + } + + /** + * Holds if `c` is the target of a read in the flow covered by `revFlow`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Content c, Configuration config) { + exists(NodeEx mid, NodeEx node | + fwdFlow(node, pragma[only_bind_into](config)) and + read(node, c, mid, config) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + revFlow(pragma[only_bind_into](mid), _, pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate revFlowStore(Content c, NodeEx node, boolean toReturn, Configuration config) { + exists(NodeEx mid, TypedContent tc | + revFlow(mid, toReturn, pragma[only_bind_into](config)) and + fwdFlowConsCand(c, pragma[only_bind_into](config)) and + store(node, tc, mid, _, config) and + c = tc.getContent() + ) + } + + /** + * Holds if `c` is the target of both a read and a store in the flow covered + * by `revFlow`. + */ + private predicate revFlowIsReadAndStored(Content c, Configuration conf) { + revFlowConsCand(c, conf) and + revFlowStore(c, _, _, conf) + } + + pragma[nomagic] + predicate viableReturnPosOutNodeCandFwd1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config + ) { + fwdFlowReturnPosition(pos, _, config) and + viableReturnPosOutEx(call, pos, out) + } + + pragma[nomagic] + private predicate revFlowOut(ReturnPosition pos, Configuration config) { + exists(DataFlowCall call, NodeEx out | + revFlow(out, _, config) and + viableReturnPosOutNodeCandFwd1(call, pos, out, config) + ) + } + + pragma[nomagic] + predicate viableParamArgNodeCandFwd1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config + ) { + viableParamArgEx(call, p, arg) and + fwdFlow(arg, config) + } + + pragma[nomagic] + private predicate revFlowIn( + DataFlowCall call, ArgNodeEx arg, boolean toReturn, Configuration config + ) { + exists(ParamNodeEx p | + revFlow(p, toReturn, config) and + viableParamArgNodeCandFwd1(call, p, arg, config) + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn(DataFlowCall call, ArgNodeEx arg, Configuration config) { + revFlowIn(call, arg, true, config) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned(DataFlowCall call, boolean toReturn, Configuration config) { + exists(NodeEx out | + revFlow(out, toReturn, config) and + fwdFlowOutFromArg(call, out, config) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Content c | + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + revFlow(node2, pragma[only_bind_into](config)) and + store(node1, tc, node2, contentType, config) and + c = tc.getContent() and + exists(ap1) + ) + } + + pragma[nomagic] + predicate readStepCand(NodeEx n1, Content c, NodeEx n2, Configuration config) { + revFlowIsReadAndStored(c, pragma[only_bind_into](config)) and + revFlow(n2, pragma[only_bind_into](config)) and + read(n1, c, n2, pragma[only_bind_into](config)) + } + + pragma[nomagic] + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, config) } + + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow(node, toReturn, config) and exists(returnAp) and exists(ap) + } + + private predicate throughFlowNodeCand(NodeEx node, Configuration config) { + revFlow(node, true, config) and + fwdFlow(node, true, config) and + not inBarrier(node, config) and + not outBarrier(node, config) + } + + /** Holds if flow may return from `callable`. */ + pragma[nomagic] + private predicate returnFlowCallableNodeCand( + DataFlowCallable callable, ReturnKindExt kind, Configuration config + ) { + exists(RetNodeEx ret | + throughFlowNodeCand(ret, config) and + callable = ret.getEnclosingCallable() and + kind = ret.getKind() + ) + } + + /** + * Holds if flow may enter through `p` and reach a return node making `p` a + * candidate for the origin of a summary. + */ + pragma[nomagic] + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(ReturnKindExt kind | + throughFlowNodeCand(p, config) and + returnFlowCallableNodeCand(c, kind, config) and + p.getEnclosingCallable() = c and + exists(ap) and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = p.getPosition() + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(ArgNodeEx arg, boolean toReturn | + revFlow(arg, toReturn, config) and + revFlowInToReturn(call, arg, config) and + revFlowIsReturned(call, toReturn, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, config)) and + fields = count(Content f0 | fwdFlowConsCand(f0, config)) and + conscand = -1 and + tuples = count(NodeEx n, boolean b | fwdFlow(n, b, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, config)) and + fields = count(Content f0 | revFlowConsCand(f0, config)) and + conscand = -1 and + tuples = count(NodeEx n, boolean b | revFlow(n, b, config)) + } + /* End: Stage 1 logic. */ +} + +pragma[noinline] +private predicate localFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + localFlowStep(node1, node2, config) +} + +pragma[noinline] +private predicate additionalLocalFlowStepNodeCand1(NodeEx node1, NodeEx node2, Configuration config) { + Stage1::revFlow(node2, config) and + additionalLocalFlowStep(node1, node2, config) +} + +pragma[nomagic] +private predicate viableReturnPosOutNodeCand1( + DataFlowCall call, ReturnPosition pos, NodeEx out, Configuration config +) { + Stage1::revFlow(out, config) and + Stage1::viableReturnPosOutNodeCandFwd1(call, pos, out, config) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, Configuration config +) { + viableReturnPosOutNodeCand1(call, ret.getReturnPosition(), out, config) and + Stage1::revFlow(ret, config) and + not outBarrier(ret, config) and + not inBarrier(out, config) +} + +pragma[nomagic] +private predicate viableParamArgNodeCand1( + DataFlowCall call, ParamNodeEx p, ArgNodeEx arg, Configuration config +) { + Stage1::viableParamArgNodeCandFwd1(call, p, arg, config) and + Stage1::revFlow(arg, config) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, Configuration config +) { + viableParamArgNodeCand1(call, p, arg, config) and + Stage1::revFlow(p, config) and + not outBarrier(arg, config) and + not inBarrier(p, config) +} + +/** + * Gets the amount of forward branching on the origin of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int branch(NodeEx n1, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n1, n, conf) or flowIntoCallNodeCand1(_, n1, n, conf) + ) +} + +/** + * Gets the amount of backward branching on the target of a cross-call path + * edge in the graph of paths between sources and sinks that ignores call + * contexts. + */ +private int join(NodeEx n2, Configuration conf) { + result = + strictcount(NodeEx n | + flowOutOfCallNodeCand1(_, n, n2, conf) or flowIntoCallNodeCand1(_, n, n2, conf) + ) +} + +/** + * Holds if data can flow out of `call` from `ret` to `out`, either + * through a `ReturnNode` or through an argument that has been mutated, and + * that this step is part of a path from a source to a sink. The + * `allowsFieldFlow` flag indicates whether the branching is within the limit + * specified by the configuration. + */ +pragma[nomagic] +private predicate flowOutOfCallNodeCand1( + DataFlowCall call, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, ret, out, config) and + exists(int b, int j | + b = branch(ret, config) and + j = join(out, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +/** + * Holds if data can flow into `call` and that this step is part of a + * path from a source to a sink. The `allowsFieldFlow` flag indicates whether + * the branching is within the limit specified by the configuration. + */ +pragma[nomagic] +private predicate flowIntoCallNodeCand1( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config +) { + flowIntoCallNodeCand1(call, arg, p, config) and + exists(int b, int j | + b = branch(arg, config) and + j = join(p, config) and + if b.minimum(j) <= config.fieldFlowBranchLimit() + then allowsFieldFlow = true + else allowsFieldFlow = false + ) +} + +private module Stage2 { + module PrevStage = Stage1; + + class ApApprox = PrevStage::Ap; + + class Ap = boolean; + + class ApNil extends Ap { + ApNil() { this = false } + } + + bindingset[result, ap] + private ApApprox getApprox(Ap ap) { any() } + + private ApNil getApNil(NodeEx node) { PrevStage::revFlow(node, _) and exists(result) } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = true and exists(tc) and exists(tail) } + + pragma[inline] + private Content getHeadContent(Ap ap) { exists(result) and ap = true } + + class ApOption = BooleanOption; + + ApOption apNone() { result = TBooleanNone() } + + ApOption apSome(Ap ap) { result = TBooleanSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSiteDispatch(call, c) + then result = TSpecificCall(call) + else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + ( + preservesValue = true and + localFlowStepNodeCand1(node1, node2, config) + or + preservesValue = false and + additionalLocalFlowStepNodeCand1(node1, node2, config) + ) and + exists(ap) and + exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand1/5; + + private predicate flowIntoCall = flowIntoCallNodeCand1/5; + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { any() } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 2 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 2 logic. */ +} + +pragma[nomagic] +private predicate flowOutOfCallNodeCand2( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config +) { + flowOutOfCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlow(node1, pragma[only_bind_into](config)) +} + +pragma[nomagic] +private predicate flowIntoCallNodeCand2( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config +) { + flowIntoCallNodeCand1(call, node1, node2, allowsFieldFlow, config) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) and + Stage2::revFlow(node1, pragma[only_bind_into](config)) +} + +private module LocalFlowBigStep { + /** + * A node where some checking is required, and hence the big-step relation + * is not allowed to step over. + */ + private class FlowCheckNode extends NodeEx { + FlowCheckNode() { + castNode(this.asNode()) or + clearsContentCached(this.asNode(), _) + } + } + + /** + * Holds if `node` can be the first node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + predicate localFlowEntry(NodeEx node, Configuration config) { + Stage2::revFlow(node, config) and + ( + sourceNode(node, config) or + jumpStep(_, node, config) or + additionalJumpStep(_, node, config) or + node instanceof ParamNodeEx or + node.asNode() instanceof OutNodeExt or + store(_, _, node, _, config) or + read(_, _, node, config) or + node instanceof FlowCheckNode + ) + } + + /** + * Holds if `node` can be the last node in a maximal subsequence of local + * flow steps in a dataflow path. + */ + private predicate localFlowExit(NodeEx node, Configuration config) { + exists(NodeEx next | Stage2::revFlow(next, config) | + jumpStep(node, next, config) or + additionalJumpStep(node, next, config) or + flowIntoCallNodeCand1(_, node, next, config) or + flowOutOfCallNodeCand1(_, node, next, config) or + store(node, _, next, _, config) or + read(node, _, next, config) + ) + or + node instanceof FlowCheckNode + or + sinkNode(node, config) + } + + pragma[noinline] + private predicate additionalLocalFlowStepNodeCand2( + NodeEx node1, NodeEx node2, Configuration config + ) { + additionalLocalFlowStepNodeCand1(node1, node2, config) and + Stage2::revFlow(node1, _, _, false, pragma[only_bind_into](config)) and + Stage2::revFlow(node2, _, _, false, pragma[only_bind_into](config)) + } + + /** + * Holds if the local path from `node1` to `node2` is a prefix of a maximal + * subsequence of local flow steps in a dataflow path. + * + * This is the transitive closure of `[additional]localFlowStep` beginning + * at `localFlowEntry`. + */ + pragma[nomagic] + private predicate localFlowStepPlus( + NodeEx node1, NodeEx node2, boolean preservesValue, DataFlowType t, Configuration config, + LocalCallContext cc + ) { + not isUnreachableInCallCached(node2.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and + ( + localFlowEntry(node1, pragma[only_bind_into](config)) and + ( + localFlowStepNodeCand1(node1, node2, config) and + preservesValue = true and + t = node1.getDataFlowType() // irrelevant dummy value + or + additionalLocalFlowStepNodeCand2(node1, node2, config) and + preservesValue = false and + t = node2.getDataFlowType() + ) and + node1 != node2 and + cc.relevantFor(node1.getEnclosingCallable()) and + not isUnreachableInCallCached(node1.asNode(), cc.(LocalCallContextSpecificCall).getCall()) and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + or + exists(NodeEx mid | + localFlowStepPlus(node1, mid, preservesValue, t, pragma[only_bind_into](config), cc) and + localFlowStepNodeCand1(mid, node2, config) and + not mid instanceof FlowCheckNode and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + ) + or + exists(NodeEx mid | + localFlowStepPlus(node1, mid, _, _, pragma[only_bind_into](config), cc) and + additionalLocalFlowStepNodeCand2(mid, node2, config) and + not mid instanceof FlowCheckNode and + preservesValue = false and + t = node2.getDataFlowType() and + Stage2::revFlow(node2, pragma[only_bind_into](config)) + ) + ) + } + + /** + * Holds if `node1` can step to `node2` in one or more local steps and this + * path can occur as a maximal subsequence of local steps in a dataflow path. + */ + pragma[nomagic] + predicate localFlowBigStep( + NodeEx node1, NodeEx node2, boolean preservesValue, AccessPathFrontNil apf, + Configuration config, LocalCallContext callContext + ) { + localFlowStepPlus(node1, node2, preservesValue, apf.getType(), config, callContext) and + localFlowExit(node2, config) + } +} + +private import LocalFlowBigStep + +private module Stage3 { + module PrevStage = Stage2; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathFront; + + class ApNil = AccessPathFrontNil; + + private ApApprox getApprox(Ap ap) { result = ap.toBoolNonEmpty() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TFrontNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result.getHead() = tc and exists(tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathFrontOption; + + ApOption apNone() { result = TAccessPathFrontNone() } + + ApOption apSome(Ap ap) { result = TAccessPathFrontSome(ap) } + + class Cc = boolean; + + class CcCall extends Cc { + CcCall() { this = true } + + /** Holds if this call context may be `call`. */ + predicate matchesCall(DataFlowCall call) { any() } + } + + class CcNoCall extends Cc { + CcNoCall() { this = false } + } + + Cc ccNone() { result = false } + + CcCall ccSomeCall() { result = true } + + private class LocalCc = Unit; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { any() } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { any() } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, node2, preservesValue, ap, config, _) and exists(lcc) + } + + private predicate flowOutOfCall = flowOutOfCallNodeCand2/5; + + private predicate flowIntoCall = flowIntoCallNodeCand2/5; + + pragma[nomagic] + private predicate clear(NodeEx node, Ap ap) { ap.isClearedAt(node.asNode()) } + + pragma[nomagic] + private predicate castingNodeEx(NodeEx node) { node.asNode() instanceof CastingNode } + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { + not clear(node, ap) and + if castingNodeEx(node) then compatibleTypes(node.getDataFlowType(), ap.getType()) else any() + } + + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { + // We need to typecheck stores here, since reverse flow through a getter + // might have a different type here compared to inside the getter. + compatibleTypes(ap.getType(), contentType) + } + + /* Begin: Stage 3 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 3 logic. */ +} + +/** + * Holds if `argApf` is recorded as the summary context for flow reaching `node` + * and remains relevant for the following pruning stage. + */ +private predicate flowCandSummaryCtx(NodeEx node, AccessPathFront argApf, Configuration config) { + exists(AccessPathFront apf | + Stage3::revFlow(node, true, _, apf, config) and + Stage3::fwdFlow(node, any(Stage3::CcCall ccc), TAccessPathFrontSome(argApf), apf, config) + ) +} + +/** + * Holds if a length 2 access path approximation with the head `tc` is expected + * to be expensive. + */ +private predicate expensiveLen2unfolding(TypedContent tc, Configuration config) { + exists(int tails, int nodes, int apLimit, int tupleLimit | + tails = strictcount(AccessPathFront apf | Stage3::consCand(tc, apf, config)) and + nodes = + strictcount(NodeEx n | + Stage3::revFlow(n, _, _, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + or + flowCandSummaryCtx(n, any(AccessPathFrontHead apf | apf.getHead() = tc), config) + ) and + accessPathApproxCostLimits(apLimit, tupleLimit) and + apLimit < tails and + tupleLimit < (tails - 1) * nodes and + not tc.forceHighPrecision() + ) +} + +private newtype TAccessPathApprox = + TNil(DataFlowType t) or + TConsNil(TypedContent tc, DataFlowType t) { + Stage3::consCand(tc, TFrontNil(t), _) and + not expensiveLen2unfolding(tc, _) + } or + TConsCons(TypedContent tc1, TypedContent tc2, int len) { + Stage3::consCand(tc1, TFrontHead(tc2), _) and + len in [2 .. accessPathLimit()] and + not expensiveLen2unfolding(tc1, _) + } or + TCons1(TypedContent tc, int len) { + len in [1 .. accessPathLimit()] and + expensiveLen2unfolding(tc, _) + } + +/** + * Conceptually a list of `TypedContent`s followed by a `DataFlowType`, but only + * the first two elements of the list and its length are tracked. If data flows + * from a source to a given node with a given `AccessPathApprox`, this indicates + * the sequence of dereference operations needed to get from the value in the node + * to the tracked object. The final type indicates the type of the tracked object. + */ +abstract private class AccessPathApprox extends TAccessPathApprox { + abstract string toString(); + + abstract TypedContent getHead(); + + abstract int len(); + + abstract DataFlowType getType(); + + abstract AccessPathFront getFront(); + + /** Gets the access path obtained by popping `head` from this path, if any. */ + abstract AccessPathApprox pop(TypedContent head); +} + +private class AccessPathApproxNil extends AccessPathApprox, TNil { + private DataFlowType t; + + AccessPathApproxNil() { this = TNil(t) } + + override string toString() { result = concat(": " + ppReprType(t)) } + + override TypedContent getHead() { none() } + + override int len() { result = 0 } + + override DataFlowType getType() { result = t } + + override AccessPathFront getFront() { result = TFrontNil(t) } + + override AccessPathApprox pop(TypedContent head) { none() } +} + +abstract private class AccessPathApproxCons extends AccessPathApprox { } + +private class AccessPathApproxConsNil extends AccessPathApproxCons, TConsNil { + private TypedContent tc; + private DataFlowType t; + + AccessPathApproxConsNil() { this = TConsNil(tc, t) } + + override string toString() { + // The `concat` becomes "" if `ppReprType` has no result. + result = "[" + tc.toString() + "]" + concat(" : " + ppReprType(t)) + } + + override TypedContent getHead() { result = tc } + + override int len() { result = 1 } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { head = tc and result = TNil(t) } +} + +private class AccessPathApproxConsCons extends AccessPathApproxCons, TConsCons { + private TypedContent tc1; + private TypedContent tc2; + private int len; + + AccessPathApproxConsCons() { this = TConsCons(tc1, tc2, len) } + + override string toString() { + if len = 2 + then result = "[" + tc1.toString() + ", " + tc2.toString() + "]" + else result = "[" + tc1.toString() + ", " + tc2.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc1 } + + override int len() { result = len } + + override DataFlowType getType() { result = tc1.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc1) } + + override AccessPathApprox pop(TypedContent head) { + head = tc1 and + ( + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + } +} + +private class AccessPathApproxCons1 extends AccessPathApproxCons, TCons1 { + private TypedContent tc; + private int len; + + AccessPathApproxCons1() { this = TCons1(tc, len) } + + override string toString() { + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + } + + override TypedContent getHead() { result = tc } + + override int len() { result = len } + + override DataFlowType getType() { result = tc.getContainerType() } + + override AccessPathFront getFront() { result = TFrontHead(tc) } + + override AccessPathApprox pop(TypedContent head) { + head = tc and + ( + exists(TypedContent tc2 | Stage3::consCand(tc, TFrontHead(tc2), _) | + result = TConsCons(tc2, _, len - 1) + or + len = 2 and + result = TConsNil(tc2, _) + or + result = TCons1(tc2, len - 1) + ) + or + exists(DataFlowType t | + len = 1 and + Stage3::consCand(tc, TFrontNil(t), _) and + result = TNil(t) + ) + ) + } +} + +/** Gets the access path obtained by popping `tc` from `ap`, if any. */ +private AccessPathApprox pop(TypedContent tc, AccessPathApprox apa) { result = apa.pop(tc) } + +/** Gets the access path obtained by pushing `tc` onto `ap`. */ +private AccessPathApprox push(TypedContent tc, AccessPathApprox apa) { apa = pop(tc, result) } + +private newtype TAccessPathApproxOption = + TAccessPathApproxNone() or + TAccessPathApproxSome(AccessPathApprox apa) + +private class AccessPathApproxOption extends TAccessPathApproxOption { + string toString() { + this = TAccessPathApproxNone() and result = "" + or + this = TAccessPathApproxSome(any(AccessPathApprox apa | result = apa.toString())) + } +} + +private module Stage4 { + module PrevStage = Stage3; + + class ApApprox = PrevStage::Ap; + + class Ap = AccessPathApprox; + + class ApNil = AccessPathApproxNil; + + private ApApprox getApprox(Ap ap) { result = ap.getFront() } + + private ApNil getApNil(NodeEx node) { + PrevStage::revFlow(node, _) and result = TNil(node.getDataFlowType()) + } + + bindingset[tc, tail] + private Ap apCons(TypedContent tc, Ap tail) { result = push(tc, tail) } + + pragma[noinline] + private Content getHeadContent(Ap ap) { result = ap.getHead().getContent() } + + class ApOption = AccessPathApproxOption; + + ApOption apNone() { result = TAccessPathApproxNone() } + + ApOption apSome(Ap ap) { result = TAccessPathApproxSome(ap) } + + class Cc = CallContext; + + class CcCall = CallContextCall; + + class CcNoCall = CallContextNoCall; + + Cc ccNone() { result instanceof CallContextAny } + + CcCall ccSomeCall() { result instanceof CallContextSomeCall } + + private class LocalCc = LocalCallContext; + + bindingset[call, c, outercc] + private CcCall getCallContextCall(DataFlowCall call, DataFlowCallable c, Cc outercc) { + checkCallContextCall(outercc, call, c) and + if recordDataFlowCallSite(call, c) then result = TSpecificCall(call) else result = TSomeCall() + } + + bindingset[call, c, innercc] + private CcNoCall getCallContextReturn(DataFlowCallable c, DataFlowCall call, Cc innercc) { + checkCallContextReturn(innercc, c, call) and + if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone() + } + + bindingset[node, cc, config] + private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { + localFlowEntry(node, config) and + result = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + node.getEnclosingCallable()) + } + + private predicate localStep( + NodeEx node1, NodeEx node2, boolean preservesValue, ApNil ap, Configuration config, LocalCc lcc + ) { + localFlowBigStep(node1, node2, preservesValue, ap.getFront(), config, lcc) + } + + pragma[nomagic] + private predicate flowOutOfCall( + DataFlowCall call, RetNodeEx node1, NodeEx node2, boolean allowsFieldFlow, Configuration config + ) { + flowOutOfCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, _, _, _, pragma[only_bind_into](config)) and + PrevStage::revFlow(node1, _, _, _, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate flowIntoCall( + DataFlowCall call, ArgNodeEx node1, ParamNodeEx node2, boolean allowsFieldFlow, + Configuration config + ) { + flowIntoCallNodeCand2(call, node1, node2, allowsFieldFlow, config) and + PrevStage::revFlow(node2, _, _, _, pragma[only_bind_into](config)) and + PrevStage::revFlow(node1, _, _, _, pragma[only_bind_into](config)) + } + + bindingset[node, ap] + private predicate filter(NodeEx node, Ap ap) { any() } + + // Type checking is not necessary here as it has already been done in stage 3. + bindingset[ap, contentType] + private predicate typecheckStore(Ap ap, DataFlowType contentType) { any() } + + /* Begin: Stage 4 logic. */ + private predicate flowCand(NodeEx node, ApApprox apa, Configuration config) { + PrevStage::revFlow(node, _, _, apa, config) + } + + bindingset[result, apa] + private ApApprox unbindApa(ApApprox apa) { + exists(ApApprox apa0 | + apa = pragma[only_bind_into](apa0) and result = pragma[only_bind_into](apa0) + ) + } + + pragma[nomagic] + private predicate flowThroughOutOfCall( + DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow, + Configuration config + ) { + flowOutOfCall(call, ret, out, allowsFieldFlow, pragma[only_bind_into](config)) and + PrevStage::callMayFlowThroughRev(call, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(_, ret.getEnclosingCallable(), _, + pragma[only_bind_into](config)) and + ccc.matchesCall(call) + } + + /** + * Holds if `node` is reachable with access path `ap` from a source in the + * configuration `config`. + * + * The call context `cc` records whether the node is reached through an + * argument in a call, and if so, `argAp` records the access path of that + * argument. + */ + pragma[nomagic] + predicate fwdFlow(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + fwdFlow0(node, cc, argAp, ap, config) and + flowCand(node, unbindApa(getApprox(ap)), config) and + filter(node, ap) + } + + pragma[nomagic] + private predicate fwdFlow0(NodeEx node, Cc cc, ApOption argAp, Ap ap, Configuration config) { + flowCand(node, _, config) and + sourceNode(node, config) and + (if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and + argAp = apNone() and + ap = getApNil(node) + or + exists(NodeEx mid, Ap ap0, LocalCc localCc | + fwdFlow(mid, cc, argAp, ap0, config) and + localCc = getLocalCc(mid, cc, config) + | + localStep(mid, node, true, _, config, localCc) and + ap = ap0 + or + localStep(mid, node, false, ap, config, localCc) and + ap0 instanceof ApNil + ) + or + exists(NodeEx mid | + fwdFlow(mid, _, _, ap, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + jumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(mid, _, _, nil, pragma[only_bind_into](config)) and + flowCand(node, _, pragma[only_bind_into](config)) and + additionalJumpStep(mid, node, config) and + cc = ccNone() and + argAp = apNone() and + ap = getApNil(node) + ) + or + // store + exists(TypedContent tc, Ap ap0 | + fwdFlowStore(_, ap0, tc, node, cc, argAp, config) and + ap = apCons(tc, ap0) + ) + or + // read + exists(Ap ap0, Content c | + fwdFlowRead(ap0, c, _, node, cc, argAp, config) and + fwdFlowConsCand(ap0, c, ap, config) + ) + or + // flow into a callable + exists(ApApprox apa | + fwdFlowIn(_, node, _, cc, _, ap, config) and + apa = getApprox(ap) and + if PrevStage::parameterMayFlowThrough(node, _, apa, config) + then argAp = apSome(ap) + else argAp = apNone() + ) + or + // flow out of a callable + fwdFlowOutNotFromArg(node, cc, argAp, ap, config) + or + exists(DataFlowCall call, Ap argAp0 | + fwdFlowOutFromArg(call, node, argAp0, ap, config) and + fwdFlowIsEntered(call, cc, argAp, argAp0, config) + ) + } + + pragma[nomagic] + private predicate fwdFlowStore( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + exists(DataFlowType contentType | + fwdFlow(node1, cc, argAp, ap1, config) and + PrevStage::storeStepCand(node1, unbindApa(getApprox(ap1)), tc, node2, contentType, config) and + typecheckStore(ap1, contentType) + ) + } + + /** + * Holds if forward flow with access path `tail` reaches a store of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate fwdFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(TypedContent tc | + fwdFlowStore(_, tail, tc, _, _, _, config) and + tc.getContent() = c and + cons = apCons(tc, tail) + ) + } + + pragma[nomagic] + private predicate fwdFlowRead( + Ap ap, Content c, NodeEx node1, NodeEx node2, Cc cc, ApOption argAp, Configuration config + ) { + fwdFlow(node1, cc, argAp, ap, config) and + PrevStage::readStepCand(node1, c, node2, config) and + getHeadContent(ap) = c + } + + pragma[nomagic] + private predicate fwdFlowIn( + DataFlowCall call, ParamNodeEx p, Cc outercc, Cc innercc, ApOption argAp, Ap ap, + Configuration config + ) { + exists(ArgNodeEx arg, boolean allowsFieldFlow | + fwdFlow(arg, outercc, argAp, ap, config) and + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + innercc = getCallContextCall(call, p.getEnclosingCallable(), outercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutNotFromArg( + NodeEx out, Cc ccOut, ApOption argAp, Ap ap, Configuration config + ) { + exists( + DataFlowCall call, RetNodeEx ret, boolean allowsFieldFlow, CcNoCall innercc, + DataFlowCallable inner + | + fwdFlow(ret, innercc, argAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + inner = ret.getEnclosingCallable() and + ccOut = getCallContextReturn(inner, call, innercc) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate fwdFlowOutFromArg( + DataFlowCall call, NodeEx out, Ap argAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc | + fwdFlow(ret, ccc, apSome(argAp), ap, config) and + flowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an argument to `call` is reached in the flow covered by `fwdFlow` + * and data might flow through the target callable and back out at `call`. + */ + pragma[nomagic] + private predicate fwdFlowIsEntered( + DataFlowCall call, Cc cc, ApOption argAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p | + fwdFlowIn(call, p, cc, _, argAp, ap, config) and + PrevStage::parameterMayFlowThrough(p, _, unbindApa(getApprox(ap)), config) + ) + } + + pragma[nomagic] + private predicate storeStepFwd( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, Ap ap2, Configuration config + ) { + fwdFlowStore(node1, ap1, tc, node2, _, _, config) and + ap2 = apCons(tc, ap1) and + fwdFlowRead(ap2, tc.getContent(), _, _, _, _, config) + } + + private predicate readStepFwd( + NodeEx n1, Ap ap1, Content c, NodeEx n2, Ap ap2, Configuration config + ) { + fwdFlowRead(ap1, c, n1, n2, _, _, config) and + fwdFlowConsCand(ap1, c, ap2, config) + } + + pragma[nomagic] + private predicate callMayFlowThroughFwd(DataFlowCall call, Configuration config) { + exists(Ap argAp0, NodeEx out, Cc cc, ApOption argAp, Ap ap | + fwdFlow(out, pragma[only_bind_into](cc), pragma[only_bind_into](argAp), ap, + pragma[only_bind_into](config)) and + fwdFlowOutFromArg(call, out, argAp0, ap, config) and + fwdFlowIsEntered(pragma[only_bind_into](call), pragma[only_bind_into](cc), + pragma[only_bind_into](argAp), pragma[only_bind_into](argAp0), + pragma[only_bind_into](config)) + ) + } + + pragma[nomagic] + private predicate flowThroughIntoCall( + DataFlowCall call, ArgNodeEx arg, ParamNodeEx p, boolean allowsFieldFlow, Configuration config + ) { + flowIntoCall(call, arg, p, allowsFieldFlow, config) and + fwdFlow(arg, _, _, _, pragma[only_bind_into](config)) and + PrevStage::parameterMayFlowThrough(p, _, _, pragma[only_bind_into](config)) and + callMayFlowThroughFwd(call, pragma[only_bind_into](config)) + } + + pragma[nomagic] + private predicate returnNodeMayFlowThrough(RetNodeEx ret, Ap ap, Configuration config) { + fwdFlow(ret, any(CcCall ccc), apSome(_), ap, config) + } + + /** + * Holds if `node` with access path `ap` is part of a path from a source to a + * sink in the configuration `config`. + * + * The Boolean `toReturn` records whether the node must be returned from the + * enclosing callable in order to reach a sink, and if so, `returnAp` records + * the access path of the returned value. + */ + pragma[nomagic] + predicate revFlow(NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config) { + revFlow0(node, toReturn, returnAp, ap, config) and + fwdFlow(node, _, _, ap, config) + } + + pragma[nomagic] + private predicate revFlow0( + NodeEx node, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + fwdFlow(node, _, _, ap, config) and + sinkNode(node, config) and + (if hasSinkCallCtx(config) then toReturn = true else toReturn = false) and + returnAp = apNone() and + ap instanceof ApNil + or + exists(NodeEx mid | + localStep(node, mid, true, _, config, _) and + revFlow(mid, toReturn, returnAp, ap, config) + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + localStep(node, mid, false, _, config, _) and + revFlow(mid, toReturn, returnAp, nil, pragma[only_bind_into](config)) and + ap instanceof ApNil + ) + or + exists(NodeEx mid | + jumpStep(node, mid, config) and + revFlow(mid, _, _, ap, config) and + toReturn = false and + returnAp = apNone() + ) + or + exists(NodeEx mid, ApNil nil | + fwdFlow(node, _, _, ap, pragma[only_bind_into](config)) and + additionalJumpStep(node, mid, config) and + revFlow(pragma[only_bind_into](mid), _, _, nil, pragma[only_bind_into](config)) and + toReturn = false and + returnAp = apNone() and + ap instanceof ApNil + ) + or + // store + exists(Ap ap0, Content c | + revFlowStore(ap0, c, ap, node, _, _, toReturn, returnAp, config) and + revFlowConsCand(ap0, c, ap, config) + ) + or + // read + exists(NodeEx mid, Ap ap0 | + revFlow(mid, toReturn, returnAp, ap0, config) and + readStepFwd(node, ap, _, mid, ap0, config) + ) + or + // flow into a callable + revFlowInNotToReturn(node, returnAp, ap, config) and + toReturn = false + or + exists(DataFlowCall call, Ap returnAp0 | + revFlowInToReturn(call, node, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + or + // flow out of a callable + revFlowOut(_, node, _, _, ap, config) and + toReturn = true and + if returnNodeMayFlowThrough(node, ap, config) + then returnAp = apSome(ap) + else returnAp = apNone() + } + + pragma[nomagic] + private predicate revFlowStore( + Ap ap0, Content c, Ap ap, NodeEx node, TypedContent tc, NodeEx mid, boolean toReturn, + ApOption returnAp, Configuration config + ) { + revFlow(mid, toReturn, returnAp, ap0, config) and + storeStepFwd(node, ap, tc, mid, ap0, config) and + tc.getContent() = c + } + + /** + * Holds if reverse flow with access path `tail` reaches a read of `c` + * resulting in access path `cons`. + */ + pragma[nomagic] + private predicate revFlowConsCand(Ap cons, Content c, Ap tail, Configuration config) { + exists(NodeEx mid, Ap tail0 | + revFlow(mid, _, _, tail, config) and + tail = pragma[only_bind_into](tail0) and + readStepFwd(_, cons, c, mid, tail0, config) + ) + } + + pragma[nomagic] + private predicate revFlowOut( + DataFlowCall call, RetNodeEx ret, boolean toReturn, ApOption returnAp, Ap ap, + Configuration config + ) { + exists(NodeEx out, boolean allowsFieldFlow | + revFlow(out, toReturn, returnAp, ap, config) and + flowOutOfCall(call, ret, out, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInNotToReturn( + ArgNodeEx arg, ApOption returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, false, returnAp, ap, config) and + flowIntoCall(_, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + pragma[nomagic] + private predicate revFlowInToReturn( + DataFlowCall call, ArgNodeEx arg, Ap returnAp, Ap ap, Configuration config + ) { + exists(ParamNodeEx p, boolean allowsFieldFlow | + revFlow(p, true, apSome(returnAp), ap, config) and + flowThroughIntoCall(call, arg, p, allowsFieldFlow, config) and + if allowsFieldFlow = false then ap instanceof ApNil else any() + ) + } + + /** + * Holds if an output from `call` is reached in the flow covered by `revFlow` + * and data might flow through the target callable resulting in reverse flow + * reaching an argument of `call`. + */ + pragma[nomagic] + private predicate revFlowIsReturned( + DataFlowCall call, boolean toReturn, ApOption returnAp, Ap ap, Configuration config + ) { + exists(RetNodeEx ret, CcCall ccc | + revFlowOut(call, ret, toReturn, returnAp, ap, config) and + fwdFlow(ret, ccc, apSome(_), ap, config) and + ccc.matchesCall(call) + ) + } + + pragma[nomagic] + predicate storeStepCand( + NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, DataFlowType contentType, + Configuration config + ) { + exists(Ap ap2, Content c | + store(node1, tc, node2, contentType, config) and + revFlowStore(ap2, c, ap1, node1, tc, node2, _, _, config) and + revFlowConsCand(ap2, c, ap1, config) + ) + } + + predicate readStepCand(NodeEx node1, Content c, NodeEx node2, Configuration config) { + exists(Ap ap1, Ap ap2 | + revFlow(node2, _, _, pragma[only_bind_into](ap2), pragma[only_bind_into](config)) and + readStepFwd(node1, ap1, c, node2, ap2, config) and + revFlowStore(ap1, c, pragma[only_bind_into](ap2), _, _, _, _, _, + pragma[only_bind_into](config)) + ) + } + + predicate revFlow(NodeEx node, Configuration config) { revFlow(node, _, _, _, config) } + + private predicate fwdConsCand(TypedContent tc, Ap ap, Configuration config) { + storeStepFwd(_, ap, tc, _, _, config) + } + + predicate consCand(TypedContent tc, Ap ap, Configuration config) { + storeStepCand(_, ap, tc, _, _, config) + } + + pragma[noinline] + private predicate parameterFlow( + ParamNodeEx p, Ap ap, Ap ap0, DataFlowCallable c, Configuration config + ) { + revFlow(p, true, apSome(ap0), ap, config) and + c = p.getEnclosingCallable() + } + + predicate parameterMayFlowThrough(ParamNodeEx p, DataFlowCallable c, Ap ap, Configuration config) { + exists(RetNodeEx ret, Ap ap0, ReturnKindExt kind, int pos | + parameterFlow(p, ap, ap0, c, config) and + c = ret.getEnclosingCallable() and + revFlow(pragma[only_bind_into](ret), true, apSome(_), pragma[only_bind_into](ap0), + pragma[only_bind_into](config)) and + fwdFlow(ret, any(CcCall ccc), apSome(ap), ap0, config) and + kind = ret.getKind() and + p.getPosition() = pos and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + p.allowParameterReturnInSelf() + ) + ) + } + + pragma[nomagic] + predicate callMayFlowThroughRev(DataFlowCall call, Configuration config) { + exists(Ap returnAp0, ArgNodeEx arg, boolean toReturn, ApOption returnAp, Ap ap | + revFlow(arg, toReturn, returnAp, ap, config) and + revFlowInToReturn(call, arg, returnAp0, ap, config) and + revFlowIsReturned(call, toReturn, returnAp, returnAp0, config) + ) + } + + predicate stats(boolean fwd, int nodes, int fields, int conscand, int tuples, Configuration config) { + fwd = true and + nodes = count(NodeEx node | fwdFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | fwdConsCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and + tuples = count(NodeEx n, Cc cc, ApOption argAp, Ap ap | fwdFlow(n, cc, argAp, ap, config)) + or + fwd = false and + nodes = count(NodeEx node | revFlow(node, _, _, _, config)) and + fields = count(TypedContent f0 | consCand(f0, _, config)) and + conscand = count(TypedContent f0, Ap ap | consCand(f0, ap, config)) and + tuples = count(NodeEx n, boolean b, ApOption retAp, Ap ap | revFlow(n, b, retAp, ap, config)) + } + /* End: Stage 4 logic. */ +} + +bindingset[conf, result] +private Configuration unbindConf(Configuration conf) { + exists(Configuration c | result = pragma[only_bind_into](c) and conf = pragma[only_bind_into](c)) +} + +private predicate nodeMayUseSummary(NodeEx n, AccessPathApprox apa, Configuration config) { + exists(DataFlowCallable c, AccessPathApprox apa0 | + Stage4::parameterMayFlowThrough(_, c, apa, _) and + Stage4::revFlow(n, true, _, apa0, config) and + Stage4::fwdFlow(n, any(CallContextCall ccc), TAccessPathApproxSome(apa), apa0, config) and + n.getEnclosingCallable() = c + ) +} + +private newtype TSummaryCtx = + TSummaryCtxNone() or + TSummaryCtxSome(ParamNodeEx p, AccessPath ap) { + Stage4::parameterMayFlowThrough(p, _, ap.getApprox(), _) + } + +/** + * A context for generating flow summaries. This represents flow entry through + * a specific parameter with an access path of a specific shape. + * + * Summaries are only created for parameters that may flow through. + */ +abstract private class SummaryCtx extends TSummaryCtx { + abstract string toString(); +} + +/** A summary context from which no flow summary can be generated. */ +private class SummaryCtxNone extends SummaryCtx, TSummaryCtxNone { + override string toString() { result = "" } +} + +/** A summary context from which a flow summary can be generated. */ +private class SummaryCtxSome extends SummaryCtx, TSummaryCtxSome { + private ParamNodeEx p; + private AccessPath ap; + + SummaryCtxSome() { this = TSummaryCtxSome(p, ap) } + + int getParameterPos() { p.isParameterOf(_, result) } + + ParamNodeEx getParamNode() { result = p } + + override string toString() { result = p + ": " + ap } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + p.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** + * Gets the number of length 2 access path approximations that correspond to `apa`. + */ +private int count1to2unfold(AccessPathApproxCons1 apa, Configuration config) { + exists(TypedContent tc, int len | + tc = apa.getHead() and + len = apa.len() and + result = + strictcount(AccessPathFront apf | + Stage4::consCand(tc, any(AccessPathApprox ap | ap.getFront() = apf and ap.len() = len - 1), + config) + ) + ) +} + +private int countNodesUsingAccessPath(AccessPathApprox apa, Configuration config) { + result = + strictcount(NodeEx n | + Stage4::revFlow(n, _, _, apa, config) or nodeMayUseSummary(n, apa, config) + ) +} + +/** + * Holds if a length 2 access path approximation matching `apa` is expected + * to be expensive. + */ +private predicate expensiveLen1to2unfolding(AccessPathApproxCons1 apa, Configuration config) { + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = count1to2unfold(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + apLimit < aps and + tupleLimit < (aps - 1) * nodes + ) +} + +private AccessPathApprox getATail(AccessPathApprox apa, Configuration config) { + exists(TypedContent head | + apa.pop(head) = result and + Stage4::consCand(head, result, config) + ) +} + +/** + * Holds with `unfold = false` if a precise head-tail representation of `apa` is + * expected to be expensive. Holds with `unfold = true` otherwise. + */ +private predicate evalUnfold(AccessPathApprox apa, boolean unfold, Configuration config) { + if apa.getHead().forceHighPrecision() + then unfold = true + else + exists(int aps, int nodes, int apLimit, int tupleLimit | + aps = countPotentialAps(apa, config) and + nodes = countNodesUsingAccessPath(apa, config) and + accessPathCostLimits(apLimit, tupleLimit) and + if apLimit < aps and tupleLimit < (aps - 1) * nodes then unfold = false else unfold = true + ) +} + +/** + * Gets the number of `AccessPath`s that correspond to `apa`. + */ +private int countAps(AccessPathApprox apa, Configuration config) { + evalUnfold(apa, false, config) and + result = 1 and + (not apa instanceof AccessPathApproxCons1 or expensiveLen1to2unfolding(apa, config)) + or + evalUnfold(apa, false, config) and + result = count1to2unfold(apa, config) and + not expensiveLen1to2unfolding(apa, config) + or + evalUnfold(apa, true, config) and + result = countPotentialAps(apa, config) +} + +/** + * Gets the number of `AccessPath`s that would correspond to `apa` assuming + * that it is expanded to a precise head-tail representation. + */ +language[monotonicAggregates] +private int countPotentialAps(AccessPathApprox apa, Configuration config) { + apa instanceof AccessPathApproxNil and result = 1 + or + result = strictsum(AccessPathApprox tail | tail = getATail(apa, config) | countAps(tail, config)) +} + +private newtype TAccessPath = + TAccessPathNil(DataFlowType t) or + TAccessPathCons(TypedContent head, AccessPath tail) { + exists(AccessPathApproxCons apa | + not evalUnfold(apa, false, _) and + head = apa.getHead() and + tail.getApprox() = getATail(apa, _) + ) + } or + TAccessPathCons2(TypedContent head1, TypedContent head2, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + not expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head1 = apa.getHead() and + head2 = getATail(apa, _).getHead() + ) + } or + TAccessPathCons1(TypedContent head, int len) { + exists(AccessPathApproxCons apa | + evalUnfold(apa, false, _) and + expensiveLen1to2unfolding(apa, _) and + apa.len() = len and + head = apa.getHead() + ) + } + +private newtype TPathNode = + TPathNodeMid(NodeEx node, CallContext cc, SummaryCtx sc, AccessPath ap, Configuration config) { + // A PathNode is introduced by a source ... + Stage4::revFlow(node, config) and + sourceNode(node, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap = TAccessPathNil(node.getDataFlowType()) + or + // ... or a step from an existing PathNode to another node. + exists(PathNodeMid mid | + pathStep(mid, node, cc, sc, ap) and + pragma[only_bind_into](config) = mid.getConfiguration() and + Stage4::revFlow(node, _, _, ap.getApprox(), pragma[only_bind_into](config)) + ) + } or + TPathNodeSink(NodeEx node, Configuration config) { + exists(PathNodeMid sink | + sink.isAtSink() and + node = sink.getNodeEx() and + config = sink.getConfiguration() + ) + } + +/** + * A list of `TypedContent`s followed by a `DataFlowType`. If data flows from a + * source to a given node with a given `AccessPath`, this indicates the sequence + * of dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ +abstract private class AccessPath extends TAccessPath { + /** Gets the head of this access path, if any. */ + abstract TypedContent getHead(); + + /** Gets the tail of this access path, if any. */ + abstract AccessPath getTail(); + + /** Gets the front of this access path. */ + abstract AccessPathFront getFront(); + + /** Gets the approximation of this access path. */ + abstract AccessPathApprox getApprox(); + + /** Gets the length of this access path. */ + abstract int length(); + + /** Gets a textual representation of this access path. */ + abstract string toString(); + + /** Gets the access path obtained by popping `tc` from this access path, if any. */ + final AccessPath pop(TypedContent tc) { + result = this.getTail() and + tc = this.getHead() + } + + /** Gets the access path obtained by pushing `tc` onto this access path. */ + final AccessPath push(TypedContent tc) { this = result.pop(tc) } +} + +private class AccessPathNil extends AccessPath, TAccessPathNil { + private DataFlowType t; + + AccessPathNil() { this = TAccessPathNil(t) } + + DataFlowType getType() { result = t } + + override TypedContent getHead() { none() } + + override AccessPath getTail() { none() } + + override AccessPathFrontNil getFront() { result = TFrontNil(t) } + + override AccessPathApproxNil getApprox() { result = TNil(t) } + + override int length() { result = 0 } + + override string toString() { result = concat(": " + ppReprType(t)) } +} + +private class AccessPathCons extends AccessPath, TAccessPathCons { + private TypedContent head; + private AccessPath tail; + + AccessPathCons() { this = TAccessPathCons(head, tail) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { result = tail } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { + result = TConsNil(head, tail.(AccessPathNil).getType()) + or + result = TConsCons(head, tail.getHead(), this.length()) + or + result = TCons1(head, this.length()) + } + + override int length() { result = 1 + tail.length() } + + private string toStringImpl(boolean needsSuffix) { + exists(DataFlowType t | + tail = TAccessPathNil(t) and + needsSuffix = false and + result = head.toString() + "]" + concat(" : " + ppReprType(t)) + ) + or + result = head + ", " + tail.(AccessPathCons).toStringImpl(needsSuffix) + or + exists(TypedContent tc2, TypedContent tc3, int len | tail = TAccessPathCons2(tc2, tc3, len) | + result = head + ", " + tc2 + ", " + tc3 + ", ... (" and len > 2 and needsSuffix = true + or + result = head + ", " + tc2 + ", " + tc3 + "]" and len = 2 and needsSuffix = false + ) + or + exists(TypedContent tc2, int len | tail = TAccessPathCons1(tc2, len) | + result = head + ", " + tc2 + ", ... (" and len > 1 and needsSuffix = true + or + result = head + ", " + tc2 + "]" and len = 1 and needsSuffix = false + ) + } + + override string toString() { + result = "[" + this.toStringImpl(true) + this.length().toString() + ")]" + or + result = "[" + this.toStringImpl(false) + } +} + +private class AccessPathCons2 extends AccessPath, TAccessPathCons2 { + private TypedContent head1; + private TypedContent head2; + private int len; + + AccessPathCons2() { this = TAccessPathCons2(head1, head2, len) } + + override TypedContent getHead() { result = head1 } + + override AccessPath getTail() { + Stage4::consCand(head1, result.getApprox(), _) and + result.getHead() = head2 and + result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head1) } + + override AccessPathApproxCons getApprox() { + result = TConsCons(head1, head2, len) or + result = TCons1(head1, len) + } + + override int length() { result = len } + + override string toString() { + if len = 2 + then result = "[" + head1.toString() + ", " + head2.toString() + "]" + else + result = "[" + head1.toString() + ", " + head2.toString() + ", ... (" + len.toString() + ")]" + } +} + +private class AccessPathCons1 extends AccessPath, TAccessPathCons1 { + private TypedContent head; + private int len; + + AccessPathCons1() { this = TAccessPathCons1(head, len) } + + override TypedContent getHead() { result = head } + + override AccessPath getTail() { + Stage4::consCand(head, result.getApprox(), _) and result.length() = len - 1 + } + + override AccessPathFrontHead getFront() { result = TFrontHead(head) } + + override AccessPathApproxCons getApprox() { result = TCons1(head, len) } + + override int length() { result = len } + + override string toString() { + if len = 1 + then result = "[" + head.toString() + "]" + else result = "[" + head.toString() + ", ... (" + len.toString() + ")]" + } +} + +/** + * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. + * Only those `PathNode`s that are reachable from a source are generated. + */ +class PathNode extends TPathNode { + /** Gets a textual representation of this element. */ + string toString() { none() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { none() } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + none() + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.(PathNodeImpl).getNodeEx().projectToNode() = result } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + private PathNode getASuccessorIfHidden() { + this.(PathNodeImpl).isHidden() and + result = this.(PathNodeImpl).getASuccessorImpl() + } + + /** Gets a successor of this node, if any. */ + final PathNode getASuccessor() { + result = this.(PathNodeImpl).getASuccessorImpl().getASuccessorIfHidden*() and + not this.(PathNodeImpl).isHidden() and + not result.(PathNodeImpl).isHidden() + } + + /** Holds if this node is a source. */ + predicate isSource() { none() } +} + +abstract private class PathNodeImpl extends PathNode { + abstract PathNode getASuccessorImpl(); + + abstract NodeEx getNodeEx(); + + predicate isHidden() { + hiddenNode(this.getNodeEx().asNode()) and + not this.isSource() and + not this instanceof PathNodeSink + or + this.getNodeEx() instanceof TNodeImplicitRead + } + + private string ppAp() { + this instanceof PathNodeSink and result = "" + or + exists(string s | s = this.(PathNodeMid).getAp().toString() | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + this instanceof PathNodeSink and result = "" + or + result = " <" + this.(PathNodeMid).getCallContext().toString() + ">" + } + + override string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + override string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** Holds if `n` can reach a sink. */ +private predicate directReach(PathNode n) { + n instanceof PathNodeSink or directReach(n.getASuccessor()) +} + +/** Holds if `n` can reach a sink or is used in a subpath. */ +private predicate reach(PathNode n) { directReach(n) or Subpaths::retReach(n) } + +/** Holds if `n1.getASuccessor() = n2` and `n2` can reach a sink. */ +private predicate pathSucc(PathNode n1, PathNode n2) { n1.getASuccessor() = n2 and directReach(n2) } + +private predicate pathSuccPlus(PathNode n1, PathNode n2) = fastTC(pathSucc/2)(n1, n2) + +/** + * Provides the query predicates needed to include a graph in a path-problem query. + */ +module PathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PathNode a, PathNode b) { a.getASuccessor() = b and reach(b) } + + /** Holds if `n` is a node in the graph of data flow path explanations. */ + query predicate nodes(PathNode n, string key, string val) { + reach(n) and key = "semmle.label" and val = n.toString() + } + + query predicate subpaths = Subpaths::subpaths/4; +} + +/** + * An intermediate flow graph node. This is a triple consisting of a `Node`, + * a `CallContext`, and a `Configuration`. + */ +private class PathNodeMid extends PathNodeImpl, TPathNodeMid { + NodeEx node; + CallContext cc; + SummaryCtx sc; + AccessPath ap; + Configuration config; + + PathNodeMid() { this = TPathNodeMid(node, cc, sc, ap, config) } + + override NodeEx getNodeEx() { result = node } + + CallContext getCallContext() { result = cc } + + SummaryCtx getSummaryCtx() { result = sc } + + AccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + private PathNodeMid getSuccMid() { + pathStep(this, result.getNodeEx(), result.getCallContext(), result.getSummaryCtx(), + result.getAp()) and + result.getConfiguration() = unbindConf(this.getConfiguration()) + } + + override PathNodeImpl getASuccessorImpl() { + // an intermediate step to another intermediate node + result = this.getSuccMid() + or + // a final step to a sink + result = this.getSuccMid().projectToSink() + } + + override predicate isSource() { + sourceNode(node, config) and + ( + if hasSourceCallCtx(config) + then cc instanceof CallContextSomeCall + else cc instanceof CallContextAny + ) and + sc instanceof SummaryCtxNone and + ap instanceof AccessPathNil + } + + predicate isAtSink() { + sinkNode(node, config) and + ap instanceof AccessPathNil and + if hasSinkCallCtx(config) + then + // For `FeatureHasSinkCallContext` the condition `cc instanceof CallContextNoCall` + // is exactly what we need to check. This also implies + // `sc instanceof SummaryCtxNone`. + // For `FeatureEqualSourceSinkCallContext` the initial call context was + // set to `CallContextSomeCall` and jumps are disallowed, so + // `cc instanceof CallContextNoCall` never holds. On the other hand, + // in this case there's never any need to enter a call except to identify + // a summary, so the condition in `pathIntoCallable` enforces this, which + // means that `sc instanceof SummaryCtxNone` holds if and only if we are + // in the call context of the source. + sc instanceof SummaryCtxNone or + cc instanceof CallContextNoCall + else any() + } + + PathNodeSink projectToSink() { + this.isAtSink() and + result.getNodeEx() = node and + result.getConfiguration() = unbindConf(config) + } +} + +/** + * A flow graph node corresponding to a sink. This is disjoint from the + * intermediate nodes in order to uniquely correspond to a given sink by + * excluding the `CallContext`. + */ +private class PathNodeSink extends PathNodeImpl, TPathNodeSink { + NodeEx node; + Configuration config; + + PathNodeSink() { this = TPathNodeSink(node, config) } + + override NodeEx getNodeEx() { result = node } + + override Configuration getConfiguration() { result = config } + + override PathNode getASuccessorImpl() { none() } + + override predicate isSource() { sourceNode(node, config) } +} + +/** + * Holds if data may flow from `mid` to `node`. The last step in or out of + * a callable is recorded by `cc`. + */ +private predicate pathStep( + PathNodeMid mid, NodeEx node, CallContext cc, SummaryCtx sc, AccessPath ap +) { + exists(AccessPath ap0, NodeEx midnode, Configuration conf, LocalCallContext localCC | + midnode = mid.getNodeEx() and + conf = mid.getConfiguration() and + cc = mid.getCallContext() and + sc = mid.getSummaryCtx() and + localCC = + getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)), + midnode.getEnclosingCallable()) and + ap0 = mid.getAp() + | + localFlowBigStep(midnode, node, true, _, conf, localCC) and + ap = ap0 + or + localFlowBigStep(midnode, node, false, ap.getFront(), conf, localCC) and + ap0 instanceof AccessPathNil + ) + or + jumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + ap = mid.getAp() + or + additionalJumpStep(mid.getNodeEx(), node, mid.getConfiguration()) and + cc instanceof CallContextAny and + sc instanceof SummaryCtxNone and + mid.getAp() instanceof AccessPathNil and + ap = TAccessPathNil(node.getDataFlowType()) + or + exists(TypedContent tc | pathStoreStep(mid, node, ap.pop(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + exists(TypedContent tc | pathReadStep(mid, node, ap.push(tc), tc, cc)) and + sc = mid.getSummaryCtx() + or + pathIntoCallable(mid, node, _, cc, sc, _, _) and ap = mid.getAp() + or + pathOutOfCallable(mid, node, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone + or + pathThroughCallable(mid, node, cc, ap) and sc = mid.getSummaryCtx() +} + +pragma[nomagic] +private predicate pathReadStep( + PathNodeMid mid, NodeEx node, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + tc = ap0.getHead() and + Stage4::readStepCand(mid.getNodeEx(), tc.getContent(), node, mid.getConfiguration()) and + cc = mid.getCallContext() +} + +pragma[nomagic] +private predicate pathStoreStep( + PathNodeMid mid, NodeEx node, AccessPath ap0, TypedContent tc, CallContext cc +) { + ap0 = mid.getAp() and + Stage4::storeStepCand(mid.getNodeEx(), _, tc, node, _, mid.getConfiguration()) and + cc = mid.getCallContext() +} + +private predicate pathOutOfCallable0( + PathNodeMid mid, ReturnPosition pos, CallContext innercc, AccessPathApprox apa, + Configuration config +) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + apa = mid.getAp().getApprox() and + config = mid.getConfiguration() +} + +pragma[nomagic] +private predicate pathOutOfCallable1( + PathNodeMid mid, DataFlowCall call, ReturnKindExt kind, CallContext cc, AccessPathApprox apa, + Configuration config +) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + pathOutOfCallable0(mid, pos, innercc, apa, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) +} + +pragma[noinline] +private NodeEx getAnOutNodeFlow( + ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config +) { + result.asNode() = kind.getAnOutNode(call) and + Stage4::revFlow(result, _, _, apa, config) +} + +/** + * Holds if data may flow from `mid` to `out`. The last step of this path + * is a return from a callable and is recorded by `cc`, if needed. + */ +pragma[noinline] +private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, CallContext cc) { + exists(ReturnKindExt kind, DataFlowCall call, AccessPathApprox apa, Configuration config | + pathOutOfCallable1(mid, call, kind, cc, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` to the `i`th argument of `call` in `cc`. + */ +pragma[noinline] +private predicate pathIntoArg( + PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa, + Configuration config +) { + exists(ArgNode arg | + arg = mid.getNodeEx().asNode() and + cc = mid.getCallContext() and + arg.argumentOf(call, i) and + ap = mid.getAp() and + apa = ap.getApprox() and + config = mid.getConfiguration() + ) +} + +pragma[nomagic] +private predicate parameterCand( + DataFlowCallable callable, int i, AccessPathApprox apa, Configuration config +) { + exists(ParamNodeEx p | + Stage4::revFlow(p, _, _, apa, config) and + p.isParameterOf(callable, i) + ) +} + +pragma[nomagic] +private predicate pathIntoCallable0( + PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call, + AccessPath ap, Configuration config +) { + exists(AccessPathApprox apa | + pathIntoArg(mid, pragma[only_bind_into](i), outercc, call, ap, pragma[only_bind_into](apa), + pragma[only_bind_into](config)) and + callable = resolveCall(call, outercc) and + parameterCand(callable, pragma[only_bind_into](i), pragma[only_bind_into](apa), + pragma[only_bind_into](config)) + ) +} + +/** + * Holds if data may flow from `mid` to `p` through `call`. The contexts + * before and after entering the callable are `outercc` and `innercc`, + * respectively. + */ +pragma[nomagic] +private predicate pathIntoCallable( + PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc, + DataFlowCall call, Configuration config +) { + exists(int i, DataFlowCallable callable, AccessPath ap | + pathIntoCallable0(mid, callable, i, outercc, call, ap, config) and + p.isParameterOf(callable, i) and + ( + sc = TSummaryCtxSome(p, ap) + or + not exists(TSummaryCtxSome(p, ap)) and + sc = TSummaryCtxNone() and + // When the call contexts of source and sink needs to match then there's + // never any reason to enter a callable except to find a summary. See also + // the comment in `PathNodeMid::isAtSink`. + not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext + ) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) +} + +/** Holds if data may flow from a parameter given by `sc` to a return of kind `kind`. */ +pragma[nomagic] +private predicate paramFlowsThrough( + ReturnKindExt kind, CallContextCall cc, SummaryCtxSome sc, AccessPath ap, AccessPathApprox apa, + Configuration config +) { + exists(PathNodeMid mid, RetNodeEx ret, int pos | + mid.getNodeEx() = ret and + kind = ret.getKind() and + cc = mid.getCallContext() and + sc = mid.getSummaryCtx() and + config = mid.getConfiguration() and + ap = mid.getAp() and + apa = ap.getApprox() and + pos = sc.getParameterPos() and + // we don't expect a parameter to return stored in itself, unless explicitly allowed + ( + not kind.(ParamUpdateReturnKind).getPosition() = pos + or + sc.getParamNode().allowParameterReturnInSelf() + ) + ) +} + +pragma[nomagic] +private predicate pathThroughCallable0( + DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap, + AccessPathApprox apa, Configuration config +) { + exists(CallContext innercc, SummaryCtx sc | + pathIntoCallable(mid, _, cc, innercc, sc, call, config) and + paramFlowsThrough(kind, innercc, sc, ap, apa, config) + ) +} + +/** + * Holds if data may flow from `mid` through a callable to the node `out`. + * The context `cc` is restored to its value prior to entering the callable. + */ +pragma[noinline] +private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) { + exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config | + pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and + out = getAnOutNodeFlow(kind, call, apa, config) + ) +} + +private module Subpaths { + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths01( + PathNodeImpl arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, AccessPath apout + ) { + exists(Configuration config | + pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and + pathIntoCallable(arg, par, _, innercc, sc, _, config) and + paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config)) and + not arg.isHidden() + ) + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple and `ret` is determined by + * `kind`, `sc`, `apout`, and `innercc`. + */ + pragma[nomagic] + private predicate subpaths02( + PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, + NodeEx out, AccessPath apout + ) { + subpaths01(arg, par, sc, innercc, kind, out, apout) and + out.asNode() = kind.getAnOutNode(_) + } + + pragma[nomagic] + private Configuration getPathNodeConf(PathNode n) { result = n.getConfiguration() } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple. + */ + pragma[nomagic] + private predicate subpaths03( + PathNode arg, ParamNodeEx par, PathNodeMid ret, NodeEx out, AccessPath apout + ) { + exists(SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind, RetNodeEx retnode | + subpaths02(arg, par, sc, innercc, kind, out, apout) and + ret.getNodeEx() = retnode and + kind = retnode.getKind() and + innercc = ret.getCallContext() and + sc = ret.getSummaryCtx() and + ret.getConfiguration() = unbindConf(getPathNodeConf(arg)) and + apout = ret.getAp() + ) + } + + private PathNodeImpl localStepToHidden(PathNodeImpl n) { + n.getASuccessorImpl() = result and + result.isHidden() and + exists(NodeEx n1, NodeEx n2 | n1 = n.getNodeEx() and n2 = result.getNodeEx() | + localFlowBigStep(n1, n2, _, _, _, _) or + store(n1, _, n2, _, _) or + read(n1, _, n2, _) + ) + } + + /** + * Holds if `(arg, par, ret, out)` forms a subpath-tuple, that is, flow through + * a subpath between `par` and `ret` with the connecting edges `arg -> par` and + * `ret -> out` is summarized as the edge `arg -> out`. + */ + predicate subpaths(PathNode arg, PathNodeImpl par, PathNodeImpl ret, PathNodeMid out) { + exists(ParamNodeEx p, NodeEx o, AccessPath apout | + pragma[only_bind_into](arg).getASuccessor() = par and + pragma[only_bind_into](arg).getASuccessor() = out and + subpaths03(arg, p, localStepToHidden*(ret), o, apout) and + not ret.isHidden() and + par.getNodeEx() = p and + out.getNodeEx() = o and + out.getAp() = apout + ) + } + + /** + * Holds if `n` can reach a return node in a summarized subpath. + */ + predicate retReach(PathNode n) { + subpaths(_, _, n, _) + or + exists(PathNode mid | + retReach(mid) and + n.getASuccessor() = mid and + not subpaths(_, mid, _, _) + ) + } +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +private predicate flowsTo( + PathNode flowsource, PathNodeSink flowsink, Node source, Node sink, Configuration configuration +) { + flowsource.isSource() and + flowsource.getConfiguration() = configuration and + flowsource.(PathNodeImpl).getNodeEx().asNode() = source and + (flowsource = flowsink or pathSuccPlus(flowsource, flowsink)) and + flowsink.getNodeEx().asNode() = sink +} + +/** + * Holds if data can flow (inter-procedurally) from `source` to `sink`. + * + * Will only have results if `configuration` has non-empty sources and + * sinks. + */ +predicate flowsTo(Node source, Node sink, Configuration configuration) { + flowsTo(_, _, source, sink, configuration) +} + +private predicate finalStats(boolean fwd, int nodes, int fields, int conscand, int tuples) { + fwd = true and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0)) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0)) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap)) and + tuples = count(PathNode pn) + or + fwd = false and + nodes = count(NodeEx n0 | exists(PathNodeImpl pn | pn.getNodeEx() = n0 and reach(pn))) and + fields = count(TypedContent f0 | exists(PathNodeMid pn | pn.getAp().getHead() = f0 and reach(pn))) and + conscand = count(AccessPath ap | exists(PathNodeMid pn | pn.getAp() = ap and reach(pn))) and + tuples = count(PathNode pn | reach(pn)) +} + +/** + * INTERNAL: Only for debugging. + * + * Calculates per-stage metrics for data flow. + */ +predicate stageStats( + int n, string stage, int nodes, int fields, int conscand, int tuples, Configuration config +) { + stage = "1 Fwd" and n = 10 and Stage1::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "1 Rev" and n = 15 and Stage1::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "2 Fwd" and n = 20 and Stage2::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "2 Rev" and n = 25 and Stage2::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "3 Fwd" and n = 30 and Stage3::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "3 Rev" and n = 35 and Stage3::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "4 Fwd" and n = 40 and Stage4::stats(true, nodes, fields, conscand, tuples, config) + or + stage = "4 Rev" and n = 45 and Stage4::stats(false, nodes, fields, conscand, tuples, config) + or + stage = "5 Fwd" and n = 50 and finalStats(true, nodes, fields, conscand, tuples) + or + stage = "5 Rev" and n = 55 and finalStats(false, nodes, fields, conscand, tuples) +} + +private module FlowExploration { + private predicate callableStep(DataFlowCallable c1, DataFlowCallable c2, Configuration config) { + exists(NodeEx node1, NodeEx node2 | + jumpStep(node1, node2, config) + or + additionalJumpStep(node1, node2, config) + or + // flow into callable + viableParamArgEx(_, node2, node1) + or + // flow out of a callable + viableReturnPosOutEx(_, node1.(RetNodeEx).getReturnPosition(), node2) + | + c1 = node1.getEnclosingCallable() and + c2 = node2.getEnclosingCallable() and + c1 != c2 + ) + } + + private predicate interestingCallableSrc(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSource(n) and c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSrc(mid, config) and callableStep(mid, c, config) + ) + } + + private predicate interestingCallableSink(DataFlowCallable c, Configuration config) { + exists(Node n | config.isSink(n) and c = getNodeEnclosingCallable(n)) + or + exists(DataFlowCallable mid | + interestingCallableSink(mid, config) and callableStep(c, mid, config) + ) + } + + private newtype TCallableExt = + TCallable(DataFlowCallable c, Configuration config) { + interestingCallableSrc(c, config) or + interestingCallableSink(c, config) + } or + TCallableSrc() or + TCallableSink() + + private predicate callableExtSrc(TCallableSrc src) { any() } + + private predicate callableExtSink(TCallableSink sink) { any() } + + private predicate callableExtStepFwd(TCallableExt ce1, TCallableExt ce2) { + exists(DataFlowCallable c1, DataFlowCallable c2, Configuration config | + callableStep(c1, c2, config) and + ce1 = TCallable(c1, pragma[only_bind_into](config)) and + ce2 = TCallable(c2, pragma[only_bind_into](config)) + ) + or + exists(Node n, Configuration config | + ce1 = TCallableSrc() and + config.isSource(n) and + ce2 = TCallable(getNodeEnclosingCallable(n), config) + ) + or + exists(Node n, Configuration config | + ce2 = TCallableSink() and + config.isSink(n) and + ce1 = TCallable(getNodeEnclosingCallable(n), config) + ) + } + + private predicate callableExtStepRev(TCallableExt ce1, TCallableExt ce2) { + callableExtStepFwd(ce2, ce1) + } + + private int distSrcExt(TCallableExt c) = + shortestDistances(callableExtSrc/1, callableExtStepFwd/2)(_, c, result) + + private int distSinkExt(TCallableExt c) = + shortestDistances(callableExtSink/1, callableExtStepRev/2)(_, c, result) + + private int distSrc(DataFlowCallable c, Configuration config) { + result = distSrcExt(TCallable(c, config)) - 1 + } + + private int distSink(DataFlowCallable c, Configuration config) { + result = distSinkExt(TCallable(c, config)) - 1 + } + + private newtype TPartialAccessPath = + TPartialNil(DataFlowType t) or + TPartialCons(TypedContent tc, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `TypedContent`s followed by a `Type`, but only the first + * element of the list and its length are tracked. If data flows from a source to + * a given node with a given `AccessPath`, this indicates the sequence of + * dereference operations needed to get from the value in the node to the + * tracked object. The final type indicates the type of the tracked object. + */ + private class PartialAccessPath extends TPartialAccessPath { + abstract string toString(); + + TypedContent getHead() { this = TPartialCons(result, _) } + + int len() { + this = TPartialNil(_) and result = 0 + or + this = TPartialCons(_, result) + } + + DataFlowType getType() { + this = TPartialNil(result) + or + exists(TypedContent head | this = TPartialCons(head, _) | result = head.getContainerType()) + } + } + + private class PartialAccessPathNil extends PartialAccessPath, TPartialNil { + override string toString() { + exists(DataFlowType t | this = TPartialNil(t) | result = concat(": " + ppReprType(t))) + } + } + + private class PartialAccessPathCons extends PartialAccessPath, TPartialCons { + override string toString() { + exists(TypedContent tc, int len | this = TPartialCons(tc, len) | + if len = 1 + then result = "[" + tc.toString() + "]" + else result = "[" + tc.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private newtype TRevPartialAccessPath = + TRevPartialNil() or + TRevPartialCons(Content c, int len) { len in [1 .. accessPathLimit()] } + + /** + * Conceptually a list of `Content`s, but only the first + * element of the list and its length are tracked. + */ + private class RevPartialAccessPath extends TRevPartialAccessPath { + abstract string toString(); + + Content getHead() { this = TRevPartialCons(result, _) } + + int len() { + this = TRevPartialNil() and result = 0 + or + this = TRevPartialCons(_, result) + } + } + + private class RevPartialAccessPathNil extends RevPartialAccessPath, TRevPartialNil { + override string toString() { result = "" } + } + + private class RevPartialAccessPathCons extends RevPartialAccessPath, TRevPartialCons { + override string toString() { + exists(Content c, int len | this = TRevPartialCons(c, len) | + if len = 1 + then result = "[" + c.toString() + "]" + else result = "[" + c.toString() + ", ... (" + len.toString() + ")]" + ) + } + } + + private newtype TSummaryCtx1 = + TSummaryCtx1None() or + TSummaryCtx1Param(ParamNodeEx p) + + private newtype TSummaryCtx2 = + TSummaryCtx2None() or + TSummaryCtx2Some(PartialAccessPath ap) + + private newtype TRevSummaryCtx1 = + TRevSummaryCtx1None() or + TRevSummaryCtx1Some(ReturnPosition pos) + + private newtype TRevSummaryCtx2 = + TRevSummaryCtx2None() or + TRevSummaryCtx2Some(RevPartialAccessPath ap) + + private newtype TPartialPathNode = + TPartialPathNodeFwd( + NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, PartialAccessPath ap, + Configuration config + ) { + sourceNode(node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap = TPartialNil(node.getDataFlowType()) and + not fullBarrier(node, config) and + exists(config.explorationLimit()) + or + partialPathNodeMk0(node, cc, sc1, sc2, ap, config) and + distSrc(node.getEnclosingCallable(), config) <= config.explorationLimit() + } or + TPartialPathNodeRev( + NodeEx node, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, RevPartialAccessPath ap, + Configuration config + ) { + sinkNode(node, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = TRevPartialNil() and + not fullBarrier(node, config) and + exists(config.explorationLimit()) + or + exists(PartialPathNodeRev mid | + revPartialPathStep(mid, node, sc1, sc2, ap, config) and + not clearsContentCached(node.asNode(), ap.getHead()) and + not fullBarrier(node, config) and + distSink(node.getEnclosingCallable(), config) <= config.explorationLimit() + ) + } + + pragma[nomagic] + private predicate partialPathNodeMk0( + NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, PartialAccessPath ap, + Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStep(mid, node, cc, sc1, sc2, ap, config) and + not fullBarrier(node, config) and + not clearsContentCached(node.asNode(), ap.getHead().getContent()) and + if node.asNode() instanceof CastingNode + then compatibleTypes(node.getDataFlowType(), ap.getType()) + else any() + ) + } + + /** + * A `Node` augmented with a call context, an access path, and a configuration. + */ + class PartialPathNode extends TPartialPathNode { + /** Gets a textual representation of this element. */ + string toString() { result = this.getNodeEx().toString() + this.ppAp() } + + /** + * Gets a textual representation of this element, including a textual + * representation of the call context. + */ + string toStringWithContext() { + result = this.getNodeEx().toString() + this.ppAp() + this.ppCtx() + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.getNodeEx().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the underlying `Node`. */ + final Node getNode() { this.getNodeEx().projectToNode() = result } + + private NodeEx getNodeEx() { + result = this.(PartialPathNodeFwd).getNodeEx() or + result = this.(PartialPathNodeRev).getNodeEx() + } + + /** Gets the associated configuration. */ + Configuration getConfiguration() { none() } + + /** Gets a successor of this node, if any. */ + PartialPathNode getASuccessor() { none() } + + /** + * Gets the approximate distance to the nearest source measured in number + * of interprocedural steps. + */ + int getSourceDistance() { + result = distSrc(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + /** + * Gets the approximate distance to the nearest sink measured in number + * of interprocedural steps. + */ + int getSinkDistance() { + result = distSink(this.getNodeEx().getEnclosingCallable(), this.getConfiguration()) + } + + private string ppAp() { + exists(string s | + s = this.(PartialPathNodeFwd).getAp().toString() or + s = this.(PartialPathNodeRev).getAp().toString() + | + if s = "" then result = "" else result = " " + s + ) + } + + private string ppCtx() { + result = " <" + this.(PartialPathNodeFwd).getCallContext().toString() + ">" + } + + /** Holds if this is a source in a forward-flow path. */ + predicate isFwdSource() { this.(PartialPathNodeFwd).isSource() } + + /** Holds if this is a sink in a reverse-flow path. */ + predicate isRevSink() { this.(PartialPathNodeRev).isSink() } + } + + /** + * Provides the query predicates needed to include a graph in a path-problem query. + */ + module PartialPathGraph { + /** Holds if `(a,b)` is an edge in the graph of data flow path explanations. */ + query predicate edges(PartialPathNode a, PartialPathNode b) { a.getASuccessor() = b } + } + + private class PartialPathNodeFwd extends PartialPathNode, TPartialPathNodeFwd { + NodeEx node; + CallContext cc; + TSummaryCtx1 sc1; + TSummaryCtx2 sc2; + PartialAccessPath ap; + Configuration config; + + PartialPathNodeFwd() { this = TPartialPathNodeFwd(node, cc, sc1, sc2, ap, config) } + + NodeEx getNodeEx() { result = node } + + CallContext getCallContext() { result = cc } + + TSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TSummaryCtx2 getSummaryCtx2() { result = sc2 } + + PartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeFwd getASuccessor() { + partialPathStep(this, result.getNodeEx(), result.getCallContext(), result.getSummaryCtx1(), + result.getSummaryCtx2(), result.getAp(), result.getConfiguration()) + } + + predicate isSource() { + sourceNode(node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap instanceof TPartialNil + } + } + + private class PartialPathNodeRev extends PartialPathNode, TPartialPathNodeRev { + NodeEx node; + TRevSummaryCtx1 sc1; + TRevSummaryCtx2 sc2; + RevPartialAccessPath ap; + Configuration config; + + PartialPathNodeRev() { this = TPartialPathNodeRev(node, sc1, sc2, ap, config) } + + NodeEx getNodeEx() { result = node } + + TRevSummaryCtx1 getSummaryCtx1() { result = sc1 } + + TRevSummaryCtx2 getSummaryCtx2() { result = sc2 } + + RevPartialAccessPath getAp() { result = ap } + + override Configuration getConfiguration() { result = config } + + override PartialPathNodeRev getASuccessor() { + revPartialPathStep(result, this.getNodeEx(), this.getSummaryCtx1(), this.getSummaryCtx2(), + this.getAp(), this.getConfiguration()) + } + + predicate isSink() { + sinkNode(node, config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = TRevPartialNil() + } + } + + private predicate partialPathStep( + PartialPathNodeFwd mid, NodeEx node, CallContext cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + PartialAccessPath ap, Configuration config + ) { + not isUnreachableInCallCached(node.asNode(), cc.(CallContextSpecificCall).getCall()) and + ( + localFlowStep(mid.getNodeEx(), node, config) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(mid.getNodeEx(), node, config) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + ) + or + jumpStep(mid.getNodeEx(), node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(mid.getNodeEx(), node, config) and + cc instanceof CallContextAny and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() and + mid.getAp() instanceof PartialAccessPathNil and + ap = TPartialNil(node.getDataFlowType()) and + config = mid.getConfiguration() + or + partialPathStoreStep(mid, _, _, node, ap) and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() + or + exists(PartialAccessPath ap0, TypedContent tc | + partialPathReadStep(mid, ap0, tc, node, cc, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + apConsFwd(ap, tc, ap0, config) + ) + or + partialPathIntoCallable(mid, node, _, cc, sc1, sc2, _, ap, config) + or + partialPathOutOfCallable(mid, node, cc, ap, config) and + sc1 = TSummaryCtx1None() and + sc2 = TSummaryCtx2None() + or + partialPathThroughCallable(mid, node, cc, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() + } + + bindingset[result, i] + private int unbindInt(int i) { i <= result and i >= result } + + pragma[inline] + private predicate partialPathStoreStep( + PartialPathNodeFwd mid, PartialAccessPath ap1, TypedContent tc, NodeEx node, + PartialAccessPath ap2 + ) { + exists(NodeEx midNode, DataFlowType contentType | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + store(midNode, tc, node, contentType, mid.getConfiguration()) and + ap2.getHead() = tc and + ap2.len() = unbindInt(ap1.len() + 1) and + compatibleTypes(ap1.getType(), contentType) + ) + } + + pragma[nomagic] + private predicate apConsFwd( + PartialAccessPath ap1, TypedContent tc, PartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeFwd mid | + partialPathStoreStep(mid, ap1, tc, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate partialPathReadStep( + PartialPathNodeFwd mid, PartialAccessPath ap, TypedContent tc, NodeEx node, CallContext cc, + Configuration config + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + read(midNode, tc.getContent(), node, pragma[only_bind_into](config)) and + ap.getHead() = tc and + pragma[only_bind_into](config) = mid.getConfiguration() and + cc = mid.getCallContext() + ) + } + + private predicate partialPathOutOfCallable0( + PartialPathNodeFwd mid, ReturnPosition pos, CallContext innercc, PartialAccessPath ap, + Configuration config + ) { + pos = mid.getNodeEx().(RetNodeEx).getReturnPosition() and + innercc = mid.getCallContext() and + innercc instanceof CallContextNoCall and + ap = mid.getAp() and + config = mid.getConfiguration() + } + + pragma[nomagic] + private predicate partialPathOutOfCallable1( + PartialPathNodeFwd mid, DataFlowCall call, ReturnKindExt kind, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(ReturnPosition pos, DataFlowCallable c, CallContext innercc | + partialPathOutOfCallable0(mid, pos, innercc, ap, config) and + c = pos.getCallable() and + kind = pos.getKind() and + resolveReturn(innercc, c, call) + | + if reducedViableImplInReturn(c, call) then cc = TReturn(c, call) else cc = TAnyCallContext() + ) + } + + private predicate partialPathOutOfCallable( + PartialPathNodeFwd mid, NodeEx out, CallContext cc, PartialAccessPath ap, Configuration config + ) { + exists(ReturnKindExt kind, DataFlowCall call | + partialPathOutOfCallable1(mid, call, kind, cc, ap, config) + | + out.asNode() = kind.getAnOutNode(call) + ) + } + + pragma[noinline] + private predicate partialPathIntoArg( + PartialPathNodeFwd mid, int i, CallContext cc, DataFlowCall call, PartialAccessPath ap, + Configuration config + ) { + exists(ArgNode arg | + arg = mid.getNodeEx().asNode() and + cc = mid.getCallContext() and + arg.argumentOf(call, i) and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate partialPathIntoCallable0( + PartialPathNodeFwd mid, DataFlowCallable callable, int i, CallContext outercc, + DataFlowCall call, PartialAccessPath ap, Configuration config + ) { + partialPathIntoArg(mid, i, outercc, call, ap, config) and + callable = resolveCall(call, outercc) + } + + private predicate partialPathIntoCallable( + PartialPathNodeFwd mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, + TSummaryCtx1 sc1, TSummaryCtx2 sc2, DataFlowCall call, PartialAccessPath ap, + Configuration config + ) { + exists(int i, DataFlowCallable callable | + partialPathIntoCallable0(mid, callable, i, outercc, call, ap, config) and + p.isParameterOf(callable, i) and + sc1 = TSummaryCtx1Param(p) and + sc2 = TSummaryCtx2Some(ap) + | + if recordDataFlowCallSite(call, callable) + then innercc = TSpecificCall(call) + else innercc = TSomeCall() + ) + } + + pragma[nomagic] + private predicate paramFlowsThroughInPartialPath( + ReturnKindExt kind, CallContextCall cc, TSummaryCtx1 sc1, TSummaryCtx2 sc2, + PartialAccessPath ap, Configuration config + ) { + exists(PartialPathNodeFwd mid, RetNodeEx ret | + mid.getNodeEx() = ret and + kind = ret.getKind() and + cc = mid.getCallContext() and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() and + ap = mid.getAp() + ) + } + + pragma[noinline] + private predicate partialPathThroughCallable0( + DataFlowCall call, PartialPathNodeFwd mid, ReturnKindExt kind, CallContext cc, + PartialAccessPath ap, Configuration config + ) { + exists(CallContext innercc, TSummaryCtx1 sc1, TSummaryCtx2 sc2 | + partialPathIntoCallable(mid, _, cc, innercc, sc1, sc2, call, _, config) and + paramFlowsThroughInPartialPath(kind, innercc, sc1, sc2, ap, config) + ) + } + + private predicate partialPathThroughCallable( + PartialPathNodeFwd mid, NodeEx out, CallContext cc, PartialAccessPath ap, Configuration config + ) { + exists(DataFlowCall call, ReturnKindExt kind | + partialPathThroughCallable0(call, mid, kind, cc, ap, config) and + out.asNode() = kind.getAnOutNode(call) + ) + } + + private predicate revPartialPathStep( + PartialPathNodeRev mid, NodeEx node, TRevSummaryCtx1 sc1, TRevSummaryCtx2 sc2, + RevPartialAccessPath ap, Configuration config + ) { + localFlowStep(node, mid.getNodeEx(), config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalLocalFlowStep(node, mid.getNodeEx(), config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + jumpStep(node, mid.getNodeEx(), config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + or + additionalJumpStep(node, mid.getNodeEx(), config) and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + mid.getAp() instanceof RevPartialAccessPathNil and + ap = TRevPartialNil() and + config = mid.getConfiguration() + or + revPartialPathReadStep(mid, _, _, node, ap) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + config = mid.getConfiguration() + or + exists(RevPartialAccessPath ap0, Content c | + revPartialPathStoreStep(mid, ap0, c, node, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + apConsRev(ap, c, ap0, config) + ) + or + exists(ParamNodeEx p | + mid.getNodeEx() = p and + viableParamArgEx(_, p, node) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + sc1 = TRevSummaryCtx1None() and + sc2 = TRevSummaryCtx2None() and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + or + exists(ReturnPosition pos | + revPartialPathIntoReturn(mid, pos, sc1, sc2, _, ap, config) and + pos = getReturnPosition(node.asNode()) + ) + or + revPartialPathThroughCallable(mid, node, ap, config) and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() + } + + pragma[inline] + private predicate revPartialPathReadStep( + PartialPathNodeRev mid, RevPartialAccessPath ap1, Content c, NodeEx node, + RevPartialAccessPath ap2 + ) { + exists(NodeEx midNode | + midNode = mid.getNodeEx() and + ap1 = mid.getAp() and + read(node, c, midNode, mid.getConfiguration()) and + ap2.getHead() = c and + ap2.len() = unbindInt(ap1.len() + 1) + ) + } + + pragma[nomagic] + private predicate apConsRev( + RevPartialAccessPath ap1, Content c, RevPartialAccessPath ap2, Configuration config + ) { + exists(PartialPathNodeRev mid | + revPartialPathReadStep(mid, ap1, c, _, ap2) and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathStoreStep( + PartialPathNodeRev mid, RevPartialAccessPath ap, Content c, NodeEx node, Configuration config + ) { + exists(NodeEx midNode, TypedContent tc | + midNode = mid.getNodeEx() and + ap = mid.getAp() and + store(node, tc, midNode, _, config) and + ap.getHead() = c and + config = mid.getConfiguration() and + tc.getContent() = c + ) + } + + pragma[nomagic] + private predicate revPartialPathIntoReturn( + PartialPathNodeRev mid, ReturnPosition pos, TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, + DataFlowCall call, RevPartialAccessPath ap, Configuration config + ) { + exists(NodeEx out | + mid.getNodeEx() = out and + viableReturnPosOutEx(call, pos, out) and + sc1 = TRevSummaryCtx1Some(pos) and + sc2 = TRevSummaryCtx2Some(ap) and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathFlowsThrough( + int pos, TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2, RevPartialAccessPath ap, + Configuration config + ) { + exists(PartialPathNodeRev mid, ParamNodeEx p | + mid.getNodeEx() = p and + p.getPosition() = pos and + sc1 = mid.getSummaryCtx1() and + sc2 = mid.getSummaryCtx2() and + ap = mid.getAp() and + config = mid.getConfiguration() + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable0( + DataFlowCall call, PartialPathNodeRev mid, int pos, RevPartialAccessPath ap, + Configuration config + ) { + exists(TRevSummaryCtx1Some sc1, TRevSummaryCtx2Some sc2 | + revPartialPathIntoReturn(mid, _, sc1, sc2, call, _, config) and + revPartialPathFlowsThrough(pos, sc1, sc2, ap, config) + ) + } + + pragma[nomagic] + private predicate revPartialPathThroughCallable( + PartialPathNodeRev mid, ArgNodeEx node, RevPartialAccessPath ap, Configuration config + ) { + exists(DataFlowCall call, int pos | + revPartialPathThroughCallable0(call, mid, pos, ap, config) and + node.asNode().(ArgNode).argumentOf(call, pos) + ) + } +} + +import FlowExploration + +private predicate partialFlow( + PartialPathNode source, PartialPathNode node, Configuration configuration +) { + source.getConfiguration() = configuration and + source.isFwdSource() and + node = source.getASuccessor+() +} + +private predicate revPartialFlow( + PartialPathNode node, PartialPathNode sink, Configuration configuration +) { + sink.getConfiguration() = configuration and + sink.isRevSink() and + node.getASuccessor+() = sink +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll new file mode 100644 index 00000000000..c28ceabb438 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll @@ -0,0 +1,1331 @@ +private import DataFlowImplSpecific::Private +private import DataFlowImplSpecific::Public +import Cached + +module DataFlowImplCommonPublic { + private newtype TFlowFeature = + TFeatureHasSourceCallContext() or + TFeatureHasSinkCallContext() or + TFeatureEqualSourceSinkCallContext() + + /** A flow configuration feature for use in `Configuration::getAFeature()`. */ + class FlowFeature extends TFlowFeature { + string toString() { none() } + } + + /** + * A flow configuration feature that implies that sources have some existing + * call context. + */ + class FeatureHasSourceCallContext extends FlowFeature, TFeatureHasSourceCallContext { + override string toString() { result = "FeatureHasSourceCallContext" } + } + + /** + * A flow configuration feature that implies that sinks have some existing + * call context. + */ + class FeatureHasSinkCallContext extends FlowFeature, TFeatureHasSinkCallContext { + override string toString() { result = "FeatureHasSinkCallContext" } + } + + /** + * A flow configuration feature that implies that source-sink pairs have some + * shared existing call context. + */ + class FeatureEqualSourceSinkCallContext extends FlowFeature, TFeatureEqualSourceSinkCallContext { + override string toString() { result = "FeatureEqualSourceSinkCallContext" } + } +} + +/** + * The cost limits for the `AccessPathFront` to `AccessPathApprox` expansion. + * + * `apLimit` bounds the acceptable fan-out, and `tupleLimit` bounds the + * estimated per-`AccessPathFront` tuple cost. Access paths exceeding both of + * these limits are represented with lower precision during pruning. + */ +predicate accessPathApproxCostLimits(int apLimit, int tupleLimit) { + apLimit = 10 and + tupleLimit = 10000 +} + +/** + * The cost limits for the `AccessPathApprox` to `AccessPath` expansion. + * + * `apLimit` bounds the acceptable fan-out, and `tupleLimit` bounds the + * estimated per-`AccessPathApprox` tuple cost. Access paths exceeding both of + * these limits are represented with lower precision. + */ +predicate accessPathCostLimits(int apLimit, int tupleLimit) { + apLimit = 5 and + tupleLimit = 1000 +} + +/** + * Provides a simple data-flow analysis for resolving lambda calls. The analysis + * currently excludes read-steps, store-steps, and flow-through. + * + * The analysis uses non-linear recursion: When computing a flow path in or out + * of a call, we use the results of the analysis recursively to resolve lambda + * calls. For this reason, we cannot reuse the code from `DataFlowImpl.qll` directly. + */ +private module LambdaFlow { + private predicate viableParamNonLambda(DataFlowCall call, int i, ParamNode p) { + p.isParameterOf(viableCallable(call), i) + } + + private predicate viableParamLambda(DataFlowCall call, int i, ParamNode p) { + p.isParameterOf(viableCallableLambda(call, _), i) + } + + private predicate viableParamArgNonLambda(DataFlowCall call, ParamNode p, ArgNode arg) { + exists(int i | + viableParamNonLambda(call, i, p) and + arg.argumentOf(call, i) + ) + } + + private predicate viableParamArgLambda(DataFlowCall call, ParamNode p, ArgNode arg) { + exists(int i | + viableParamLambda(call, i, p) and + arg.argumentOf(call, i) + ) + } + + private newtype TReturnPositionSimple = + TReturnPositionSimple0(DataFlowCallable c, ReturnKind kind) { + exists(ReturnNode ret | + c = getNodeEnclosingCallable(ret) and + kind = ret.getKind() + ) + } + + pragma[noinline] + private TReturnPositionSimple getReturnPositionSimple(ReturnNode ret, ReturnKind kind) { + result = TReturnPositionSimple0(getNodeEnclosingCallable(ret), kind) + } + + pragma[nomagic] + private TReturnPositionSimple viableReturnPosNonLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallable(call), kind) + } + + pragma[nomagic] + private TReturnPositionSimple viableReturnPosLambda( + DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind + ) { + result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + } + + private predicate viableReturnPosOutNonLambda( + DataFlowCall call, TReturnPositionSimple pos, OutNode out + ) { + exists(ReturnKind kind | + pos = viableReturnPosNonLambda(call, kind) and + out = getAnOutNode(call, kind) + ) + } + + private predicate viableReturnPosOutLambda( + DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + ) { + exists(ReturnKind kind | + pos = viableReturnPosLambda(call, lastCall, kind) and + out = getAnOutNode(call, kind) + ) + } + + /** + * Holds if data can flow (inter-procedurally) from `node` (of type `t`) to + * the lambda call `lambdaCall`. + * + * The parameter `toReturn` indicates whether the path from `node` to + * `lambdaCall` goes through a return, and `toJump` whether the path goes + * through a jump step. + * + * The call context `lastCall` records the last call on the path from `node` + * to `lambdaCall`, if any. That is, `lastCall` is able to target the enclosing + * callable of `lambdaCall`. + */ + pragma[nomagic] + predicate revLambdaFlow( + DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, + boolean toJump, DataFlowCallOption lastCall + ) { + revLambdaFlow0(lambdaCall, kind, node, t, toReturn, toJump, lastCall) and + if castNode(node) or node instanceof ArgNode or node instanceof ReturnNode + then compatibleTypes(t, getNodeDataFlowType(node)) + else any() + } + + pragma[nomagic] + predicate revLambdaFlow0( + DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, + boolean toJump, DataFlowCallOption lastCall + ) { + lambdaCall(lambdaCall, kind, node) and + t = getNodeDataFlowType(node) and + toReturn = false and + toJump = false and + lastCall = TDataFlowCallNone() + or + // local flow + exists(Node mid, DataFlowType t0 | + revLambdaFlow(lambdaCall, kind, mid, t0, toReturn, toJump, lastCall) + | + simpleLocalFlowStep(node, mid) and + t = t0 + or + exists(boolean preservesValue | + additionalLambdaFlowStep(node, mid, preservesValue) and + getNodeEnclosingCallable(node) = getNodeEnclosingCallable(mid) + | + preservesValue = false and + t = getNodeDataFlowType(node) + or + preservesValue = true and + t = t0 + ) + ) + or + // jump step + exists(Node mid, DataFlowType t0 | + revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and + toReturn = false and + toJump = true and + lastCall = TDataFlowCallNone() + | + jumpStepCached(node, mid) and + t = t0 + or + exists(boolean preservesValue | + additionalLambdaFlowStep(node, mid, preservesValue) and + getNodeEnclosingCallable(node) != getNodeEnclosingCallable(mid) + | + preservesValue = false and + t = getNodeDataFlowType(node) + or + preservesValue = true and + t = t0 + ) + ) + or + // flow into a callable + exists(ParamNode p, DataFlowCallOption lastCall0, DataFlowCall call | + revLambdaFlowIn(lambdaCall, kind, p, t, toJump, lastCall0) and + ( + if lastCall0 = TDataFlowCallNone() and toJump = false + then lastCall = TDataFlowCallSome(call) + else lastCall = lastCall0 + ) and + toReturn = false + | + viableParamArgNonLambda(call, p, node) + or + viableParamArgLambda(call, p, node) // non-linear recursion + ) + or + // flow out of a callable + exists(TReturnPositionSimple pos | + revLambdaFlowOut(lambdaCall, kind, pos, t, toJump, lastCall) and + getReturnPositionSimple(node, node.(ReturnNode).getKind()) = pos and + toReturn = true + ) + } + + pragma[nomagic] + predicate revLambdaFlowOutLambdaCall( + DataFlowCall lambdaCall, LambdaCallKind kind, OutNode out, DataFlowType t, boolean toJump, + DataFlowCall call, DataFlowCallOption lastCall + ) { + revLambdaFlow(lambdaCall, kind, out, t, _, toJump, lastCall) and + exists(ReturnKindExt rk | + out = rk.getAnOutNode(call) and + lambdaCall(call, _, _) + ) + } + + pragma[nomagic] + predicate revLambdaFlowOut( + DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, + boolean toJump, DataFlowCallOption lastCall + ) { + exists(DataFlowCall call, OutNode out | + revLambdaFlow(lambdaCall, kind, out, t, _, toJump, lastCall) and + viableReturnPosOutNonLambda(call, pos, out) + or + // non-linear recursion + revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and + viableReturnPosOutLambda(call, _, pos, out) + ) + } + + pragma[nomagic] + predicate revLambdaFlowIn( + DataFlowCall lambdaCall, LambdaCallKind kind, ParamNode p, DataFlowType t, boolean toJump, + DataFlowCallOption lastCall + ) { + revLambdaFlow(lambdaCall, kind, p, t, false, toJump, lastCall) + } +} + +private DataFlowCallable viableCallableExt(DataFlowCall call) { + result = viableCallable(call) + or + result = viableCallableLambda(call, _) +} + +cached +private module Cached { + /** + * If needed, call this predicate from `DataFlowImplSpecific.qll` in order to + * force a stage-dependency on the `DataFlowImplCommon.qll` stage and therby + * collapsing the two stages. + */ + cached + predicate forceCachingInSameStage() { any() } + + cached + predicate nodeEnclosingCallable(Node n, DataFlowCallable c) { c = nodeGetEnclosingCallable(n) } + + cached + predicate callEnclosingCallable(DataFlowCall call, DataFlowCallable c) { + c = call.getEnclosingCallable() + } + + cached + predicate nodeDataFlowType(Node n, DataFlowType t) { t = getNodeType(n) } + + cached + predicate jumpStepCached(Node node1, Node node2) { jumpStep(node1, node2) } + + cached + predicate clearsContentCached(Node n, Content c) { clearsContent(n, c) } + + cached + predicate isUnreachableInCallCached(Node n, DataFlowCall call) { isUnreachableInCall(n, call) } + + cached + predicate outNodeExt(Node n) { + n instanceof OutNode + or + n.(PostUpdateNode).getPreUpdateNode() instanceof ArgNode + } + + cached + predicate hiddenNode(Node n) { nodeIsHidden(n) } + + cached + OutNodeExt getAnOutNodeExt(DataFlowCall call, ReturnKindExt k) { + result = getAnOutNode(call, k.(ValueReturnKind).getKind()) + or + exists(ArgNode arg | + result.(PostUpdateNode).getPreUpdateNode() = arg and + arg.argumentOf(call, k.(ParamUpdateReturnKind).getPosition()) + ) + } + + cached + predicate returnNodeExt(Node n, ReturnKindExt k) { + k = TValueReturn(n.(ReturnNode).getKind()) + or + exists(ParamNode p, int pos | + parameterValueFlowsToPreUpdate(p, n) and + p.isParameterOf(_, pos) and + k = TParamUpdate(pos) + ) + } + + cached + predicate castNode(Node n) { n instanceof CastNode } + + cached + predicate castingNode(Node n) { + castNode(n) or + n instanceof ParamNode or + n instanceof OutNodeExt or + // For reads, `x.f`, we want to check that the tracked type after the read (which + // is obtained by popping the head of the access path stack) is compatible with + // the type of `x.f`. + read(_, _, n) + } + + cached + predicate parameterNode(Node p, DataFlowCallable c, int pos) { isParameterNode(p, c, pos) } + + cached + predicate argumentNode(Node n, DataFlowCall call, int pos) { + n.(ArgumentNode).argumentOf(call, pos) + } + + /** + * Gets a viable target for the lambda call `call`. + * + * `lastCall` records the call required to reach `call` in order for the result + * to be a viable target, if any. + */ + cached + DataFlowCallable viableCallableLambda(DataFlowCall call, DataFlowCallOption lastCall) { + exists(Node creation, LambdaCallKind kind | + LambdaFlow::revLambdaFlow(call, kind, creation, _, _, _, lastCall) and + lambdaCreation(creation, kind, result) + ) + } + + /** + * Holds if `p` is the `i`th parameter of a viable dispatch target of `call`. + * The instance parameter is considered to have index `-1`. + */ + pragma[nomagic] + private predicate viableParam(DataFlowCall call, int i, ParamNode p) { + p.isParameterOf(viableCallableExt(call), i) + } + + /** + * Holds if `arg` is a possible argument to `p` in `call`, taking virtual + * dispatch into account. + */ + cached + predicate viableParamArg(DataFlowCall call, ParamNode p, ArgNode arg) { + exists(int i | + viableParam(call, i, p) and + arg.argumentOf(call, i) and + compatibleTypes(getNodeDataFlowType(arg), getNodeDataFlowType(p)) + ) + } + + pragma[nomagic] + private ReturnPosition viableReturnPos(DataFlowCall call, ReturnKindExt kind) { + viableCallableExt(call) = result.getCallable() and + kind = result.getKind() + } + + /** + * Holds if a value at return position `pos` can be returned to `out` via `call`, + * taking virtual dispatch into account. + */ + cached + predicate viableReturnPosOut(DataFlowCall call, ReturnPosition pos, Node out) { + exists(ReturnKindExt kind | + pos = viableReturnPos(call, kind) and + out = kind.getAnOutNode(call) + ) + } + + /** Provides predicates for calculating flow-through summaries. */ + private module FlowThrough { + /** + * The first flow-through approximation: + * + * - Input access paths are abstracted with a Boolean parameter + * that indicates (non-)emptiness. + */ + private module Cand { + /** + * Holds if `p` can flow to `node` in the same callable using only + * value-preserving steps. + * + * `read` indicates whether it is contents of `p` that can flow to `node`. + */ + pragma[nomagic] + private predicate parameterValueFlowCand(ParamNode p, Node node, boolean read) { + p = node and + read = false + or + // local flow + exists(Node mid | + parameterValueFlowCand(p, mid, read) and + simpleLocalFlowStep(mid, node) + ) + or + // read + exists(Node mid | + parameterValueFlowCand(p, mid, false) and + read(mid, _, node) and + read = true + ) + or + // flow through: no prior read + exists(ArgNode arg | + parameterValueFlowArgCand(p, arg, false) and + argumentValueFlowsThroughCand(arg, node, read) + ) + or + // flow through: no read inside method + exists(ArgNode arg | + parameterValueFlowArgCand(p, arg, read) and + argumentValueFlowsThroughCand(arg, node, false) + ) + } + + pragma[nomagic] + private predicate parameterValueFlowArgCand(ParamNode p, ArgNode arg, boolean read) { + parameterValueFlowCand(p, arg, read) + } + + pragma[nomagic] + predicate parameterValueFlowsToPreUpdateCand(ParamNode p, PostUpdateNode n) { + parameterValueFlowCand(p, n.getPreUpdateNode(), false) + } + + /** + * Holds if `p` can flow to a return node of kind `kind` in the same + * callable using only value-preserving steps, not taking call contexts + * into account. + * + * `read` indicates whether it is contents of `p` that can flow to the return + * node. + */ + predicate parameterValueFlowReturnCand(ParamNode p, ReturnKind kind, boolean read) { + exists(ReturnNode ret | + parameterValueFlowCand(p, ret, read) and + kind = ret.getKind() + ) + } + + pragma[nomagic] + private predicate argumentValueFlowsThroughCand0( + DataFlowCall call, ArgNode arg, ReturnKind kind, boolean read + ) { + exists(ParamNode param | viableParamArg(call, param, arg) | + parameterValueFlowReturnCand(param, kind, read) + ) + } + + /** + * Holds if `arg` flows to `out` through a call using only value-preserving steps, + * not taking call contexts into account. + * + * `read` indicates whether it is contents of `arg` that can flow to `out`. + */ + predicate argumentValueFlowsThroughCand(ArgNode arg, Node out, boolean read) { + exists(DataFlowCall call, ReturnKind kind | + argumentValueFlowsThroughCand0(call, arg, kind, read) and + out = getAnOutNode(call, kind) + ) + } + + predicate cand(ParamNode p, Node n) { + parameterValueFlowCand(p, n, _) and + ( + parameterValueFlowReturnCand(p, _, _) + or + parameterValueFlowsToPreUpdateCand(p, _) + ) + } + } + + /** + * The final flow-through calculation: + * + * - Calculated flow is either value-preserving (`read = TReadStepTypesNone()`) + * or summarized as a single read step with before and after types recorded + * in the `ReadStepTypesOption` parameter. + * - Types are checked using the `compatibleTypes()` relation. + */ + private module Final { + /** + * Holds if `p` can flow to `node` in the same callable using only + * value-preserving steps and possibly a single read step, not taking + * call contexts into account. + * + * If a read step was taken, then `read` captures the `Content`, the + * container type, and the content type. + */ + predicate parameterValueFlow(ParamNode p, Node node, ReadStepTypesOption read) { + parameterValueFlow0(p, node, read) and + if node instanceof CastingNode + then + // normal flow through + read = TReadStepTypesNone() and + compatibleTypes(getNodeDataFlowType(p), getNodeDataFlowType(node)) + or + // getter + compatibleTypes(read.getContentType(), getNodeDataFlowType(node)) + else any() + } + + pragma[nomagic] + private predicate parameterValueFlow0(ParamNode p, Node node, ReadStepTypesOption read) { + p = node and + Cand::cand(p, _) and + read = TReadStepTypesNone() + or + // local flow + exists(Node mid | + parameterValueFlow(p, mid, read) and + simpleLocalFlowStep(mid, node) + ) + or + // read + exists(Node mid | + parameterValueFlow(p, mid, TReadStepTypesNone()) and + readStepWithTypes(mid, read.getContainerType(), read.getContent(), node, + read.getContentType()) and + Cand::parameterValueFlowReturnCand(p, _, true) and + compatibleTypes(getNodeDataFlowType(p), read.getContainerType()) + ) + or + parameterValueFlow0_0(TReadStepTypesNone(), p, node, read) + } + + pragma[nomagic] + private predicate parameterValueFlow0_0( + ReadStepTypesOption mustBeNone, ParamNode p, Node node, ReadStepTypesOption read + ) { + // flow through: no prior read + exists(ArgNode arg | + parameterValueFlowArg(p, arg, mustBeNone) and + argumentValueFlowsThrough(arg, read, node) + ) + or + // flow through: no read inside method + exists(ArgNode arg | + parameterValueFlowArg(p, arg, read) and + argumentValueFlowsThrough(arg, mustBeNone, node) + ) + } + + pragma[nomagic] + private predicate parameterValueFlowArg(ParamNode p, ArgNode arg, ReadStepTypesOption read) { + parameterValueFlow(p, arg, read) and + Cand::argumentValueFlowsThroughCand(arg, _, _) + } + + pragma[nomagic] + private predicate argumentValueFlowsThrough0( + DataFlowCall call, ArgNode arg, ReturnKind kind, ReadStepTypesOption read + ) { + exists(ParamNode param | viableParamArg(call, param, arg) | + parameterValueFlowReturn(param, kind, read) + ) + } + + /** + * Holds if `arg` flows to `out` through a call using only + * value-preserving steps and possibly a single read step, not taking + * call contexts into account. + * + * If a read step was taken, then `read` captures the `Content`, the + * container type, and the content type. + */ + pragma[nomagic] + predicate argumentValueFlowsThrough(ArgNode arg, ReadStepTypesOption read, Node out) { + exists(DataFlowCall call, ReturnKind kind | + argumentValueFlowsThrough0(call, arg, kind, read) and + out = getAnOutNode(call, kind) + | + // normal flow through + read = TReadStepTypesNone() and + compatibleTypes(getNodeDataFlowType(arg), getNodeDataFlowType(out)) + or + // getter + compatibleTypes(getNodeDataFlowType(arg), read.getContainerType()) and + compatibleTypes(read.getContentType(), getNodeDataFlowType(out)) + ) + } + + /** + * Holds if `arg` flows to `out` through a call using only + * value-preserving steps and a single read step, not taking call + * contexts into account, thus representing a getter-step. + */ + predicate getterStep(ArgNode arg, Content c, Node out) { + argumentValueFlowsThrough(arg, TReadStepTypesSome(_, c, _), out) + } + + /** + * Holds if `p` can flow to a return node of kind `kind` in the same + * callable using only value-preserving steps and possibly a single read + * step. + * + * If a read step was taken, then `read` captures the `Content`, the + * container type, and the content type. + */ + private predicate parameterValueFlowReturn( + ParamNode p, ReturnKind kind, ReadStepTypesOption read + ) { + exists(ReturnNode ret | + parameterValueFlow(p, ret, read) and + kind = ret.getKind() + ) + } + } + + import Final + } + + import FlowThrough + + cached + private module DispatchWithCallContext { + /** + * Holds if the set of viable implementations that can be called by `call` + * might be improved by knowing the call context. + */ + pragma[nomagic] + private predicate mayBenefitFromCallContextExt(DataFlowCall call, DataFlowCallable callable) { + mayBenefitFromCallContext(call, callable) + or + callEnclosingCallable(call, callable) and + exists(viableCallableLambda(call, TDataFlowCallSome(_))) + } + + /** + * Gets a viable dispatch target of `call` in the context `ctx`. This is + * restricted to those `call`s for which a context might make a difference. + */ + pragma[nomagic] + private DataFlowCallable viableImplInCallContextExt(DataFlowCall call, DataFlowCall ctx) { + result = viableImplInCallContext(call, ctx) + or + result = viableCallableLambda(call, TDataFlowCallSome(ctx)) + or + exists(DataFlowCallable enclosing | + mayBenefitFromCallContextExt(call, enclosing) and + enclosing = viableCallableExt(ctx) and + result = viableCallableLambda(call, TDataFlowCallNone()) + ) + } + + /** + * Holds if the call context `ctx` reduces the set of viable run-time + * dispatch targets of call `call` in `c`. + */ + cached + predicate reducedViableImplInCallContext(DataFlowCall call, DataFlowCallable c, DataFlowCall ctx) { + exists(int tgts, int ctxtgts | + mayBenefitFromCallContextExt(call, c) and + c = viableCallableExt(ctx) and + ctxtgts = count(viableImplInCallContextExt(call, ctx)) and + tgts = strictcount(viableCallableExt(call)) and + ctxtgts < tgts + ) + } + + /** + * Gets a viable run-time dispatch target for the call `call` in the + * context `ctx`. This is restricted to those calls for which a context + * makes a difference. + */ + cached + DataFlowCallable prunedViableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { + result = viableImplInCallContextExt(call, ctx) and + reducedViableImplInCallContext(call, _, ctx) + } + + /** + * Holds if flow returning from callable `c` to call `call` might return + * further and if this path restricts the set of call sites that can be + * returned to. + */ + cached + predicate reducedViableImplInReturn(DataFlowCallable c, DataFlowCall call) { + exists(int tgts, int ctxtgts | + mayBenefitFromCallContextExt(call, _) and + c = viableCallableExt(call) and + ctxtgts = count(DataFlowCall ctx | c = viableImplInCallContextExt(call, ctx)) and + tgts = strictcount(DataFlowCall ctx | callEnclosingCallable(call, viableCallableExt(ctx))) and + ctxtgts < tgts + ) + } + + /** + * Gets a viable run-time dispatch target for the call `call` in the + * context `ctx`. This is restricted to those calls and results for which + * the return flow from the result to `call` restricts the possible context + * `ctx`. + */ + cached + DataFlowCallable prunedViableImplInCallContextReverse(DataFlowCall call, DataFlowCall ctx) { + result = viableImplInCallContextExt(call, ctx) and + reducedViableImplInReturn(result, call) + } + } + + import DispatchWithCallContext + + /** + * Holds if `p` can flow to the pre-update node associated with post-update + * node `n`, in the same callable, using only value-preserving steps. + */ + private predicate parameterValueFlowsToPreUpdate(ParamNode p, PostUpdateNode n) { + parameterValueFlow(p, n.getPreUpdateNode(), TReadStepTypesNone()) + } + + private predicate store( + Node node1, Content c, Node node2, DataFlowType contentType, DataFlowType containerType + ) { + storeStep(node1, c, node2) and + contentType = getNodeDataFlowType(node1) and + containerType = getNodeDataFlowType(node2) + or + exists(Node n1, Node n2 | + n1 = node1.(PostUpdateNode).getPreUpdateNode() and + n2 = node2.(PostUpdateNode).getPreUpdateNode() + | + argumentValueFlowsThrough(n2, TReadStepTypesSome(containerType, c, contentType), n1) + or + read(n2, c, n1) and + contentType = getNodeDataFlowType(n1) and + containerType = getNodeDataFlowType(n2) + ) + } + + cached + predicate read(Node node1, Content c, Node node2) { readStep(node1, c, node2) } + + /** + * Holds if data can flow from `node1` to `node2` via a direct assignment to + * `f`. + * + * This includes reverse steps through reads when the result of the read has + * been stored into, in order to handle cases like `x.f1.f2 = y`. + */ + cached + predicate store(Node node1, TypedContent tc, Node node2, DataFlowType contentType) { + store(node1, tc.getContent(), node2, contentType, tc.getContainerType()) + } + + /** + * Holds if data can flow from `fromNode` to `toNode` because they are the post-update + * nodes of some function output and input respectively, where the output and input + * are aliases. A typical example is a function returning `this`, implementing a fluent + * interface. + */ + private predicate reverseStepThroughInputOutputAlias( + PostUpdateNode fromNode, PostUpdateNode toNode + ) { + exists(Node fromPre, Node toPre | + fromPre = fromNode.getPreUpdateNode() and + toPre = toNode.getPreUpdateNode() + | + exists(DataFlowCall c | + // Does the language-specific simpleLocalFlowStep already model flow + // from function input to output? + fromPre = getAnOutNode(c, _) and + toPre.(ArgNode).argumentOf(c, _) and + simpleLocalFlowStep(toPre.(ArgNode), fromPre) + ) + or + argumentValueFlowsThrough(toPre, TReadStepTypesNone(), fromPre) + ) + } + + cached + predicate simpleLocalFlowStepExt(Node node1, Node node2) { + simpleLocalFlowStep(node1, node2) or + reverseStepThroughInputOutputAlias(node1, node2) + } + + /** + * Holds if the call context `call` improves virtual dispatch in `callable`. + */ + cached + predicate recordDataFlowCallSiteDispatch(DataFlowCall call, DataFlowCallable callable) { + reducedViableImplInCallContext(_, callable, call) + } + + /** + * Holds if the call context `call` allows us to prune unreachable nodes in `callable`. + */ + cached + predicate recordDataFlowCallSiteUnreachable(DataFlowCall call, DataFlowCallable callable) { + exists(Node n | getNodeEnclosingCallable(n) = callable | isUnreachableInCallCached(n, call)) + } + + cached + predicate allowParameterReturnInSelfCached(ParamNode p) { allowParameterReturnInSelf(p) } + + cached + newtype TCallContext = + TAnyCallContext() or + TSpecificCall(DataFlowCall call) { recordDataFlowCallSite(call, _) } or + TSomeCall() or + TReturn(DataFlowCallable c, DataFlowCall call) { reducedViableImplInReturn(c, call) } + + cached + newtype TReturnPosition = + TReturnPosition0(DataFlowCallable c, ReturnKindExt kind) { + exists(ReturnNodeExt ret | + c = returnNodeGetEnclosingCallable(ret) and + kind = ret.getKind() + ) + } + + cached + newtype TLocalFlowCallContext = + TAnyLocalCall() or + TSpecificLocalCall(DataFlowCall call) { isUnreachableInCallCached(_, call) } + + cached + newtype TReturnKindExt = + TValueReturn(ReturnKind kind) or + TParamUpdate(int pos) { exists(ParamNode p | p.isParameterOf(_, pos)) } + + cached + newtype TBooleanOption = + TBooleanNone() or + TBooleanSome(boolean b) { b = true or b = false } + + cached + newtype TDataFlowCallOption = + TDataFlowCallNone() or + TDataFlowCallSome(DataFlowCall call) + + cached + newtype TTypedContent = MkTypedContent(Content c, DataFlowType t) { store(_, c, _, _, t) } + + cached + newtype TAccessPathFront = + TFrontNil(DataFlowType t) or + TFrontHead(TypedContent tc) + + cached + newtype TAccessPathFrontOption = + TAccessPathFrontNone() or + TAccessPathFrontSome(AccessPathFront apf) +} + +/** + * Holds if the call context `call` either improves virtual dispatch in + * `callable` or if it allows us to prune unreachable nodes in `callable`. + */ +predicate recordDataFlowCallSite(DataFlowCall call, DataFlowCallable callable) { + recordDataFlowCallSiteDispatch(call, callable) or + recordDataFlowCallSiteUnreachable(call, callable) +} + +/** + * A `Node` at which a cast can occur such that the type should be checked. + */ +class CastingNode extends Node { + CastingNode() { castingNode(this) } +} + +private predicate readStepWithTypes( + Node n1, DataFlowType container, Content c, Node n2, DataFlowType content +) { + read(n1, c, n2) and + container = getNodeDataFlowType(n1) and + content = getNodeDataFlowType(n2) +} + +private newtype TReadStepTypesOption = + TReadStepTypesNone() or + TReadStepTypesSome(DataFlowType container, Content c, DataFlowType content) { + readStepWithTypes(_, container, c, _, content) + } + +private class ReadStepTypesOption extends TReadStepTypesOption { + predicate isSome() { this instanceof TReadStepTypesSome } + + DataFlowType getContainerType() { this = TReadStepTypesSome(result, _, _) } + + Content getContent() { this = TReadStepTypesSome(_, result, _) } + + DataFlowType getContentType() { this = TReadStepTypesSome(_, _, result) } + + string toString() { if this.isSome() then result = "Some(..)" else result = "None()" } +} + +/** + * A call context to restrict the targets of virtual dispatch, prune local flow, + * and match the call sites of flow into a method with flow out of a method. + * + * There are four cases: + * - `TAnyCallContext()` : No restrictions on method flow. + * - `TSpecificCall(DataFlowCall call)` : Flow entered through the + * given `call`. This call improves the set of viable + * dispatch targets for at least one method call in the current callable + * or helps prune unreachable nodes in the current callable. + * - `TSomeCall()` : Flow entered through a parameter. The + * originating call does not improve the set of dispatch targets for any + * method call in the current callable and was therefore not recorded. + * - `TReturn(Callable c, DataFlowCall call)` : Flow reached `call` from `c` and + * this dispatch target of `call` implies a reduced set of dispatch origins + * to which data may flow if it should reach a `return` statement. + */ +abstract class CallContext extends TCallContext { + abstract string toString(); + + /** Holds if this call context is relevant for `callable`. */ + abstract predicate relevantFor(DataFlowCallable callable); +} + +abstract class CallContextNoCall extends CallContext { } + +class CallContextAny extends CallContextNoCall, TAnyCallContext { + override string toString() { result = "CcAny" } + + override predicate relevantFor(DataFlowCallable callable) { any() } +} + +abstract class CallContextCall extends CallContext { + /** Holds if this call context may be `call`. */ + bindingset[call] + abstract predicate matchesCall(DataFlowCall call); +} + +class CallContextSpecificCall extends CallContextCall, TSpecificCall { + override string toString() { + exists(DataFlowCall call | this = TSpecificCall(call) | result = "CcCall(" + call + ")") + } + + override predicate relevantFor(DataFlowCallable callable) { + recordDataFlowCallSite(this.getCall(), callable) + } + + override predicate matchesCall(DataFlowCall call) { call = this.getCall() } + + DataFlowCall getCall() { this = TSpecificCall(result) } +} + +class CallContextSomeCall extends CallContextCall, TSomeCall { + override string toString() { result = "CcSomeCall" } + + override predicate relevantFor(DataFlowCallable callable) { + exists(ParamNode p | getNodeEnclosingCallable(p) = callable) + } + + override predicate matchesCall(DataFlowCall call) { any() } +} + +class CallContextReturn extends CallContextNoCall, TReturn { + override string toString() { + exists(DataFlowCall call | this = TReturn(_, call) | result = "CcReturn(" + call + ")") + } + + override predicate relevantFor(DataFlowCallable callable) { + exists(DataFlowCall call | this = TReturn(_, call) and callEnclosingCallable(call, callable)) + } +} + +/** + * A call context that is relevant for pruning local flow. + */ +abstract class LocalCallContext extends TLocalFlowCallContext { + abstract string toString(); + + /** Holds if this call context is relevant for `callable`. */ + abstract predicate relevantFor(DataFlowCallable callable); +} + +class LocalCallContextAny extends LocalCallContext, TAnyLocalCall { + override string toString() { result = "LocalCcAny" } + + override predicate relevantFor(DataFlowCallable callable) { any() } +} + +class LocalCallContextSpecificCall extends LocalCallContext, TSpecificLocalCall { + LocalCallContextSpecificCall() { this = TSpecificLocalCall(call) } + + DataFlowCall call; + + DataFlowCall getCall() { result = call } + + override string toString() { result = "LocalCcCall(" + call + ")" } + + override predicate relevantFor(DataFlowCallable callable) { relevantLocalCCtx(call, callable) } +} + +private predicate relevantLocalCCtx(DataFlowCall call, DataFlowCallable callable) { + exists(Node n | getNodeEnclosingCallable(n) = callable and isUnreachableInCallCached(n, call)) +} + +/** + * Gets the local call context given the call context and the callable that + * the contexts apply to. + */ +LocalCallContext getLocalCallContext(CallContext ctx, DataFlowCallable callable) { + ctx.relevantFor(callable) and + if relevantLocalCCtx(ctx.(CallContextSpecificCall).getCall(), callable) + then result.(LocalCallContextSpecificCall).getCall() = ctx.(CallContextSpecificCall).getCall() + else result instanceof LocalCallContextAny +} + +/** + * The value of a parameter at function entry, viewed as a node in a data + * flow graph. + */ +class ParamNode extends Node { + ParamNode() { parameterNode(this, _, _) } + + /** + * Holds if this node is the parameter of callable `c` at the specified + * (zero-based) position. + */ + predicate isParameterOf(DataFlowCallable c, int i) { parameterNode(this, c, i) } +} + +/** A data-flow node that represents a call argument. */ +class ArgNode extends Node { + ArgNode() { argumentNode(this, _, _) } + + /** Holds if this argument occurs at the given position in the given call. */ + final predicate argumentOf(DataFlowCall call, int pos) { argumentNode(this, call, pos) } +} + +/** + * A node from which flow can return to the caller. This is either a regular + * `ReturnNode` or a `PostUpdateNode` corresponding to the value of a parameter. + */ +class ReturnNodeExt extends Node { + ReturnNodeExt() { returnNodeExt(this, _) } + + /** Gets the kind of this returned value. */ + ReturnKindExt getKind() { returnNodeExt(this, result) } +} + +/** + * A node to which data can flow from a call. Either an ordinary out node + * or a post-update node associated with a call argument. + */ +class OutNodeExt extends Node { + OutNodeExt() { outNodeExt(this) } +} + +/** + * An extended return kind. A return kind describes how data can be returned + * from a callable. This can either be through a returned value or an updated + * parameter. + */ +abstract class ReturnKindExt extends TReturnKindExt { + /** Gets a textual representation of this return kind. */ + abstract string toString(); + + /** Gets a node corresponding to data flow out of `call`. */ + final OutNodeExt getAnOutNode(DataFlowCall call) { result = getAnOutNodeExt(call, this) } +} + +class ValueReturnKind extends ReturnKindExt, TValueReturn { + private ReturnKind kind; + + ValueReturnKind() { this = TValueReturn(kind) } + + ReturnKind getKind() { result = kind } + + override string toString() { result = kind.toString() } +} + +class ParamUpdateReturnKind extends ReturnKindExt, TParamUpdate { + private int pos; + + ParamUpdateReturnKind() { this = TParamUpdate(pos) } + + int getPosition() { result = pos } + + override string toString() { result = "param update " + pos } +} + +/** A callable tagged with a relevant return kind. */ +class ReturnPosition extends TReturnPosition0 { + private DataFlowCallable c; + private ReturnKindExt kind; + + ReturnPosition() { this = TReturnPosition0(c, kind) } + + /** Gets the callable. */ + DataFlowCallable getCallable() { result = c } + + /** Gets the return kind. */ + ReturnKindExt getKind() { result = kind } + + /** Gets a textual representation of this return position. */ + string toString() { result = "[" + kind + "] " + c } +} + +/** + * Gets the enclosing callable of `n`. Unlike `n.getEnclosingCallable()`, this + * predicate ensures that joins go from `n` to the result instead of the other + * way around. + */ +pragma[inline] +DataFlowCallable getNodeEnclosingCallable(Node n) { + nodeEnclosingCallable(pragma[only_bind_out](n), pragma[only_bind_into](result)) +} + +/** Gets the type of `n` used for type pruning. */ +pragma[inline] +DataFlowType getNodeDataFlowType(Node n) { + nodeDataFlowType(pragma[only_bind_out](n), pragma[only_bind_into](result)) +} + +pragma[noinline] +private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) { + result = getNodeEnclosingCallable(ret) +} + +pragma[noinline] +private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) { + result.getCallable() = returnNodeGetEnclosingCallable(ret) and + kind = result.getKind() +} + +pragma[noinline] +ReturnPosition getReturnPosition(ReturnNodeExt ret) { + result = getReturnPosition0(ret, ret.getKind()) +} + +/** + * Checks whether `inner` can return to `call` in the call context `innercc`. + * Assumes a context of `inner = viableCallableExt(call)`. + */ +bindingset[innercc, inner, call] +predicate checkCallContextReturn(CallContext innercc, DataFlowCallable inner, DataFlowCall call) { + innercc instanceof CallContextAny + or + exists(DataFlowCallable c0, DataFlowCall call0 | + callEnclosingCallable(call0, inner) and + innercc = TReturn(c0, call0) and + c0 = prunedViableImplInCallContextReverse(call0, call) + ) +} + +/** + * Checks whether `call` can resolve to `calltarget` in the call context `cc`. + * Assumes a context of `calltarget = viableCallableExt(call)`. + */ +bindingset[cc, call, calltarget] +predicate checkCallContextCall(CallContext cc, DataFlowCall call, DataFlowCallable calltarget) { + exists(DataFlowCall ctx | cc = TSpecificCall(ctx) | + if reducedViableImplInCallContext(call, _, ctx) + then calltarget = prunedViableImplInCallContext(call, ctx) + else any() + ) + or + cc instanceof CallContextSomeCall + or + cc instanceof CallContextAny + or + cc instanceof CallContextReturn +} + +/** + * Resolves a return from `callable` in `cc` to `call`. This is equivalent to + * `callable = viableCallableExt(call) and checkCallContextReturn(cc, callable, call)`. + */ +bindingset[cc, callable] +predicate resolveReturn(CallContext cc, DataFlowCallable callable, DataFlowCall call) { + cc instanceof CallContextAny and callable = viableCallableExt(call) + or + exists(DataFlowCallable c0, DataFlowCall call0 | + callEnclosingCallable(call0, callable) and + cc = TReturn(c0, call0) and + c0 = prunedViableImplInCallContextReverse(call0, call) + ) +} + +/** + * Resolves a call from `call` in `cc` to `result`. This is equivalent to + * `result = viableCallableExt(call) and checkCallContextCall(cc, call, result)`. + */ +bindingset[call, cc] +DataFlowCallable resolveCall(DataFlowCall call, CallContext cc) { + exists(DataFlowCall ctx | cc = TSpecificCall(ctx) | + if reducedViableImplInCallContext(call, _, ctx) + then result = prunedViableImplInCallContext(call, ctx) + else result = viableCallableExt(call) + ) + or + result = viableCallableExt(call) and cc instanceof CallContextSomeCall + or + result = viableCallableExt(call) and cc instanceof CallContextAny + or + result = viableCallableExt(call) and cc instanceof CallContextReturn +} + +/** An optional Boolean value. */ +class BooleanOption extends TBooleanOption { + string toString() { + this = TBooleanNone() and result = "" + or + this = TBooleanSome(any(boolean b | result = b.toString())) + } +} + +/** An optional `DataFlowCall`. */ +class DataFlowCallOption extends TDataFlowCallOption { + string toString() { + this = TDataFlowCallNone() and + result = "(none)" + or + exists(DataFlowCall call | + this = TDataFlowCallSome(call) and + result = call.toString() + ) + } +} + +/** Content tagged with the type of a containing object. */ +class TypedContent extends MkTypedContent { + private Content c; + private DataFlowType t; + + TypedContent() { this = MkTypedContent(c, t) } + + /** Gets the content. */ + Content getContent() { result = c } + + /** Gets the container type. */ + DataFlowType getContainerType() { result = t } + + /** Gets a textual representation of this content. */ + string toString() { result = c.toString() } + + /** + * Holds if access paths with this `TypedContent` at their head always should + * be tracked at high precision. This disables adaptive access path precision + * for such access paths. + */ + predicate forceHighPrecision() { forceHighPrecision(c) } +} + +/** + * The front of an access path. This is either a head or a nil. + */ +abstract class AccessPathFront extends TAccessPathFront { + abstract string toString(); + + abstract DataFlowType getType(); + + abstract boolean toBoolNonEmpty(); + + TypedContent getHead() { this = TFrontHead(result) } + + predicate isClearedAt(Node n) { clearsContentCached(n, this.getHead().getContent()) } +} + +class AccessPathFrontNil extends AccessPathFront, TFrontNil { + private DataFlowType t; + + AccessPathFrontNil() { this = TFrontNil(t) } + + override string toString() { result = ppReprType(t) } + + override DataFlowType getType() { result = t } + + override boolean toBoolNonEmpty() { result = false } +} + +class AccessPathFrontHead extends AccessPathFront, TFrontHead { + private TypedContent tc; + + AccessPathFrontHead() { this = TFrontHead(tc) } + + override string toString() { result = tc.toString() } + + override DataFlowType getType() { result = tc.getContainerType() } + + override boolean toBoolNonEmpty() { result = true } +} + +/** An optional access path front. */ +class AccessPathFrontOption extends TAccessPathFrontOption { + string toString() { + this = TAccessPathFrontNone() and result = "" + or + this = TAccessPathFrontSome(any(AccessPathFront apf | result = apf.toString())) + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplSpecific.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplSpecific.qll new file mode 100644 index 00000000000..ee044c5e426 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplSpecific.qll @@ -0,0 +1,11 @@ +/** + * Provides Go-specific definitions for use in the data flow library. + */ +module Private { + import DataFlowPrivate + import DataFlowDispatch +} + +module Public { + import DataFlowUtil +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll new file mode 100644 index 00000000000..80c94cafdaa --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -0,0 +1,1161 @@ +private import go +private import semmle.go.dataflow.FunctionInputsAndOutputs +private import semmle.go.dataflow.FlowSummary +private import DataFlowPrivate +private import FlowSummaryImpl as FlowSummaryImpl +private import semmle.go.dataflow.ExternalFlow + +cached +private newtype TNode = + MkInstructionNode(IR::Instruction insn) or + MkSsaNode(SsaDefinition ssa) or + MkGlobalFunctionNode(Function f) or + MkSummarizedParameterNode(DataFlowCallable c, int i) { + not exists(c.getFuncDef()) and + c instanceof SummarizedCallable and + ( + i in [0 .. c.getType().getNumParameter() - 1] + or + c.asFunction() instanceof Method and i = -1 + ) + } or + MkSummaryInternalNode(SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) { + FlowSummaryImpl::Private::summaryNodeRange(c, state) + } + +/** Nodes intended for only use inside the data-flow libraries. */ +module Private { + /** Gets the callable in which this node occurs. */ + DataFlowCallable nodeGetEnclosingCallable(Node n) { + result.asCallable() = n.getEnclosingCallable() + or + not exists(n.getEnclosingCallable()) and result.asFileScope() = n.getFile() + } + + /** Holds if `p` is a `ParameterNode` of `c` with position `pos`. */ + predicate isParameterNode(ParameterNode p, DataFlowCallable c, int pos) { + p.isParameterOf(c.asCallable(), pos) + } + + /** A data flow node that represents returning a value from a function. */ + class ReturnNode extends Node { + ReturnKind kind; + + ReturnNode() { + this.(Public::ResultNode).getIndex() = kind.getIndex() + or + this.(SummaryNode).isReturn(kind) + } + + /** Gets the kind of this returned value. */ + ReturnKind getKind() { result = kind } + } + + /** A data flow node that represents the output of a call. */ + class OutNode extends Node { + DataFlow::CallNode call; + int i; + + OutNode() { this = call.getResult(i) } + + /** Gets the underlying call. */ + DataFlowCall getCall() { result = call.asExpr() } + } + + /** + * A data-flow node used to model flow summaries. + */ + class SummaryNode extends Node, MkSummaryInternalNode { + private SummarizedCallable c; + private FlowSummaryImpl::Private::SummaryNodeState state; + + SummaryNode() { this = MkSummaryInternalNode(c, state) } + + override predicate hasLocationInfo(string fp, int sl, int sc, int el, int ec) { + c.hasLocationInfo(fp, sl, sc, el, ec) + } + + override string toString() { result = "[summary] " + state + " in " + c } + + /** Holds if this summary node is the `i`th argument of `call`. */ + predicate isArgumentOf(DataFlowCall call, int i) { + FlowSummaryImpl::Private::summaryArgumentNode(call, this, i) + } + + /** Holds if this summary node is a return node. */ + predicate isReturn(ReturnKind kind) { FlowSummaryImpl::Private::summaryReturnNode(this, kind) } + + /** Holds if this summary node is an out node for `call`. */ + predicate isOut(DataFlowCall call) { FlowSummaryImpl::Private::summaryOutNode(call, this, _) } + } + + /** Gets the summary node corresponding to the callable `c` and state `state`. */ + SummaryNode getSummaryNode(SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) { + result = MkSummaryInternalNode(c, state) + } +} + +/** Nodes intended for use outside the data-flow libraries. */ +module Public { + /** + * A node in a data flow graph. + * + * A node can be either an IR instruction or an SSA definition. + * Such nodes are created with `DataFlow::instructionNode` + * and `DataFlow::ssaNode` respectively. + */ + class Node extends TNode { + /** Gets the function to which this node belongs. */ + ControlFlow::Root getRoot() { none() } // overridden in subclasses + + /** INTERNAL: Use `getRoot()` instead. */ + Callable getEnclosingCallable() { + result.getFuncDef() = this.getRoot() + or + exists(DataFlowCallable dfc | result = dfc.asCallable() | + this = MkSummarizedParameterNode(dfc, _) + or + this = MkSummaryInternalNode(dfc, _) + ) + } + + /** Gets the type of this node. */ + Type getType() { none() } // overridden in subclasses + + /** Gets the expression corresponding to this node, if any. */ + Expr asExpr() { none() } // overridden in subclasses + + /** Gets the parameter corresponding to this node, if any. */ + Parameter asParameter() { none() } // overridden in subclasses + + /** Gets the IR instruction corresponding to this node, if any. */ + IR::Instruction asInstruction() { none() } // overridden in subclasses + + /** Gets a textual representation of the kind of this data-flow node. */ + string getNodeKind() { none() } // overridden in subclasses + + /** Gets the basic block to which this data-flow node belongs, if any. */ + BasicBlock getBasicBlock() { result = this.asInstruction().getBasicBlock() } + + /** Gets a textual representation of this element. */ + string toString() { result = "data-flow node" } // overridden in subclasses + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } + + /** Gets the file in which this node appears. */ + File getFile() { this.hasLocationInfo(result.getAbsolutePath(), _, _, _, _) } + + /** Gets the start line of the location of this node. */ + int getStartLine() { this.hasLocationInfo(_, result, _, _, _) } + + /** Gets the start column of the location of this node. */ + int getStartColumn() { this.hasLocationInfo(_, _, result, _, _) } + + /** Gets the end line of the location of this node. */ + int getEndLine() { this.hasLocationInfo(_, _, _, result, _) } + + /** Gets the end column of the location of this node. */ + int getEndColumn() { this.hasLocationInfo(_, _, _, _, result) } + + /** + * Gets an upper bound on the type of this node. + */ + Type getTypeBound() { result = this.getType() } + + /** Gets the floating-point value this data-flow node contains, if any. */ + float getFloatValue() { result = this.asExpr().getFloatValue() } + + /** + * Gets the integer value this data-flow node contains, if any. + * + * Note that this does not have a result if the value is too large to fit in a + * 32-bit signed integer type. + */ + int getIntValue() { result = this.asInstruction().getIntValue() } + + /** Gets either `getFloatValue` or `getIntValue`. */ + float getNumericValue() { result = this.asInstruction().getNumericValue() } + + /** + * Holds if the complex value this data-flow node contains has real part `real` and imaginary + * part `imag`. + */ + predicate hasComplexValue(float real, float imag) { + this.asInstruction().hasComplexValue(real, imag) + } + + /** Gets the string value this data-flow node contains, if any. */ + string getStringValue() { result = this.asInstruction().getStringValue() } + + /** + * Gets the string representation of the exact value this data-flow node + * contains, if any. + * + * For example, for the constant 3.141592653589793238462, this will + * result in 1570796326794896619231/500000000000000000000 + */ + string getExactValue() { result = this.asInstruction().getExactValue() } + + /** Gets the Boolean value this data-flow node contains, if any. */ + boolean getBoolValue() { result = this.asInstruction().getBoolValue() } + + /** Holds if the value of this data-flow node is known at compile time. */ + predicate isConst() { this.asInstruction().isConst() } + + /** + * Holds if the result of this instruction is known at compile time, and is guaranteed not to + * depend on the platform where it is evaluated. + */ + predicate isPlatformIndependentConstant() { + this.asInstruction().isPlatformIndependentConstant() + } + + /** + * Gets a data-flow node to which data may flow from this node in one (intra-procedural) step. + */ + Node getASuccessor() { DataFlow::localFlowStep(this, result) } + + /** + * Gets a data-flow node from which data may flow to this node in one (intra-procedural) step. + */ + Node getAPredecessor() { this = result.getASuccessor() } + } + + /** + * An IR instruction, viewed as a node in a data flow graph. + */ + class InstructionNode extends Node, MkInstructionNode { + IR::Instruction insn; + + InstructionNode() { this = MkInstructionNode(insn) } + + override IR::Instruction asInstruction() { result = insn } + + override ControlFlow::Root getRoot() { result = insn.getRoot() } + + override Type getType() { result = insn.getResultType() } + + override string getNodeKind() { result = insn.getInsnKind() } + + override string toString() { result = insn.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + insn.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + /** + * An expression, viewed as a node in a data flow graph. + */ + class ExprNode extends InstructionNode { + override IR::EvalInstruction insn; + Expr expr; + + ExprNode() { expr = insn.getExpr() } + + override Expr asExpr() { result = expr } + + /** Gets the underlying expression this node corresponds to. */ + Expr getExpr() { result = expr } + } + + /** + * An SSA variable, viewed as a node in a data flow graph. + */ + class SsaNode extends Node, MkSsaNode { + SsaDefinition ssa; + + SsaNode() { this = MkSsaNode(ssa) } + + /** Gets the node whose value is stored in this SSA variable, if any. */ + Node getInit() { result = DataFlow::instructionNode(ssa.(SsaExplicitDefinition).getRhs()) } + + /** Gets a use of this SSA variable. */ + InstructionNode getAUse() { result = DataFlow::instructionNode(ssa.getVariable().getAUse()) } + + /** Gets the program variable corresponding to this SSA variable. */ + SsaSourceVariable getSourceVariable() { result = ssa.getSourceVariable() } + + /** Gets the unique definition of this SSA variable. */ + SsaDefinition getDefinition() { result = ssa } + + override ControlFlow::Root getRoot() { result = ssa.getRoot() } + + override Type getType() { result = ssa.getSourceVariable().getType() } + + override string getNodeKind() { result = "SSA variable " + ssa.getSourceVariable().getName() } + + override string toString() { result = ssa.toString() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + ssa.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + private module FunctionNode { + /** A function, viewed as a node in a data flow graph. */ + abstract class Range extends Node { + /** Gets the `i`th parameter of this function. */ + abstract ParameterNode getParameter(int i); + + /** Gets the name of this function, if it has one. */ + abstract string getName(); + + /** + * Gets the dataflow node holding the value of the receiver, if any. + */ + abstract ReceiverNode getReceiver(); + + /** + * Gets a value returned by the given function via a return statement or an assignment to a + * result variable. + */ + abstract ResultNode getAResult(); + + /** + * Gets the function entity this node corresponds to. + * + * Note that this predicate has no result for function literals. + */ + Function getFunction() { none() } + } + } + + /** A function, viewed as a node in a data flow graph. */ + class FunctionNode extends Node { + FunctionNode::Range self; + + FunctionNode() { this = self } + + /** Gets the `i`th parameter of this function. */ + ParameterNode getParameter(int i) { result = self.getParameter(i) } + + /** Gets a parameter of this function. */ + ParameterNode getAParameter() { result = this.getParameter(_) } + + /** Gets the number of parameters declared on this function. */ + int getNumParameter() { result = count(this.getAParameter()) } + + /** Gets the name of this function, if it has one. */ + string getName() { result = self.getName() } + + /** + * Gets the dataflow node holding the value of the receiver, if any. + */ + ReceiverNode getReceiver() { result = self.getReceiver() } + + /** + * Gets a value returned by the given function via a return statement or an assignment to a + * result variable. + */ + ResultNode getAResult() { result = self.getAResult() } + + /** + * Gets the data-flow node corresponding to the `i`th result of this function. + */ + ResultNode getResult(int i) { result = this.getAResult() and result.getIndex() = i } + + /** + * Gets the function entity this node corresponds to. + * + * Note that this predicate has no result for function literals. + */ + Function getFunction() { result = self.getFunction() } + } + + /** A representation of a function that is declared in the module scope. */ + class GlobalFunctionNode extends FunctionNode::Range, MkGlobalFunctionNode { + Function func; + + GlobalFunctionNode() { this = MkGlobalFunctionNode(func) } + + override ParameterNode getParameter(int i) { + result = DataFlow::parameterNode(func.getParameter(i)) + } + + override string getName() { result = func.getName() } + + override Function getFunction() { result = func } + + override ReceiverNode getReceiver() { + result = DataFlow::receiverNode(func.(Method).getReceiver()) + } + + override string getNodeKind() { result = "function " + func.getName() } + + override string toString() { result = "function " + func.getName() } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + func.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + override ResultNode getAResult() { + result.getRoot() = this.getFunction().(DeclaredFunction).getFuncDecl() + } + } + + /** A representation of the function that is defined by a function literal. */ + class FuncLitNode extends FunctionNode::Range, ExprNode { + override FuncLit expr; + + override ParameterNode getParameter(int i) { + result = DataFlow::parameterNode(expr.getParameter(i)) + } + + override string getName() { none() } + + override ReceiverNode getReceiver() { none() } + + override string toString() { result = "function literal" } + + override ResultNode getAResult() { result.getRoot() = this.getExpr() } + } + + /** + * Gets a possible target of call `cn`.class + * + * This is written explicitly like this instead of using `getCalleeNode().getAPredecessor*()` + * or `result.getASuccessor*() = cn.getCalleeNode()` because the explicit form inhibits the + * optimizer from combining this with other uses of `getASuccessor*()`, which can lead to + * recursion through a magic side-condition if those other users call `getACallee()` and thus + * pointless recomputation of `getACallee()` each recursive iteration. + */ + private DataFlow::Node getACalleeSource(DataFlow::CallNode cn) { + result = cn.getCalleeNode() or + basicLocalFlowStep(result, getACalleeSource(cn)) or + result.asExpr() = getACalleeSource(cn).asExpr().(GenericFunctionInstantiationExpr).getBase() + } + + /** A data flow node that represents a call. */ + class CallNode extends ExprNode { + override CallExpr expr; + + /** Gets the declared target of this call */ + Function getTarget() { result = expr.getTarget() } + + private DataFlow::Node getACalleeSource() { result = getACalleeSource(this) } + + /** + * Gets the definition of a possible target of this call. + * + * For non-virtual calls, there is at most one possible call target (but there may be none if the + * target has no declaration). + * + * For virtual calls, we look up possible targets in all types that implement the receiver + * interface type. + */ + Callable getACalleeIncludingExternals() { + result.asFunction() = this.getTarget() + or + exists(DataFlow::Node calleeSource | calleeSource = this.getACalleeSource() | + result.asFuncLit() = calleeSource.asExpr() + or + calleeSource = result.asFunction().getARead() + or + exists(Method declared, Method actual | + calleeSource = declared.getARead() and + actual.implements(declared) and + result.asFunction() = actual + ) + ) + } + + /** + * As `getACalleeIncludingExternals`, except excluding external functions (those for which + * we lack a definition, such as standard library functions). + */ + FuncDef getACallee() { result = this.getACalleeIncludingExternals().getFuncDef() } + + /** + * Gets the name of the function, method or variable that is being called. + * + * Note that if we are calling a variable then this gets the variable name. + * It does not attempt to get the name of the function or method that is + * assigned to the variable. To do that, use + * `getACalleeIncludingExternals().asFunction().getName()`. + */ + string getCalleeName() { result = expr.getCalleeName() } + + /** Gets the data flow node specifying the function to be called. */ + Node getCalleeNode() { result = DataFlow::exprNode(expr.getCalleeExpr()) } + + /** Gets the underlying call. */ + CallExpr getCall() { result = this.getExpr() } + + /** + * Gets the data flow node corresponding to the `i`th argument of this call. + * + * Note that the first argument in calls to the built-in function `make` is a type, which is + * not a data-flow node. It is skipped for the purposes of this predicate, so the (syntactically) + * second argument becomes the first argument in terms of data flow. + * + * For calls of the form `f(g())` where `g` has multiple results, the arguments of the call to + * `i` are the (implicit) element extraction nodes for the call to `g`. + */ + Node getArgument(int i) { + if expr.getArgument(0).getType() instanceof TupleType + then result = DataFlow::extractTupleElement(DataFlow::exprNode(expr.getArgument(0)), i) + else + result = + rank[i + 1](Expr arg, int j | + arg = expr.getArgument(j) + | + DataFlow::exprNode(arg) order by j + ) + } + + /** Gets the data flow node corresponding to an argument of this call. */ + Node getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of arguments of this call, if it can be determined. */ + int getNumArgument() { result = count(this.getAnArgument()) } + + /** Gets a function passed as the `i`th argument of this call. */ + FunctionNode getCallback(int i) { result.getASuccessor*() = this.getArgument(i) } + + /** + * Gets the data-flow node corresponding to the `i`th result of this call. + * + * If there is a single result then it is considered to be the 0th result. + */ + Node getResult(int i) { + i = 0 and result = this.getResult() + or + result = DataFlow::extractTupleElement(this, i) + } + + /** + * Gets the data-flow node corresponding to the result of this call. + * + * Note that this predicate is not defined for calls with multiple results; use the one-argument + * variant `getResult(i)` for such calls. + */ + Node getResult() { not this.getType() instanceof TupleType and result = this } + + /** Gets a result of this call. */ + Node getAResult() { result = this.getResult(_) } + + /** Gets the data flow node corresponding to the receiver of this call, if any. */ + Node getReceiver() { result = this.getACalleeSource().(MethodReadNode).getReceiver() } + + /** Holds if this call has an ellipsis after its last argument. */ + predicate hasEllipsis() { expr.hasEllipsis() } + } + + /** A data flow node that represents a call to a method. */ + class MethodCallNode extends CallNode { + MethodCallNode() { expr.getTarget() instanceof Method } + + override Method getTarget() { result = expr.getTarget() } + + override MethodDecl getACallee() { result = super.getACallee() } + } + + /** A representation of a parameter initialization. */ + abstract class ParameterNode extends DataFlow::Node { + /** Holds if this node initializes the `i`th parameter of `c`. */ + abstract predicate isParameterOf(Callable c, int i); + } + + /** + * A summary node which represents a parameter in a function which doesn't + * already have a parameter nodes. + */ + class SummarizedParameterNode extends ParameterNode, MkSummarizedParameterNode { + Callable c; + int i; + + SummarizedParameterNode() { + this = MkSummarizedParameterNode(any(DataFlowCallable dfc | c = dfc.asCallable()), i) + } + + // There are no AST representations of summarized parameter nodes + override ControlFlow::Root getRoot() { none() } + + override string getNodeKind() { result = "external parameter node" } + + override Type getType() { + result = c.getType().getParameterType(i) + or + i = -1 and result = c.asFunction().(Method).getReceiverType() + } + + override predicate isParameterOf(Callable call, int idx) { c = call and i = idx } + + override string toString() { result = "parameter " + i + " of " + c.toString() } + + override predicate hasLocationInfo(string fp, int sl, int sc, int el, int ec) { + c.hasLocationInfo(fp, sl, sc, el, ec) + } + } + + /** A representation of a parameter initialization, defined in source via an SSA node. */ + class SsaParameterNode extends ParameterNode, SsaNode { + override SsaExplicitDefinition ssa; + Parameter parm; + + SsaParameterNode() { ssa.getInstruction() = IR::initParamInstruction(parm) } + + /** Gets the parameter this node initializes. */ + override Parameter asParameter() { result = parm } + + override predicate isParameterOf(Callable c, int i) { parm.isParameterOf(c.getFuncDef(), i) } + } + + /** A representation of a receiver initialization. */ + class ReceiverNode extends SsaParameterNode { + override ReceiverVariable parm; + + /** Gets the receiver variable this node initializes. */ + ReceiverVariable asReceiverVariable() { result = parm } + + /** Holds if this node initializes the receiver variable of `m`. */ + predicate isReceiverOf(MethodDecl m) { parm.isReceiverOf(m) } + } + + private Node getADirectlyWrittenNode() { + exists(Write w | w.writesField(result, _, _) or w.writesElement(result, _, _)) + } + + private DataFlow::Node getAccessPathPredecessor(DataFlow::Node node) { + result = node.(PointerDereferenceNode).getOperand() + or + result = node.(ComponentReadNode).getBase() + } + + private Node getAWrittenNode() { result = getAccessPathPredecessor*(getADirectlyWrittenNode()) } + + /** + * Holds if `tp` is a type that may (directly or indirectly) reference a memory location. + * + * If a value with a mutable type is passed to a function, the function could potentially + * mutate it or something it points to. + */ + predicate mutableType(Type tp) { + exists(Type underlying | underlying = tp.getUnderlyingType() | + not underlying instanceof BoolType and + not underlying instanceof NumericType and + not underlying instanceof StringType and + not underlying instanceof LiteralType + ) + } + + /** + * A node associated with an object after an operation that might have + * changed its state. + * + * This can be either the argument to a callable after the callable returns + * (which might have mutated the argument), or the qualifier of a field after + * an update to the field. + * + * Nodes corresponding to AST elements, for example `ExprNode`, usually refer + * to the value before the update with the exception of `ClassInstanceExpr`, + * which represents the value after the constructor has run. + */ + abstract class PostUpdateNode extends Node { + /** + * Gets the node before the state update. + */ + abstract Node getPreUpdateNode(); + } + + private class DefaultPostUpdateNode extends PostUpdateNode { + Node preupd; + + DefaultPostUpdateNode() { + ( + preupd instanceof AddressOperationNode + or + preupd = any(AddressOperationNode addr).getOperand() + or + preupd = any(PointerDereferenceNode deref).getOperand() + or + preupd = getAWrittenNode() + or + preupd instanceof ArgumentNode and + mutableType(preupd.getType()) + ) and + ( + preupd = this.(SsaNode).getAUse() + or + preupd = this and + not basicLocalFlowStep(_, this) + ) + } + + override Node getPreUpdateNode() { result = preupd } + } + + /** + * A data-flow node that occurs as an argument in a call, including receiver arguments. + */ + class ArgumentNode extends Node { + CallNode c; + int i; + + ArgumentNode() { this = getArgument(c, i) } + + /** + * Holds if this argument occurs at the given position in the given call. + * + * The receiver argument is considered to have index `-1`. + * + * Note that we currently do not track receiver arguments into calls to interface methods. + */ + predicate argumentOf(CallExpr call, int pos) { + call = c.asExpr() and + pos = i and + ( + i != -1 + or + exists(c.(MethodCallNode).getTarget().getBody()) + or + hasExternalSpecification(c.(DataFlow::MethodCallNode).getTarget()) + ) + } + + /** + * Gets the `CallNode` this is an argument to. + */ + CallNode getCall() { result = c } + } + + /** + * A node whose value is returned as a result from a function. + * + * This can either be a node corresponding to an expression in a return statement, + * or a node representing the current value of a named result variable at the exit + * of the function. + */ + class ResultNode extends InstructionNode { + FuncDef fd; + int i; + + ResultNode() { + exists(IR::ReturnInstruction ret | ret.getRoot() = fd | insn = ret.getResult(i)) + or + insn.(IR::ReadResultInstruction).reads(fd.getResultVar(i)) + } + + /** Gets the index of this result among all results of the function. */ + int getIndex() { result = i } + } + + /** + * A data-flow node that reads the value of a variable, constant, field or array element, + * or refers to a function. + */ + class ReadNode extends InstructionNode { + override IR::ReadInstruction insn; + + /** + * Holds if this data-flow node evaluates to value of `v`, which is a value entity, that is, a + * constant, variable, field, function, or method. + */ + predicate reads(ValueEntity v) { insn.reads(v) } + + /** + * Holds if this data-flow node reads the value of SSA variable `v`. + */ + predicate readsSsaVariable(SsaVariable v) { insn = v.getAUse() } + + /** + * Holds if this data-flow node reads the value of field `f` on the value of `base` or its + * implicit dereference. + * + * For example, for the field read `x.width`, `base` is either the data-flow node corresponding + * to `x` or (if `x` is a pointer) the data-flow node corresponding to the implicit dereference + * `*x`, and `f` is the field referenced by `width`. + */ + predicate readsField(Node base, Field f) { + insn.readsField(base.asInstruction(), f) + or + insn.readsField(IR::implicitDerefInstruction(base.asExpr()), f) + } + + /** + * Holds if this data-flow node reads the value of field `package.type.field` on the value of `base` or its + * implicit dereference. + * + * For example, for the field read `x.width`, `base` is either the data-flow node corresponding + * to `x` or (if `x` is a pointer) the data-flow node corresponding to the implicit dereference + * `*x`, and `x` has the type `package.type`. + */ + predicate readsField(Node base, string package, string type, string field) { + exists(Field f | f.hasQualifiedName(package, type, field) | this.readsField(base, f)) + } + + /** + * Holds if this data-flow node looks up method `m` on the value of `receiver` or its implicit + * dereference. + * + * For example, for the method read `x.area`, `receiver` is either the data-flow node corresponding + * to `x` or (if `x` is a pointer) the data-flow node corresponding to the implicit dereference + * `*x`, and `m` is the method referenced by `area`. + */ + predicate readsMethod(Node receiver, Method m) { + insn.readsMethod(receiver.asInstruction(), m) + or + insn.readsMethod(IR::implicitDerefInstruction(receiver.asExpr()), m) + } + + /** + * Holds if this data-flow node looks up method `package.type.name` on the value of `receiver` + * or its implicit dereference. + * + * For example, for the method read `x.name`, `receiver` is either the data-flow node corresponding + * to `x` or (if `x` is a pointer) the data-flow node corresponding to the implicit dereference + * `*x`, and `package.type` is a type of `x` that defines a method named `name`. + */ + predicate readsMethod(Node receiver, string package, string type, string name) { + exists(Method m | m.hasQualifiedName(package, type, name) | this.readsMethod(receiver, m)) + } + + /** + * Holds if this data-flow node reads the value of element `index` on the value of `base` or its + * implicit dereference. + * + * For example, for the element read `xs[i]`, `base` is either the data-flow node corresponding + * to `xs` or (if `xs` is a pointer) the data-flow node corresponding to the implicit dereference + * `*xs`, and `index` is the data-flow node corresponding to `i`. + */ + predicate readsElement(Node base, Node index) { + insn.readsElement(base.asInstruction(), index.asInstruction()) + or + insn.readsElement(IR::implicitDerefInstruction(base.asExpr()), index.asInstruction()) + } + } + + /** + * A data-flow node that reads the value of a field from a struct, or an element from an array, slice, map or string. + */ + class ComponentReadNode extends ReadNode { + override IR::ComponentReadInstruction insn; + + /** Gets the data-flow node representing the base from which the field or element is read. */ + Node getBase() { result = DataFlow::instructionNode(insn.getBase()) } + } + + /** + * A data-flow node that reads an element of an array, map, slice or string. + */ + class ElementReadNode extends ComponentReadNode { + override IR::ElementReadInstruction insn; + + /** Gets the data-flow node representing the index of the element being read. */ + Node getIndex() { result = DataFlow::instructionNode(insn.getIndex()) } + + /** Holds if this data-flow node reads element `index` of `base`. */ + predicate reads(Node base, Node index) { this.readsElement(base, index) } + } + + /** + * A data-flow node that extracts a substring or slice from a string, array, pointer to array, + * or slice. + */ + class SliceNode extends InstructionNode { + override IR::SliceInstruction insn; + + /** Gets the base of this slice node. */ + Node getBase() { result = DataFlow::instructionNode(insn.getBase()) } + + /** Gets the lower bound of this slice node. */ + Node getLow() { result = DataFlow::instructionNode(insn.getLow()) } + + /** Gets the upper bound of this slice node. */ + Node getHigh() { result = DataFlow::instructionNode(insn.getHigh()) } + + /** Gets the maximum of this slice node. */ + Node getMax() { result = DataFlow::instructionNode(insn.getMax()) } + } + + /** + * A data-flow node corresponding to an expression with a binary operator. + */ + class BinaryOperationNode extends Node { + Node left; + Node right; + string op; + + BinaryOperationNode() { + exists(BinaryExpr bin | bin = this.asExpr() | + left = DataFlow::exprNode(bin.getLeftOperand()) and + right = DataFlow::exprNode(bin.getRightOperand()) and + op = bin.getOperator() + ) + or + exists(IR::EvalCompoundAssignRhsInstruction rhs, CompoundAssignStmt assgn, string o | + rhs = this.asInstruction() and assgn = rhs.getAssignment() and o = assgn.getOperator() + | + left = DataFlow::exprNode(assgn.getLhs()) and + right = DataFlow::exprNode(assgn.getRhs()) and + op = o.substring(0, o.length() - 1) + ) + or + exists(IR::EvalIncDecRhsInstruction rhs, IncDecStmt ids | + rhs = this.asInstruction() and ids = rhs.getStmt() + | + left = DataFlow::exprNode(ids.getOperand()) and + right = + DataFlow::instructionNode(any(IR::EvalImplicitOneInstruction one | one.getStmt() = ids)) and + op = ids.getOperator().charAt(0) + ) + } + + /** Holds if this operation may have observable side effects. */ + predicate mayHaveSideEffects() { this.asExpr().mayHaveOwnSideEffects() } + + /** Gets the left operand of this operation. */ + Node getLeftOperand() { result = left } + + /** Gets the right operand of this operation. */ + Node getRightOperand() { result = right } + + /** Gets an operand of this operation. */ + Node getAnOperand() { result = left or result = right } + + /** Gets the operator of this operation. */ + string getOperator() { result = op } + + /** Holds if `x` and `y` are the operands of this operation, in either order. */ + predicate hasOperands(Node x, Node y) { + x = this.getAnOperand() and + y = this.getAnOperand() and + x != y + } + } + + /** + * A data-flow node corresponding to an expression with a unary operator. + */ + class UnaryOperationNode extends InstructionNode { + UnaryOperationNode() { + this.asExpr() instanceof UnaryExpr + or + this.asExpr() instanceof StarExpr + or + insn instanceof IR::EvalImplicitDerefInstruction + } + + /** Holds if this operation may have observable side effects. */ + predicate mayHaveSideEffects() { + this.asExpr().mayHaveOwnSideEffects() + or + insn instanceof IR::EvalImplicitDerefInstruction + } + + /** Gets the operand of this operation. */ + Node getOperand() { + result = DataFlow::exprNode(this.asExpr().(UnaryExpr).getOperand()) + or + result = DataFlow::exprNode(this.asExpr().(StarExpr).getBase()) + or + result = DataFlow::exprNode(insn.(IR::EvalImplicitDerefInstruction).getOperand()) + } + + /** Gets the operator of this operation. */ + string getOperator() { + result = this.asExpr().(UnaryExpr).getOperator() + or + this.asExpr() instanceof StarExpr and + result = "*" + or + insn instanceof IR::EvalImplicitDerefInstruction and + result = "*" + } + } + + /** + * A data-flow node that dereferences a pointer. + */ + class PointerDereferenceNode extends UnaryOperationNode { + PointerDereferenceNode() { + this.asExpr() instanceof StarExpr + or + this.asExpr() instanceof DerefExpr + or + insn instanceof IR::EvalImplicitDerefInstruction + } + } + + /** + * A data-flow node that takes the address of a memory location. + */ + class AddressOperationNode extends UnaryOperationNode, ExprNode { + override AddressExpr expr; + } + + /** + * A data-flow node that reads the value of a field. + */ + class FieldReadNode extends ComponentReadNode { + override IR::FieldReadInstruction insn; + + /** Gets the field this node reads. */ + Field getField() { result = insn.getField() } + + /** Gets the name of the field this node reads. */ + string getFieldName() { result = this.getField().getName() } + } + + /** + * A data-flow node that refers to a method. + */ + class MethodReadNode extends ReadNode { + override IR::MethodReadInstruction insn; + + /** Gets the receiver node on which the method is referenced. */ + Node getReceiver() { result = DataFlow::instructionNode(insn.getReceiver()) } + + /** Gets the method this node refers to. */ + Method getMethod() { result = insn.getMethod() } + + /** Gets the name of the method this node refers to. */ + string getMethodName() { result = this.getMethod().getName() } + } + + /** + * A data-flow node performing a relational comparison using `<`, `<=`, `>` or `>=`. + */ + class RelationalComparisonNode extends BinaryOperationNode, ExprNode { + override RelationalComparisonExpr expr; + + /** Holds if this comparison evaluates to `outcome` iff `lesser <= greater + bias`. */ + predicate leq(boolean outcome, Node lesser, Node greater, int bias) { + outcome = true and + lesser = DataFlow::exprNode(expr.getLesserOperand()) and + greater = DataFlow::exprNode(expr.getGreaterOperand()) and + (if expr.isStrict() then bias = -1 else bias = 0) + or + outcome = false and + lesser = DataFlow::exprNode(expr.getGreaterOperand()) and + greater = DataFlow::exprNode(expr.getLesserOperand()) and + (if expr.isStrict() then bias = 0 else bias = -1) + } + } + + /** + * A data-flow node performing an equality test using `==` or `!=`. + */ + class EqualityTestNode extends BinaryOperationNode, ExprNode { + override EqualityTestExpr expr; + + /** Holds if this comparison evaluates to `outcome` iff `lhs == rhs`. */ + predicate eq(boolean outcome, Node lhs, Node rhs) { + outcome = expr.getPolarity() and + expr.hasOperands(lhs.asExpr(), rhs.asExpr()) + } + + /** Gets the polarity of this equality test, that is, `true` for `==` and `false` for `!=`. */ + boolean getPolarity() { result = expr.getPolarity() } + } + + /** + * A data-flow node performing a type cast using either a type conversion + * or an assertion. + */ + class TypeCastNode extends ExprNode { + TypeCastNode() { + expr instanceof TypeAssertExpr + or + expr instanceof ConversionExpr + } + + /** + * Gets the type being converted to. Note this differs from `this.getType()` for + * `TypeAssertExpr`s that return a (result, ok) tuple. + */ + Type getResultType() { + if this.getType() instanceof TupleType + then result = this.getType().(TupleType).getComponentType(0) + else result = this.getType() + } + + /** Gets the operand of the type cast. */ + DataFlow::Node getOperand() { + result.asExpr() = expr.(TypeAssertExpr).getExpr() + or + result.asExpr() = expr.(ConversionExpr).getOperand() + } + } + + /** + * A data-flow node representing an element of an array, map, slice or string defined from `range` statement. + * + * Example: in `_, x := range y { ... }`, this represents the `Node` that extracts the element from the + * range statement, which will flow to `x`. + */ + class RangeElementNode extends Node { + DataFlow::Node base; + IR::ExtractTupleElementInstruction extract; + + RangeElementNode() { + this.asInstruction() = extract and + extract.extractsElement(_, 1) and + extract.getBase().(IR::GetNextEntryInstruction).getDomain() = base.asInstruction() + } + + /** Gets the data-flow node representing the base from which the element is read. */ + DataFlow::Node getBase() { result = base } + } + + /** + * A data-flow node representing an index of an array, map, slice or string defined from `range` statement. + * + * Example: in `i, _ := range y { ... }`, this represents the `Node` that extracts the index from the + * range statement, which will flow to `i`. + */ + class RangeIndexNode extends Node { + DataFlow::Node base; + + RangeIndexNode() { + // when there is a comma, as in `i, x := range y { ... }` + exists(IR::ExtractTupleElementInstruction extract | + this.asInstruction() = extract and + extract.extractsElement(_, 0) and + extract.getBase().(IR::GetNextEntryInstruction).getDomain() = base.asInstruction() + ) + or + // when there is no comma, as in `i := range y { ... }` + not exists(IR::ExtractTupleElementInstruction extract | + extract.getBase() = this.asInstruction() + ) and + base.asInstruction() = this.asInstruction().(IR::GetNextEntryInstruction).getDomain() + } + + /** Gets the data-flow node representing the base from which the element is read. */ + DataFlow::Node getBase() { result = base } + } +} + +private import Private +private import Public + +class SummaryPostUpdateNode extends SummaryNode, PostUpdateNode { + private Node pre; + + SummaryPostUpdateNode() { FlowSummaryImpl::Private::summaryPostUpdateNode(this, pre) } + + override Node getPreUpdateNode() { result = pre } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll new file mode 100644 index 00000000000..9b8cfb194d7 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll @@ -0,0 +1,348 @@ +private import go +private import DataFlowUtil +private import DataFlowImplCommon +private import ContainerFlow +private import FlowSummaryImpl as FlowSummaryImpl +import DataFlowNodes::Private + +private newtype TReturnKind = + MkReturnKind(int i) { exists(SignatureType st | exists(st.getResultType(i))) } + +ReturnKind getReturnKind(int i) { result = MkReturnKind(i) } + +/** + * A return kind. A return kind describes how a value can be returned + * from a callable. For Go, this is either a return of a single value + * or of one of multiple values. + */ +class ReturnKind extends TReturnKind { + int i; + + ReturnKind() { this = MkReturnKind(i) } + + /** Gets the index of this return value. */ + int getIndex() { result = i } + + /** Gets a textual representation of this return kind. */ + string toString() { result = "return[" + i + "]" } +} + +/** + * Gets a node that can read the value returned from `call` with return kind + * `kind`. + */ +OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { + exists(DataFlow::CallNode c, int i | c.asExpr() = call and kind = MkReturnKind(i) | + result = c.getResult(i) + ) +} + +/** + * Holds if data flows from `nodeFrom` to `nodeTo` in exactly one local + * (intra-procedural) step, not taking function models into account. + */ +predicate basicLocalFlowStep(Node nodeFrom, Node nodeTo) { + // Instruction -> Instruction + exists(Expr pred, Expr succ | + succ.(LogicalBinaryExpr).getAnOperand() = pred or + succ.(ConversionExpr).getOperand() = pred + | + nodeFrom = exprNode(pred) and + nodeTo = exprNode(succ) + ) + or + // Type assertion: if in the context `checked, ok := e.(*Type)` (in which + // case tuple-extraction instructions exist), flow from `e` to `e.(*Type)[0]`; + // otherwise flow from `e` to `e.(*Type)`. + exists(IR::Instruction evalAssert, TypeAssertExpr assert | + nodeFrom.asExpr() = assert.getExpr() and + evalAssert = IR::evalExprInstruction(assert) and + if exists(IR::extractTupleElement(evalAssert, _)) + then nodeTo.asInstruction() = IR::extractTupleElement(evalAssert, 0) + else nodeTo.asInstruction() = evalAssert + ) + or + // Instruction -> SSA + exists(IR::Instruction pred, SsaExplicitDefinition succ | + succ.getRhs() = pred and + nodeFrom = instructionNode(pred) and + nodeTo = ssaNode(succ) + ) + or + // SSA -> SSA + exists(SsaDefinition pred, SsaDefinition succ | + succ.(SsaVariableCapture).getSourceVariable() = pred.(SsaExplicitDefinition).getSourceVariable() or + succ.(SsaPseudoDefinition).getAnInput() = pred + | + nodeFrom = ssaNode(pred) and + nodeTo = ssaNode(succ) + ) + or + // SSA -> Instruction + exists(SsaDefinition pred, IR::Instruction succ | + succ = pred.getVariable().getAUse() and + nodeFrom = ssaNode(pred) and + nodeTo = instructionNode(succ) + ) + or + // GlobalFunctionNode -> use + nodeFrom = + any(GlobalFunctionNode fn | fn.getFunction() = nodeTo.asExpr().(FunctionName).getTarget()) +} + +/** + * Holds if data can flow from `node1` to `node2` in a way that loses the + * calling context. For example, this would happen with flow through a + * global or static variable. + */ +predicate jumpStep(Node n1, Node n2) { + exists(ValueEntity v, Write w | + not v instanceof SsaSourceVariable and + not v instanceof Field and + w.writes(v, n1) and + n2 = v.getARead() + ) +} + +/** + * Holds if data can flow from `node1` to `node2` via an assignment to `c`. + * Thus, `node2` references an object with a content `x` that contains the + * value of `node1`. + */ +predicate storeStep(Node node1, Content c, Node node2) { + // a write `(*p).f = rhs` is modelled as two store steps: `rhs` is flows into field `f` of `(*p)`, + // which in turn flows into the pointer content of `p` + exists(Write w, Field f, DataFlow::Node base, DataFlow::Node rhs | w.writesField(base, f, rhs) | + node1 = rhs and + node2.(PostUpdateNode).getPreUpdateNode() = base and + c = any(DataFlow::FieldContent fc | fc.getField() = f) + or + node1 = base and + node2.(PostUpdateNode).getPreUpdateNode() = node1.(PointerDereferenceNode).getOperand() and + c = any(DataFlow::PointerContent pc | pc.getPointerType() = node2.getType()) + ) + or + node1 = node2.(AddressOperationNode).getOperand() and + c = any(DataFlow::PointerContent pc | pc.getPointerType() = node2.getType()) + or + FlowSummaryImpl::Private::Steps::summaryStoreStep(node1, c, node2) + or + containerStoreStep(node1, node2, c) +} + +/** + * Holds if data can flow from `node1` to `node2` via a read of `c`. + * Thus, `node1` references an object with a content `c` whose value ends up in + * `node2`. + */ +predicate readStep(Node node1, Content c, Node node2) { + node1 = node2.(PointerDereferenceNode).getOperand() and + c = any(DataFlow::PointerContent pc | pc.getPointerType() = node1.getType()) + or + exists(FieldReadNode read | + node2 = read and + node1 = read.getBase() and + c = any(DataFlow::FieldContent fc | fc.getField() = read.getField()) + ) + or + FlowSummaryImpl::Private::Steps::summaryReadStep(node1, c, node2) + or + containerReadStep(node1, node2, c) +} + +/** + * Holds if values stored inside content `c` are cleared at node `n`. + */ +predicate clearsContent(Node n, Content c) { + // Because our post-update nodes are shared between multiple pre-update + // nodes, attempting to clear content causes summary stores into arg in + // particular to malfunction. + none() + // c instanceof FieldContent and + // FlowSummaryImpl::Private::Steps::summaryStoresIntoArg(c, n) + // or + // FlowSummaryImpl::Private::Steps::summaryClearsContent(n, c) +} + +/** Gets the type of `n` used for type pruning. */ +DataFlowType getNodeType(Node n) { + result = n.getType() + or + result = FlowSummaryImpl::Private::summaryNodeType(n) +} + +/** Gets a string representation of a type returned by `getNodeType()`. */ +string ppReprType(Type t) { result = t.toString() } + +/** + * Holds if `t1` and `t2` are compatible, that is, whether data can flow from + * a node of type `t1` to a node of type `t2`. + */ +pragma[inline] +predicate compatibleTypes(Type t1, Type t2) { + any() // stub implementation +} + +////////////////////////////////////////////////////////////////////////////// +// Java QL library compatibility wrappers +////////////////////////////////////////////////////////////////////////////// +/** A node that performs a type cast. */ +class CastNode extends ExprNode { + override ConversionExpr expr; +} + +class DataFlowExpr = Expr; + +class DataFlowType = Type; + +class DataFlowLocation = Location; + +private newtype TDataFlowCallable = + TCallable(Callable c) or + TFileScope(File f) + +class DataFlowCallable extends TDataFlowCallable { + Callable asCallable() { this = TCallable(result) } + + File asFileScope() { this = TFileScope(result) } + + FuncDef getFuncDef() { result = this.asCallable().getFuncDef() } + + Function asFunction() { result = this.asCallable().asFunction() } + + FuncLit asFuncLit() { result = this.asCallable().asFuncLit() } + + SignatureType getType() { result = this.asCallable().getType() } + + string toString() { + result = this.asCallable().toString() or + result = "File scope: " + this.asFileScope().toString() + } + + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.asCallable().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) or + this.asFileScope().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } +} + +/** A function call relevant for data flow. */ +class DataFlowCall extends Expr { + DataFlow::CallNode call; + + DataFlowCall() { this = call.asExpr() } + + /** + * Gets the nth argument for this call. + */ + Node getArgument(int n) { result = call.getArgument(n) } + + /** Gets the data flow node corresponding to this call. */ + ExprNode getNode() { result = call } + + /** Gets the enclosing callable of this call. */ + DataFlowCallable getEnclosingCallable() { + result.asCallable().getFuncDef() = this.getEnclosingFunction() + or + not exists(this.getEnclosingFunction()) and result.asFileScope() = this.getFile() + } +} + +/** Holds if `e` is an expression that always has the same Boolean value `val`. */ +private predicate constantBooleanExpr(Expr e, boolean val) { + e.getBoolValue() = val + or + exists(SsaExplicitDefinition v, Expr src | + IR::evalExprInstruction(e) = v.getVariable().getAUse() and + IR::evalExprInstruction(src) = v.getRhs() and + constantBooleanExpr(src, val) + ) +} + +/** An argument that always has the same Boolean value. */ +private class ConstantBooleanArgumentNode extends ArgumentNode, ExprNode { + ConstantBooleanArgumentNode() { constantBooleanExpr(this.getExpr(), _) } + + /** Gets the Boolean value of this expression. */ + boolean getBooleanValue() { constantBooleanExpr(this.getExpr(), result) } +} + +/** + * Returns a guard that will certainly not hold in calling context `call`. + * + * In particular it does not hold because it checks that `param` has value `b`, but + * in context `call` it is known to have value `!b`. Note this is `noinline`d in order + * to avoid a bad join order in `isUnreachableInCall`. + */ +pragma[noinline] +private ControlFlow::ConditionGuardNode getAFalsifiedGuard(DataFlowCall call) { + exists(SsaParameterNode param, ConstantBooleanArgumentNode arg | + // get constant bool argument and parameter for this call + viableParamArg(call, pragma[only_bind_into](param), pragma[only_bind_into](arg)) and + // which is used in a guard controlling `n` with the opposite value of `arg` + result.ensures(param.getAUse(), arg.getBooleanValue().booleanNot()) + ) +} + +/** + * Holds if the node `n` is unreachable when the call context is `call`. + */ +predicate isUnreachableInCall(Node n, DataFlowCall call) { + getAFalsifiedGuard(call).dominates(n.getBasicBlock()) +} + +int accessPathLimit() { result = 5 } + +/** + * Holds if access paths with `c` at their head always should be tracked at high + * precision. This disables adaptive access path precision for such access paths. + */ +predicate forceHighPrecision(Content c) { + c instanceof ArrayContent or c instanceof CollectionContent +} + +/** The unit type. */ +private newtype TUnit = TMkUnit() + +/** The trivial type with a single element. */ +class Unit extends TUnit { + /** Gets a textual representation of this element. */ + string toString() { result = "unit" } +} + +/** + * Gets the `i`th argument of call `c`, where the receiver of a method call + * counts as argument -1. + */ +Node getArgument(CallNode c, int i) { + result = c.getArgument(i) + or + result = c.(MethodCallNode).getReceiver() and + i = -1 +} + +/** Holds if `n` should be hidden from path explanations. */ +predicate nodeIsHidden(Node n) { none() } + +class LambdaCallKind = Unit; + +/** Holds if `creation` is an expression that creates a lambda of kind `kind` for `c`. */ +predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) { none() } + +/** Holds if `call` is a lambda call of kind `kind` where `receiver` is the lambda expression. */ +predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { none() } + +/** Extra data-flow steps needed for lambda flow analysis. */ +predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { none() } + +/** + * Holds if flow is allowed to pass from parameter `p` and back to itself as a + * side-effect, resulting in a summary from `p` to itself. + * + * One example would be to allow flow like `p.foo = p.bar;`, which is disallowed + * by default as a heuristic. + */ +predicate allowParameterReturnInSelf(ParameterNode p) { + FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(p) +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll new file mode 100644 index 00000000000..47fa923aa08 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -0,0 +1,456 @@ +/** + * Provides Go-specific definitions for use in the data flow library. + */ + +import go +import semmle.go.dataflow.FunctionInputsAndOutputs +private import semmle.go.dataflow.ExternalFlow +private import DataFlowPrivate +private import FlowSummaryImpl as FlowSummaryImpl +import DataFlowNodes::Public + +/** + * Holds if `node` reads an element from `base`, either via an element-read (`base[y]`) expression + * or via a range statement `_, node := range base`. + */ +predicate readsAnElement(DataFlow::Node node, DataFlow::Node base) { + node.(ElementReadNode).readsElement(base, _) or + node.(RangeElementNode).getBase() = base +} + +/** + * A model of a function specifying that the function copies input values from + * a parameter or qualifier to a result. + * + * Note that this only models verbatim copying. Flow that does not preserve exact + * values should be modeled by `TaintTracking::FunctionModel` instead. + */ +abstract class FunctionModel extends Function { + /** Holds if data flows through this function from `input` to `output`. */ + abstract predicate hasDataFlow(FunctionInput input, FunctionOutput output); + + /** Gets an input node for this model for the call `c`. */ + DataFlow::Node getAnInputNode(DataFlow::CallNode c) { this.flowStepForCall(result, _, c) } + + /** Gets an output node for this model for the call `c`. */ + DataFlow::Node getAnOutputNode(DataFlow::CallNode c) { this.flowStepForCall(_, result, c) } + + /** Holds if this function model causes data to flow from `pred` to `succ` for the call `c`. */ + predicate flowStepForCall(DataFlow::Node pred, DataFlow::Node succ, DataFlow::CallNode c) { + c = this.getACall() and + exists(FunctionInput inp, FunctionOutput outp | this.hasDataFlow(inp, outp) | + pred = inp.getNode(c) and + succ = outp.getNode(c) + ) + } + + /** Holds if this function model causes data to flow from `pred` to `succ`. */ + predicate flowStep(DataFlow::Node pred, DataFlow::Node succ) { + this.flowStepForCall(pred, succ, _) + } +} + +/** + * Gets the `Node` corresponding to `insn`. + */ +InstructionNode instructionNode(IR::Instruction insn) { result.asInstruction() = insn } + +/** + * Gets the `Node` corresponding to `e`. + */ +ExprNode exprNode(Expr e) { result.asExpr() = e.stripParens() } + +/** + * Gets the `Node` corresponding to the value of `p` at function entry. + */ +ParameterNode parameterNode(Parameter p) { result.asParameter() = p } + +/** + * Gets the `Node` corresponding to the value of `r` at function entry. + */ +ReceiverNode receiverNode(ReceiverVariable r) { result.asReceiverVariable() = r } + +/** + * Gets the data-flow node corresponding to SSA variable `v`. + */ +SsaNode ssaNode(SsaVariable v) { result.getDefinition() = v.getDefinition() } + +/** + * Gets the data-flow node corresponding to the `i`th element of tuple `t` (which is either a call + * with multiple results, an iterator in a range loop, or the result of a type assertion). + */ +Node extractTupleElement(Node t, int i) { + exists(IR::Instruction insn | t = instructionNode(insn) | + result = instructionNode(IR::extractTupleElement(insn, i)) + ) +} + +/** + * Holds if `node` refers to a value returned alongside a non-nil error value. + * + * For example, `0` in `func tryGetInt() (int, error) { return 0, errors.New("no good") }` + */ +predicate isReturnedWithError(Node node) { + exists(ReturnStmt ret, int nodeArg, int errorArg | + ret.getExpr(nodeArg) = node.asExpr() and + nodeArg != errorArg and + ret.getExpr(errorArg).getType() instanceof ErrorType + // That last condition implies ret.getExpr(errorArg) is non-nil, since nil doesn't implement `error` + ) +} + +/** + * Holds if data flows from `nodeFrom` to `nodeTo` in exactly one local + * (intra-procedural) step. + */ +predicate localFlowStep(Node nodeFrom, Node nodeTo) { + simpleLocalFlowStep(nodeFrom, nodeTo) + or + // Simple flow through library code is included in the exposed local + // step relation, even though flow is technically inter-procedural + FlowSummaryImpl::Private::Steps::summaryThroughStep(nodeFrom, nodeTo, true) +} + +/** + * INTERNAL: do not use. + * + * This is the local flow predicate that's used as a building block in global + * data flow. It may have less flow than the `localFlowStep` predicate. + */ +cached +predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) { + basicLocalFlowStep(nodeFrom, nodeTo) + or + // step through function model + any(FunctionModel m).flowStep(nodeFrom, nodeTo) + or + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true) +} + +/** + * Holds if data flows from `source` to `sink` in zero or more local + * (intra-procedural) steps. + */ +predicate localFlow(Node source, Node sink) { localFlowStep*(source, sink) } + +private newtype TContent = + TFieldContent(Field f) or + TCollectionContent() or + TArrayContent() or + TPointerContent(PointerType p) or + TMapKeyContent() or + TMapValueContent() or + TSyntheticFieldContent(SyntheticField s) + +/** + * A reference contained in an object. Examples include instance fields, the + * contents of a collection object, the contents of an array or pointer. + */ +class Content extends TContent { + /** Gets the type of the contained data for the purpose of type pruning. */ + DataFlowType getType() { result instanceof EmptyInterfaceType } + + /** Gets a textual representation of this element. */ + abstract string toString(); + + /** + * 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`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ + predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + path = "" and sl = 0 and sc = 0 and el = 0 and ec = 0 + } +} + +/** A reference through a field. */ +class FieldContent extends Content, TFieldContent { + Field f; + + FieldContent() { this = TFieldContent(f) } + + /** Gets the field associated with this `FieldContent`. */ + Field getField() { result = f } + + override DataFlowType getType() { result = f.getType() } + + override string toString() { result = f.toString() } + + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + f.getDeclaration().hasLocationInfo(path, sl, sc, el, ec) + } +} + +/** A reference through the contents of some collection-like container. */ +class CollectionContent extends Content, TCollectionContent { + override string toString() { result = "collection" } +} + +/** A reference through an array. */ +class ArrayContent extends Content, TArrayContent { + override string toString() { result = "array" } +} + +/** A reference through a pointer. */ +class PointerContent extends Content, TPointerContent { + PointerType t; + + PointerContent() { this = TPointerContent(t) } + + /** Gets the pointer type that containers with this content must have. */ + PointerType getPointerType() { result = t } + + override DataFlowType getType() { result = t.getBaseType() } + + override string toString() { result = "pointer" } +} + +/** A reference through a map key. */ +class MapKeyContent extends Content, TMapKeyContent { + override string toString() { result = "map.key" } +} + +/** A reference through a map value. */ +class MapValueContent extends Content, TMapValueContent { + override string toString() { result = "map.value" } +} + +class SyntheticFieldContent extends Content, TSyntheticFieldContent { + SyntheticField s; + + SyntheticFieldContent() { this = TSyntheticFieldContent(s) } + + /** Gets the field associated with this `SyntheticFieldContent`. */ + SyntheticField getField() { result = s } + + override DataFlowType getType() { result = s.getType() } + + override string toString() { result = s.toString() } +} + +/** + * A guard that validates some expression. + * + * To use this in a configuration, extend the class and provide a + * characteristic predicate precisely specifying the guard, and override + * `checks` to specify what is being validated and in which branch. + * + * When using a data-flow or taint-flow configuration `cfg`, it is important + * that any classes extending BarrierGuard in scope which are not used in `cfg` + * are disjoint from any classes extending BarrierGuard in scope which are used + * in `cfg`. + */ +abstract class BarrierGuard extends Node { + /** Holds if this guard validates `e` upon evaluating to `branch`. */ + abstract predicate checks(Expr e, boolean branch); + + /** Gets a node guarded by this guard. */ + final Node getAGuardedNode() { + exists(ControlFlow::ConditionGuardNode guard, Node nd, SsaWithFields var | + result = var.getAUse() + | + this.guards(guard, nd, var) and + guard.dominates(result.getBasicBlock()) + ) + } + + /** + * Holds if `guard` markes a point in the control-flow graph where this node + * is known to validate `nd`, which is represented by `ap`. + * + * This predicate exists to enforce a good join order in `getAGuardedNode`. + */ + pragma[noinline] + private predicate guards(ControlFlow::ConditionGuardNode guard, Node nd, SsaWithFields ap) { + this.guards(guard, nd) and nd = ap.getAUse() + } + + /** + * Holds if `guard` markes a point in the control-flow graph where this node + * is known to validate `nd`. + */ + private predicate guards(ControlFlow::ConditionGuardNode guard, Node nd) { + exists(boolean branch | + this.checks(nd.asExpr(), branch) and + guard.ensures(this, branch) + ) + or + exists( + Function f, FunctionInput inp, FunctionOutput outp, DataFlow::Property p, CallNode c, + Node resNode, Node check, boolean outcome + | + this.guardingCall(f, inp, outp, p, c, nd, resNode) and + p.checkOn(check, outcome, resNode) and + guard.ensures(pragma[only_bind_into](check), outcome) + ) + } + + pragma[noinline] + private predicate guardingCall( + Function f, FunctionInput inp, FunctionOutput outp, DataFlow::Property p, CallNode c, Node nd, + Node resNode + ) { + this.guardingFunction(f, inp, outp, p) and + c = f.getACall() and + nd = inp.getNode(c) and + localFlow(pragma[only_bind_out](outp.getNode(c)), resNode) + } + + /** + * Holds if whenever `p` holds of output `outp` of function `f`, this node + * is known to validate the input `inp` of `f`. + * + * We check this by looking for guards on `inp` that dominate a `return` statement that + * is the only `return` in `f` that can return `true`. This means that if `f` returns `true`, + * the guard must have been satisfied. (Similar reasoning is applied for statements returning + * `false`, `nil` or a non-`nil` value.) + */ + private predicate guardingFunction( + Function f, FunctionInput inp, FunctionOutput outp, DataFlow::Property p + ) { + exists(FuncDecl fd, Node arg, Node ret | + fd.getFunction() = f and + localFlow(inp.getExitNode(fd), arg) and + ret = outp.getEntryNode(fd) and + ( + // Case: a function like "if someBarrierGuard(arg) { return true } else { return false }" + exists(ControlFlow::ConditionGuardNode guard | + this.guards(guard, arg) and + guard.dominates(ret.getBasicBlock()) + | + exists(boolean b | + onlyPossibleReturnOfBool(fd, outp, ret, b) and + p.isBoolean(b) + ) + or + onlyPossibleReturnOfNonNil(fd, outp, ret) and + p.isNonNil() + or + onlyPossibleReturnOfNil(fd, outp, ret) and + p.isNil() + ) + or + // Case: a function like "return someBarrierGuard(arg)" + // or "return !someBarrierGuard(arg) && otherCond(...)" + exists(boolean outcome | + ret = getUniqueOutputNode(fd, outp) and + this.checks(arg.asExpr(), outcome) and + // This predicate's contract is (p holds of ret ==> arg is checked), + // (and we have (this has outcome ==> arg is checked)) + // but p.checkOn(ret, outcome, this) gives us (ret has outcome ==> p holds of this), + // so we need to swap outcome and (specifically boolean) p: + DataFlow::booleanProperty(outcome).checkOn(ret, p.asBoolean(), this) + ) + or + // Case: a function like "return guardProxy(arg)" + // or "return !guardProxy(arg) || otherCond(...)" + exists( + Function f2, FunctionInput inp2, FunctionOutput outp2, CallNode c, + DataFlow::Property outpProp + | + ret = getUniqueOutputNode(fd, outp) and + this.guardingFunction(f2, inp2, outp2, outpProp) and + c = f2.getACall() and + arg = inp2.getNode(c) and + ( + // See comment above ("This method's contract...") for rationale re: the inversion of + // `p` and `outpProp` here: + outpProp.checkOn(ret, p.asBoolean(), outp2.getNode(c)) + or + // The particular case where p is non-boolean (i.e., nil or non-nil), and we directly return `c`: + outpProp = p and ret = outp2.getNode(c) + ) + ) + ) + ) + } +} + +DataFlow::Node getUniqueOutputNode(FuncDecl fd, FunctionOutput outp) { + result = unique(DataFlow::Node n | n = outp.getEntryNode(fd) | n) +} + +/** + * Holds if `ret` is a data-flow node whose value contributes to the output `res` of `fd`, + * and that node may have Boolean value `b`. + */ +predicate possiblyReturnsBool(FuncDecl fd, FunctionOutput res, Node ret, Boolean b) { + ret = res.getEntryNode(fd) and + ret.getType().getUnderlyingType() instanceof BoolType and + not ret.getBoolValue() != b +} + +/** + * Holds if `ret` is the only data-flow node whose value contributes to the output `res` of `fd` + * that may have Boolean value `b`, since all the other output nodes have a Boolean value + * other than `b`. + */ +private predicate onlyPossibleReturnOfBool(FuncDecl fd, FunctionOutput res, Node ret, boolean b) { + possiblyReturnsBool(fd, res, ret, b) and + forall(Node otherRet | otherRet = res.getEntryNode(fd) and otherRet != ret | + otherRet.getBoolValue() != b + ) +} + +/** + * Holds if `ret` is a data-flow node whose value contributes to the output `res` of `fd`, + * and that node may evaluate to a value other than `nil`. + */ +predicate possiblyReturnsNonNil(FuncDecl fd, FunctionOutput res, Node ret) { + ret = res.getEntryNode(fd) and + not ret.asExpr() = Builtin::nil().getAReference() +} + +/** + * Holds if `ret` is the only data-flow node whose value contributes to the output `res` of `fd` + * that may have a value other than `nil`, since all the other output nodes evaluate to `nil`. + */ +private predicate onlyPossibleReturnOfNonNil(FuncDecl fd, FunctionOutput res, Node ret) { + possiblyReturnsNonNil(fd, res, ret) and + forall(Node otherRet | otherRet = res.getEntryNode(fd) and otherRet != ret | + otherRet.asExpr() = Builtin::nil().getAReference() + ) +} + +/** + * Holds if function `f`'s result `output`, which must be a return value, cannot be nil. + */ +private predicate certainlyReturnsNonNil(Function f, FunctionOutput output) { + output.isResult(_) and + ( + f.hasQualifiedName("errors", "New") + or + f.hasQualifiedName("fmt", "Errorf") + or + f in [Builtin::new(), Builtin::make()] + or + exists(FuncDecl fd | fd = f.getFuncDecl() | + forex(DataFlow::Node ret | ret = output.getEntryNode(fd) | isCertainlyNotNil(ret)) + ) + ) +} + +/** + * Holds if `node` cannot be `nil`. + */ +private predicate isCertainlyNotNil(DataFlow::Node node) { + node instanceof DataFlow::AddressOperationNode + or + exists(DataFlow::CallNode c, FunctionOutput output | output.getExitNode(c) = node | + certainlyReturnsNonNil(c.getTarget(), output) + ) +} + +/** + * Holds if `ret` is the only data-flow node whose value contributes to the output `res` of `fd` + * that returns `nil`, since all the other output nodes are known to be non-nil. + */ +private predicate onlyPossibleReturnOfNil(FuncDecl fd, FunctionOutput res, DataFlow::Node ret) { + ret = res.getEntryNode(fd) and + ret.asExpr() = Builtin::nil().getAReference() and + forall(DataFlow::Node otherRet | otherRet = res.getEntryNode(fd) and otherRet != ret | + isCertainlyNotNil(otherRet) + ) +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll new file mode 100644 index 00000000000..e59c96a5c17 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -0,0 +1,1155 @@ +/** + * Provides classes and predicates for defining flow summaries. + * + * The definitions in this file are language-independent, and language-specific + * definitions are passed in via the `DataFlowImplSpecific` and + * `FlowSummaryImplSpecific` modules. + */ + +private import FlowSummaryImplSpecific +private import DataFlowImplSpecific::Private +private import DataFlowImplSpecific::Public +private import DataFlowImplCommon + +/** Provides classes and predicates for defining flow summaries. */ +module Public { + private import Private + + /** + * A component used in a flow summary. + * + * Either a parameter or an argument at a given position, a specific + * content type, or a return kind. + */ + class SummaryComponent extends TSummaryComponent { + /** Gets a textual representation of this summary component. */ + string toString() { + exists(Content c | this = TContentSummaryComponent(c) and result = c.toString()) + or + exists(ArgumentPosition pos | + this = TParameterSummaryComponent(pos) and result = "parameter " + pos + ) + or + exists(ParameterPosition pos | + this = TArgumentSummaryComponent(pos) and result = "argument " + pos + ) + or + exists(ReturnKind rk | this = TReturnSummaryComponent(rk) and result = "return (" + rk + ")") + } + } + + /** Provides predicates for constructing summary components. */ + module SummaryComponent { + /** Gets a summary component for content `c`. */ + SummaryComponent content(Content c) { result = TContentSummaryComponent(c) } + + /** Gets a summary component for a parameter at position `pos`. */ + SummaryComponent parameter(ArgumentPosition pos) { result = TParameterSummaryComponent(pos) } + + /** Gets a summary component for an argument at position `pos`. */ + SummaryComponent argument(ParameterPosition pos) { result = TArgumentSummaryComponent(pos) } + + /** Gets a summary component for a return of kind `rk`. */ + SummaryComponent return(ReturnKind rk) { result = TReturnSummaryComponent(rk) } + } + + /** + * A (non-empty) stack of summary components. + * + * A stack is used to represent where data is read from (input) or where it + * is written to (output). For example, an input stack `[Field f, Argument 0]` + * means that data is read from field `f` from the `0`th argument, while an + * output stack `[Field g, Return]` means that data is written to the field + * `g` of the returned object. + */ + class SummaryComponentStack extends TSummaryComponentStack { + /** Gets the head of this stack. */ + SummaryComponent head() { + this = TSingletonSummaryComponentStack(result) or + this = TConsSummaryComponentStack(result, _) + } + + /** Gets the tail of this stack, if any. */ + SummaryComponentStack tail() { this = TConsSummaryComponentStack(_, result) } + + /** Gets the length of this stack. */ + int length() { + this = TSingletonSummaryComponentStack(_) and result = 1 + or + result = 1 + this.tail().length() + } + + /** Gets the stack obtained by dropping the first `i` elements, if any. */ + SummaryComponentStack drop(int i) { + i = 0 and result = this + or + result = this.tail().drop(i - 1) + } + + /** Holds if this stack contains summary component `c`. */ + predicate contains(SummaryComponent c) { c = this.drop(_).head() } + + /** Gets the bottom element of this stack. */ + SummaryComponent bottom() { + this = TSingletonSummaryComponentStack(result) or result = this.tail().bottom() + } + + /** Gets a textual representation of this stack. */ + string toString() { + exists(SummaryComponent head, SummaryComponentStack tail | + head = this.head() and + tail = this.tail() and + result = tail + "." + head + ) + or + exists(SummaryComponent c | + this = TSingletonSummaryComponentStack(c) and + result = c.toString() + ) + } + } + + /** Provides predicates for constructing stacks of summary components. */ + module SummaryComponentStack { + /** Gets a singleton stack containing `c`. */ + SummaryComponentStack singleton(SummaryComponent c) { + result = TSingletonSummaryComponentStack(c) + } + + /** + * Gets the stack obtained by pushing `head` onto `tail`. + * + * Make sure to override `RequiredSummaryComponentStack::required()` in order + * to ensure that the constructed stack exists. + */ + SummaryComponentStack push(SummaryComponent head, SummaryComponentStack tail) { + result = TConsSummaryComponentStack(head, tail) + } + + /** Gets a singleton stack for an argument at position `pos`. */ + SummaryComponentStack argument(ParameterPosition pos) { + result = singleton(SummaryComponent::argument(pos)) + } + + /** Gets a singleton stack representing a return of kind `rk`. */ + SummaryComponentStack return(ReturnKind rk) { result = singleton(SummaryComponent::return(rk)) } + } + + private predicate noComponentSpecificCsv(SummaryComponent sc) { + not exists(getComponentSpecificCsv(sc)) + } + + /** Gets a textual representation of this component used for flow summaries. */ + private string getComponentCsv(SummaryComponent sc) { + result = getComponentSpecificCsv(sc) + or + noComponentSpecificCsv(sc) and + ( + exists(ArgumentPosition pos | + sc = TParameterSummaryComponent(pos) and + result = "Parameter[" + getArgumentPositionCsv(pos) + "]" + ) + or + exists(ParameterPosition pos | + sc = TArgumentSummaryComponent(pos) and + result = "Argument[" + getParameterPositionCsv(pos) + "]" + ) + or + sc = TReturnSummaryComponent(getReturnValueKind()) and result = "ReturnValue" + ) + } + + /** Gets a textual representation of this stack used for flow summaries. */ + string getComponentStackCsv(SummaryComponentStack stack) { + exists(SummaryComponent head, SummaryComponentStack tail | + head = stack.head() and + tail = stack.tail() and + result = getComponentStackCsv(tail) + "." + getComponentCsv(head) + ) + or + exists(SummaryComponent c | + stack = TSingletonSummaryComponentStack(c) and + result = getComponentCsv(c) + ) + } + + /** + * A class that exists for QL technical reasons only (the IPA type used + * to represent component stacks needs to be bounded). + */ + class RequiredSummaryComponentStack extends Unit { + /** + * Holds if the stack obtained by pushing `head` onto `tail` is required. + */ + abstract predicate required(SummaryComponent head, SummaryComponentStack tail); + } + + /** A callable with a flow summary. */ + abstract class SummarizedCallable extends DataFlowCallable { + /** + * Holds if data may flow from `input` to `output` through this callable. + * + * `preservesValue` indicates whether this is a value-preserving step + * or a taint-step. + * + * Input specifications are restricted to stacks that end with + * `SummaryComponent::argument(_)`, preceded by zero or more + * `SummaryComponent::return(_)` or `SummaryComponent::content(_)` components. + * + * Output specifications are restricted to stacks that end with + * `SummaryComponent::return(_)` or `SummaryComponent::argument(_)`. + * + * Output stacks ending with `SummaryComponent::return(_)` can be preceded by zero + * or more `SummaryComponent::content(_)` components. + * + * Output stacks ending with `SummaryComponent::argument(_)` can be preceded by an + * optional `SummaryComponent::parameter(_)` component, which in turn can be preceded + * by zero or more `SummaryComponent::content(_)` components. + */ + pragma[nomagic] + predicate propagatesFlow( + SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue + ) { + none() + } + + /** + * Holds if values stored inside `content` are cleared on objects passed as + * arguments at position `pos` to this callable. + */ + pragma[nomagic] + predicate clearsContent(ParameterPosition pos, Content content) { none() } + } +} + +/** + * Provides predicates for compiling flow summaries down to atomic local steps, + * read steps, and store steps. + */ +module Private { + private import Public + import AccessPathSyntax + + newtype TSummaryComponent = + TContentSummaryComponent(Content c) or + TParameterSummaryComponent(ArgumentPosition pos) or + TArgumentSummaryComponent(ParameterPosition pos) or + TReturnSummaryComponent(ReturnKind rk) + + private TParameterSummaryComponent thisParam() { + result = TParameterSummaryComponent(instanceParameterPosition()) + } + + newtype TSummaryComponentStack = + TSingletonSummaryComponentStack(SummaryComponent c) or + TConsSummaryComponentStack(SummaryComponent head, SummaryComponentStack tail) { + any(RequiredSummaryComponentStack x).required(head, tail) + or + any(RequiredSummaryComponentStack x).required(TParameterSummaryComponent(_), tail) and + head = thisParam() + or + derivedFluentFlowPush(_, _, _, head, tail, _) + } + + pragma[nomagic] + private predicate summary( + SummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output, + boolean preservesValue + ) { + c.propagatesFlow(input, output, preservesValue) + or + // observe side effects of callbacks on input arguments + c.propagatesFlow(output, input, preservesValue) and + preservesValue = true and + isCallbackParameter(input) and + isContentOfArgument(output, _) + or + // flow from the receiver of a callback into the instance-parameter + exists(SummaryComponentStack s, SummaryComponentStack callbackRef | + c.propagatesFlow(s, _, _) or c.propagatesFlow(_, s, _) + | + callbackRef = s.drop(_) and + (isCallbackParameter(callbackRef) or callbackRef.head() = TReturnSummaryComponent(_)) and + input = callbackRef.tail() and + output = TConsSummaryComponentStack(thisParam(), input) and + preservesValue = true + ) + or + exists(SummaryComponentStack arg, SummaryComponentStack return | + derivedFluentFlow(c, input, arg, return, preservesValue) + | + arg.length() = 1 and + output = return + or + exists(SummaryComponent head, SummaryComponentStack tail | + derivedFluentFlowPush(c, input, arg, head, tail, 0) and + output = SummaryComponentStack::push(head, tail) + ) + ) + or + // Chain together summaries where values get passed into callbacks along the way + exists(SummaryComponentStack mid, boolean preservesValue1, boolean preservesValue2 | + c.propagatesFlow(input, mid, preservesValue1) and + c.propagatesFlow(mid, output, preservesValue2) and + mid.drop(mid.length() - 2) = + SummaryComponentStack::push(TParameterSummaryComponent(_), + SummaryComponentStack::singleton(TArgumentSummaryComponent(_))) and + preservesValue = preservesValue1.booleanAnd(preservesValue2) + ) + } + + /** + * Holds if `c` has a flow summary from `input` to `arg`, where `arg` + * writes to (contents of) arguments at position `pos`, and `c` has a + * value-preserving flow summary from the arguments at position `pos` + * to a return value (`return`). + * + * In such a case, we derive flow from `input` to (contents of) the return + * value. + * + * As an example, this simplifies modeling of fluent methods: + * for `StringBuilder.append(x)` with a specified value flow from qualifier to + * return value and taint flow from argument 0 to the qualifier, then this + * allows us to infer taint flow from argument 0 to the return value. + */ + pragma[nomagic] + private predicate derivedFluentFlow( + SummarizedCallable c, SummaryComponentStack input, SummaryComponentStack arg, + SummaryComponentStack return, boolean preservesValue + ) { + exists(ParameterPosition pos | + summary(c, input, arg, preservesValue) and + isContentOfArgument(arg, pos) and + summary(c, SummaryComponentStack::argument(pos), return, true) and + return.bottom() = TReturnSummaryComponent(_) + ) + } + + pragma[nomagic] + private predicate derivedFluentFlowPush( + SummarizedCallable c, SummaryComponentStack input, SummaryComponentStack arg, + SummaryComponent head, SummaryComponentStack tail, int i + ) { + derivedFluentFlow(c, input, arg, tail, _) and + head = arg.drop(i).head() and + i = arg.length() - 2 + or + exists(SummaryComponent head0, SummaryComponentStack tail0 | + derivedFluentFlowPush(c, input, arg, head0, tail0, i + 1) and + head = arg.drop(i).head() and + tail = SummaryComponentStack::push(head0, tail0) + ) + } + + private predicate isCallbackParameter(SummaryComponentStack s) { + s.head() = TParameterSummaryComponent(_) and exists(s.tail()) + } + + private predicate isContentOfArgument(SummaryComponentStack s, ParameterPosition pos) { + s.head() = TContentSummaryComponent(_) and isContentOfArgument(s.tail(), pos) + or + s = SummaryComponentStack::argument(pos) + } + + private predicate outputState(SummarizedCallable c, SummaryComponentStack s) { + summary(c, _, s, _) + or + exists(SummaryComponentStack out | + outputState(c, out) and + out.head() = TContentSummaryComponent(_) and + s = out.tail() + ) + or + // Add the argument node corresponding to the requested post-update node + inputState(c, s) and isCallbackParameter(s) + } + + private predicate inputState(SummarizedCallable c, SummaryComponentStack s) { + summary(c, s, _, _) + or + exists(SummaryComponentStack inp | inputState(c, inp) and s = inp.tail()) + or + exists(SummaryComponentStack out | + outputState(c, out) and + out.head() = TParameterSummaryComponent(_) and + s = out.tail() + ) + } + + private newtype TSummaryNodeState = + TSummaryNodeInputState(SummaryComponentStack s) { inputState(_, s) } or + TSummaryNodeOutputState(SummaryComponentStack s) { outputState(_, s) } or + TSummaryNodeClearsContentState(ParameterPosition pos, boolean post) { + any(SummarizedCallable sc).clearsContent(pos, _) and post in [false, true] + } + + /** + * A state used to break up (complex) flow summaries into atomic flow steps. + * For a flow summary + * + * ```ql + * propagatesFlow( + * SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue + * ) + * ``` + * + * the following states are used: + * + * - `TSummaryNodeInputState(SummaryComponentStack s)`: + * this state represents that the components in `s` _have been read_ from the + * input. + * - `TSummaryNodeOutputState(SummaryComponentStack s)`: + * this state represents that the components in `s` _remain to be written_ to + * the output. + */ + class SummaryNodeState extends TSummaryNodeState { + /** Holds if this state is a valid input state for `c`. */ + pragma[nomagic] + predicate isInputState(SummarizedCallable c, SummaryComponentStack s) { + this = TSummaryNodeInputState(s) and + inputState(c, s) + } + + /** Holds if this state is a valid output state for `c`. */ + pragma[nomagic] + predicate isOutputState(SummarizedCallable c, SummaryComponentStack s) { + this = TSummaryNodeOutputState(s) and + outputState(c, s) + } + + /** Gets a textual representation of this state. */ + string toString() { + exists(SummaryComponentStack s | + this = TSummaryNodeInputState(s) and + result = "read: " + s + ) + or + exists(SummaryComponentStack s | + this = TSummaryNodeOutputState(s) and + result = "to write: " + s + ) + or + exists(ParameterPosition pos, boolean post, string postStr | + this = TSummaryNodeClearsContentState(pos, post) and + (if post = true then postStr = " (post)" else postStr = "") and + result = "clear: " + pos + postStr + ) + } + } + + /** + * Holds if `state` represents having read from a parameter at position + * `pos` in `c`. In this case we are not synthesizing a data-flow node, + * but instead assume that a relevant parameter node already exists. + */ + private predicate parameterReadState( + SummarizedCallable c, SummaryNodeState state, ParameterPosition pos + ) { + state.isInputState(c, SummaryComponentStack::argument(pos)) + } + + /** + * Holds if a synthesized summary node is needed for the state `state` in summarized + * callable `c`. + */ + predicate summaryNodeRange(SummarizedCallable c, SummaryNodeState state) { + state.isInputState(c, _) and + not parameterReadState(c, state, _) + or + state.isOutputState(c, _) + or + exists(ParameterPosition pos | + c.clearsContent(pos, _) and + state = TSummaryNodeClearsContentState(pos, _) + ) + } + + pragma[noinline] + private Node summaryNodeInputState(SummarizedCallable c, SummaryComponentStack s) { + exists(SummaryNodeState state | state.isInputState(c, s) | + result = summaryNode(c, state) + or + exists(ParameterPosition pos | + parameterReadState(c, state, pos) and + result.(ParamNode).isParameterOf(c, pos) + ) + ) + } + + pragma[noinline] + private Node summaryNodeOutputState(SummarizedCallable c, SummaryComponentStack s) { + exists(SummaryNodeState state | + state.isOutputState(c, s) and + result = summaryNode(c, state) + ) + } + + /** + * Holds if a write targets `post`, which is a post-update node for a + * parameter at position `pos` in `c`. + */ + private predicate isParameterPostUpdate(Node post, SummarizedCallable c, ParameterPosition pos) { + post = summaryNodeOutputState(c, SummaryComponentStack::argument(pos)) + } + + /** Holds if a parameter node at position `pos` is required for `c`. */ + predicate summaryParameterNodeRange(SummarizedCallable c, ParameterPosition pos) { + parameterReadState(c, _, pos) + or + isParameterPostUpdate(_, c, pos) + or + c.clearsContent(pos, _) + } + + private predicate callbackOutput( + SummarizedCallable c, SummaryComponentStack s, Node receiver, ReturnKind rk + ) { + any(SummaryNodeState state).isInputState(c, s) and + s.head() = TReturnSummaryComponent(rk) and + receiver = summaryNodeInputState(c, s.drop(1)) + } + + private predicate callbackInput( + SummarizedCallable c, SummaryComponentStack s, Node receiver, ArgumentPosition pos + ) { + any(SummaryNodeState state).isOutputState(c, s) and + s.head() = TParameterSummaryComponent(pos) and + receiver = summaryNodeInputState(c, s.drop(1)) + } + + /** Holds if a call targeting `receiver` should be synthesized inside `c`. */ + predicate summaryCallbackRange(SummarizedCallable c, Node receiver) { + callbackOutput(c, _, receiver, _) + or + callbackInput(c, _, receiver, _) + } + + /** + * Gets the type of synthesized summary node `n`. + * + * The type is computed based on the language-specific predicates + * `getContentType()`, `getReturnType()`, `getCallbackParameterType()`, and + * `getCallbackReturnType()`. + */ + DataFlowType summaryNodeType(Node n) { + exists(Node pre | + summaryPostUpdateNode(n, pre) and + result = getNodeType(pre) + ) + or + exists(SummarizedCallable c, SummaryComponentStack s, SummaryComponent head | head = s.head() | + n = summaryNodeInputState(c, s) and + ( + exists(Content cont | + head = TContentSummaryComponent(cont) and result = getContentType(cont) + ) + or + exists(ReturnKind rk | + head = TReturnSummaryComponent(rk) and + result = + getCallbackReturnType(getNodeType(summaryNodeInputState(pragma[only_bind_out](c), + s.drop(1))), rk) + ) + ) + or + n = summaryNodeOutputState(c, s) and + ( + exists(Content cont | + head = TContentSummaryComponent(cont) and result = getContentType(cont) + ) + or + s.length() = 1 and + exists(ReturnKind rk | + head = TReturnSummaryComponent(rk) and + result = getReturnType(c, rk) + ) + or + exists(ArgumentPosition pos | head = TParameterSummaryComponent(pos) | + result = + getCallbackParameterType(getNodeType(summaryNodeInputState(pragma[only_bind_out](c), + s.drop(1))), pos) + ) + ) + ) + or + exists(SummarizedCallable c, ParameterPosition pos, ParamNode p | + n = summaryNode(c, TSummaryNodeClearsContentState(pos, false)) and + p.isParameterOf(c, pos) and + result = getNodeType(p) + ) + } + + /** Holds if summary node `out` contains output of kind `rk` from call `c`. */ + predicate summaryOutNode(DataFlowCall c, Node out, ReturnKind rk) { + exists(SummarizedCallable callable, SummaryComponentStack s, Node receiver | + callbackOutput(callable, s, receiver, rk) and + out = summaryNodeInputState(callable, s) and + c = summaryDataFlowCall(receiver) + ) + } + + /** Holds if summary node `arg` is at position `pos` in the call `c`. */ + predicate summaryArgumentNode(DataFlowCall c, Node arg, ArgumentPosition pos) { + exists(SummarizedCallable callable, SummaryComponentStack s, Node receiver | + callbackInput(callable, s, receiver, pos) and + arg = summaryNodeOutputState(callable, s) and + c = summaryDataFlowCall(receiver) + ) + } + + /** Holds if summary node `post` is a post-update node with pre-update node `pre`. */ + predicate summaryPostUpdateNode(Node post, Node pre) { + exists(SummarizedCallable c, ParameterPosition pos | + isParameterPostUpdate(post, c, pos) and + pre.(ParamNode).isParameterOf(c, pos) + or + pre = summaryNode(c, TSummaryNodeClearsContentState(pos, false)) and + post = summaryNode(c, TSummaryNodeClearsContentState(pos, true)) + ) + or + exists(SummarizedCallable callable, SummaryComponentStack s | + callbackInput(callable, s, _, _) and + pre = summaryNodeOutputState(callable, s) and + post = summaryNodeInputState(callable, s) + ) + } + + /** Holds if summary node `ret` is a return node of kind `rk`. */ + predicate summaryReturnNode(Node ret, ReturnKind rk) { + exists(SummarizedCallable callable, SummaryComponentStack s | + ret = summaryNodeOutputState(callable, s) and + s = TSingletonSummaryComponentStack(TReturnSummaryComponent(rk)) + ) + } + + /** + * Holds if flow is allowed to pass from parameter `p`, to a return + * node, and back out to `p`. + */ + predicate summaryAllowParameterReturnInSelf(ParamNode p) { + exists(SummarizedCallable c, ParameterPosition ppos | p.isParameterOf(c, ppos) | + c.clearsContent(ppos, _) + or + exists(SummaryComponentStack inputContents, SummaryComponentStack outputContents | + summary(c, inputContents, outputContents, _) and + inputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) and + outputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) + ) + ) + } + + /** Provides a compilation of flow summaries to atomic data-flow steps. */ + module Steps { + /** + * Holds if there is a local step from `pred` to `succ`, which is synthesized + * from a flow summary. + */ + predicate summaryLocalStep(Node pred, Node succ, boolean preservesValue) { + exists( + SummarizedCallable c, SummaryComponentStack inputContents, + SummaryComponentStack outputContents + | + summary(c, inputContents, outputContents, preservesValue) and + pred = summaryNodeInputState(c, inputContents) and + succ = summaryNodeOutputState(c, outputContents) + | + preservesValue = true + or + preservesValue = false and not summary(c, inputContents, outputContents, true) + ) + or + exists(SummarizedCallable c, ParameterPosition pos | + pred.(ParamNode).isParameterOf(c, pos) and + succ = summaryNode(c, TSummaryNodeClearsContentState(pos, _)) and + preservesValue = true + ) + } + + /** + * Holds if there is a read step of content `c` from `pred` to `succ`, which + * is synthesized from a flow summary. + */ + predicate summaryReadStep(Node pred, Content c, Node succ) { + exists(SummarizedCallable sc, SummaryComponentStack s | + pred = summaryNodeInputState(sc, s.drop(1)) and + succ = summaryNodeInputState(sc, s) and + SummaryComponent::content(c) = s.head() + ) + } + + /** + * Holds if there is a store step of content `c` from `pred` to `succ`, which + * is synthesized from a flow summary. + */ + predicate summaryStoreStep(Node pred, Content c, Node succ) { + exists(SummarizedCallable sc, SummaryComponentStack s | + pred = summaryNodeOutputState(sc, s) and + succ = summaryNodeOutputState(sc, s.drop(1)) and + SummaryComponent::content(c) = s.head() + ) + } + + /** + * Holds if values stored inside content `c` are cleared at `n`. `n` is a + * synthesized summary node, so in order for values to be cleared at calls + * to the relevant method, it is important that flow does not pass over + * the argument, either via use-use flow or def-use flow. + * + * Example: + * + * ``` + * a.b = taint; + * a.clearB(); // assume we have a flow summary for `clearB` that clears `b` on the qualifier + * sink(a.b); + * ``` + * + * In the above, flow should not pass from `a` on the first line (or the second + * line) to `a` on the third line. Instead, there will be synthesized flow from + * `a` on line 2 to the post-update node for `a` on that line (via an intermediate + * node where field `b` is cleared). + */ + predicate summaryClearsContent(Node n, Content c) { + exists(SummarizedCallable sc, ParameterPosition pos | + n = summaryNode(sc, TSummaryNodeClearsContentState(pos, true)) and + sc.clearsContent(pos, c) + ) + } + + pragma[noinline] + private predicate viableParam( + DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos, ParamNode p + ) { + p.isParameterOf(sc, ppos) and + sc = viableCallable(call) + } + + /** + * Holds if values stored inside content `c` are cleared inside a + * callable to which `arg` is an argument. + * + * In such cases, it is important to prevent use-use flow out of + * `arg` (see comment for `summaryClearsContent`). + */ + predicate summaryClearsContentArg(ArgNode arg, Content c) { + exists(DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos | + argumentPositionMatch(call, arg, ppos) and + viableParam(call, sc, ppos, _) and + sc.clearsContent(ppos, c) + ) + } + + pragma[nomagic] + private ParamNode summaryArgParam0(DataFlowCall call, ArgNode arg) { + exists(ParameterPosition ppos, SummarizedCallable sc | + argumentPositionMatch(call, arg, ppos) and + viableParam(call, sc, ppos, result) + ) + } + + pragma[nomagic] + private ParamNode summaryArgParam(ArgNode arg, ReturnKindExt rk, OutNodeExt out) { + exists(DataFlowCall call | + result = summaryArgParam0(call, arg) and + out = rk.getAnOutNode(call) + ) + } + + /** + * Holds if `arg` flows to `out` using a simple flow summary, that is, a flow + * summary without reads and stores. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryThroughStep(ArgNode arg, Node out, boolean preservesValue) { + exists(ReturnKindExt rk, ReturnNodeExt ret | + summaryLocalStep(summaryArgParam(arg, rk, out), ret, preservesValue) and + ret.getKind() = rk + ) + } + + /** + * Holds if there is a read(+taint) of `c` from `arg` to `out` using a + * flow summary. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryGetterStep(ArgNode arg, Content c, Node out) { + exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret | + summaryReadStep(summaryArgParam(arg, rk, out), c, mid) and + summaryLocalStep(mid, ret, _) and + ret.getKind() = rk + ) + } + + /** + * Holds if there is a (taint+)store of `arg` into content `c` of `out` using a + * flow summary. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summarySetterStep(ArgNode arg, Content c, Node out) { + exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret | + summaryLocalStep(summaryArgParam(arg, rk, out), mid, _) and + summaryStoreStep(mid, c, ret) and + ret.getKind() = rk + ) + } + } + + /** + * Provides a means of translating externally (e.g., CSV) defined flow + * summaries into a `SummarizedCallable`s. + */ + module External { + /** Holds if `spec` is a relevant external specification. */ + private predicate relevantSpec(string spec) { + summaryElement(_, spec, _, _) or + summaryElement(_, _, spec, _) or + sourceElement(_, spec, _) or + sinkElement(_, spec, _) + } + + private class AccessPathRange extends AccessPath::Range { + AccessPathRange() { relevantSpec(this) } + } + + /** Holds if specification component `c` parses as parameter `n`. */ + predicate parseParam(AccessPathToken token, ArgumentPosition pos) { + token.getName() = "Parameter" and + pos = parseParamBody(token.getAnArgument()) + } + + /** Holds if specification component `c` parses as argument `n`. */ + predicate parseArg(AccessPathToken token, ParameterPosition pos) { + token.getName() = "Argument" and + pos = parseArgBody(token.getAnArgument()) + } + + private SummaryComponent interpretComponent(AccessPathToken token) { + exists(ParameterPosition pos | + parseArg(token, pos) and result = SummaryComponent::argument(pos) + ) + or + exists(ArgumentPosition pos | + parseParam(token, pos) and result = SummaryComponent::parameter(pos) + ) + or + token = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) + or + result = interpretComponentSpecific(token) + } + + /** + * Holds if `spec` specifies summary component stack `stack`. + */ + predicate interpretSpec(AccessPath spec, SummaryComponentStack stack) { + interpretSpec(spec, spec.getNumToken(), stack) + } + + /** Holds if the first `n` tokens of `spec` resolves to `stack`. */ + private predicate interpretSpec(AccessPath spec, int n, SummaryComponentStack stack) { + n = 1 and + stack = SummaryComponentStack::singleton(interpretComponent(spec.getToken(0))) + or + exists(SummaryComponent head, SummaryComponentStack tail | + interpretSpec(spec, n, head, tail) and + stack = SummaryComponentStack::push(head, tail) + ) + } + + /** Holds if the first `n` tokens of `spec` resolves to `head` followed by `tail` */ + private predicate interpretSpec( + AccessPath spec, int n, SummaryComponent head, SummaryComponentStack tail + ) { + interpretSpec(spec, n - 1, tail) and + head = interpretComponent(spec.getToken(n - 1)) + } + + private class MkStack extends RequiredSummaryComponentStack { + override predicate required(SummaryComponent head, SummaryComponentStack tail) { + interpretSpec(_, _, head, tail) + } + } + + private class SummarizedCallableExternal extends SummarizedCallable { + SummarizedCallableExternal() { summaryElement(this, _, _, _) } + + override predicate propagatesFlow( + SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue + ) { + exists(AccessPath inSpec, AccessPath outSpec, string kind | + summaryElement(this, inSpec, outSpec, kind) and + interpretSpec(inSpec, input) and + interpretSpec(outSpec, output) + | + kind = "value" and preservesValue = true + or + kind = "taint" and preservesValue = false + ) + } + } + + /** Holds if component `c` of specification `spec` cannot be parsed. */ + predicate invalidSpecComponent(AccessPath spec, string c) { + c = spec.getToken(_) and + not exists(interpretComponent(c)) + } + + private predicate inputNeedsReference(AccessPathToken c) { + c.getName() = "Argument" or + inputNeedsReferenceSpecific(c) + } + + private predicate outputNeedsReference(AccessPathToken c) { + c.getName() = ["Argument", "ReturnValue"] or + outputNeedsReferenceSpecific(c) + } + + private predicate sourceElementRef(InterpretNode ref, AccessPath output, string kind) { + exists(SourceOrSinkElement e | + sourceElement(e, output, kind) and + if outputNeedsReference(output.getToken(0)) + then e = ref.getCallTarget() + else e = ref.asElement() + ) + } + + private predicate sinkElementRef(InterpretNode ref, AccessPath input, string kind) { + exists(SourceOrSinkElement e | + sinkElement(e, input, kind) and + if inputNeedsReference(input.getToken(0)) + then e = ref.getCallTarget() + else e = ref.asElement() + ) + } + + /** Holds if the first `n` tokens of `output` resolve to the given interpretation. */ + private predicate interpretOutput( + AccessPath output, int n, InterpretNode ref, InterpretNode node + ) { + sourceElementRef(ref, output, _) and + n = 0 and + ( + if output = "" + then + // Allow language-specific interpretation of the empty access path + interpretOutputSpecific("", ref, node) + else node = ref + ) + or + exists(InterpretNode mid, AccessPathToken c | + interpretOutput(output, n - 1, ref, mid) and + c = output.getToken(n - 1) + | + exists(ArgumentPosition apos, ParameterPosition ppos | + node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and + parameterMatch(ppos, apos) + | + c = "Argument" or parseArg(c, ppos) + ) + or + exists(ArgumentPosition apos, ParameterPosition ppos | + node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and + parameterMatch(ppos, apos) + | + c = "Parameter" or parseParam(c, apos) + ) + or + c = "ReturnValue" and + node.asNode() = getAnOutNodeExt(mid.asCall(), TValueReturn(getReturnValueKind())) + or + interpretOutputSpecific(c, mid, node) + ) + } + + /** Holds if the first `n` tokens of `input` resolve to the given interpretation. */ + private predicate interpretInput(AccessPath input, int n, InterpretNode ref, InterpretNode node) { + sinkElementRef(ref, input, _) and + n = 0 and + ( + if input = "" + then + // Allow language-specific interpretation of the empty access path + interpretInputSpecific("", ref, node) + else node = ref + ) + or + exists(InterpretNode mid, AccessPathToken c | + interpretInput(input, n - 1, ref, mid) and + c = input.getToken(n - 1) + | + exists(ArgumentPosition apos, ParameterPosition ppos | + node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and + parameterMatch(ppos, apos) + | + c = "Argument" or parseArg(c, ppos) + ) + or + exists(ReturnNodeExt ret | + c = "ReturnValue" and + ret = node.asNode() and + ret.getKind().(ValueReturnKind).getKind() = getReturnValueKind() and + mid.asCallable() = getNodeEnclosingCallable(ret) + ) + or + interpretInputSpecific(c, mid, node) + ) + } + + /** + * Holds if `node` is specified as a source with the given kind in a CSV flow + * model. + */ + predicate isSourceNode(InterpretNode node, string kind) { + exists(InterpretNode ref, AccessPath output | + sourceElementRef(ref, output, kind) and + interpretOutput(output, output.getNumToken(), ref, node) + ) + } + + /** + * Holds if `node` is specified as a sink with the given kind in a CSV flow + * model. + */ + predicate isSinkNode(InterpretNode node, string kind) { + exists(InterpretNode ref, AccessPath input | + sinkElementRef(ref, input, kind) and + interpretInput(input, input.getNumToken(), ref, node) + ) + } + } + + /** Provides a query predicate for outputting a set of relevant flow summaries. */ + module TestOutput { + /** A flow summary to include in the `summary/3` query predicate. */ + abstract class RelevantSummarizedCallable extends SummarizedCallable { + /** Gets the string representation of this callable used by `summary/1`. */ + abstract string getCallableCsv(); + + /** Holds if flow is propagated between `input` and `output`. */ + predicate relevantSummary( + SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue + ) { + this.propagatesFlow(input, output, preservesValue) + } + } + + /** Render the kind in the format used in flow summaries. */ + private string renderKind(boolean preservesValue) { + preservesValue = true and result = "value" + or + preservesValue = false and result = "taint" + } + + /** + * A query predicate for outputting flow summaries in semi-colon separated format in QL tests. + * The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind", + * ext is hardcoded to empty. + */ + query predicate summary(string csv) { + exists( + RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output, + boolean preservesValue + | + c.relevantSummary(input, output, preservesValue) and + csv = + c.getCallableCsv() + ";;" + getComponentStackCsv(input) + ";" + + getComponentStackCsv(output) + ";" + renderKind(preservesValue) + ) + } + } + + /** + * Provides query predicates for rendering the generated data flow graph for + * a summarized callable. + * + * Import this module into a `.ql` file of `@kind graph` to render the graph. + * The graph is restricted to callables from `RelevantSummarizedCallable`. + */ + module RenderSummarizedCallable { + /** A summarized callable to include in the graph. */ + abstract class RelevantSummarizedCallable extends SummarizedCallable { } + + private newtype TNodeOrCall = + MkNode(Node n) { + exists(RelevantSummarizedCallable c | + n = summaryNode(c, _) + or + n.(ParamNode).isParameterOf(c, _) + ) + } or + MkCall(DataFlowCall call) { + call = summaryDataFlowCall(_) and + call.getEnclosingCallable() instanceof RelevantSummarizedCallable + } + + private class NodeOrCall extends TNodeOrCall { + Node asNode() { this = MkNode(result) } + + DataFlowCall asCall() { this = MkCall(result) } + + string toString() { + result = this.asNode().toString() + or + result = this.asCall().toString() + } + + /** + * 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`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.asNode().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + this.asCall().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + } + + query predicate nodes(NodeOrCall n, string key, string val) { + key = "semmle.label" and val = n.toString() + } + + private predicate edgesComponent(NodeOrCall a, NodeOrCall b, string value) { + exists(boolean preservesValue | + Private::Steps::summaryLocalStep(a.asNode(), b.asNode(), preservesValue) and + if preservesValue = true then value = "value" else value = "taint" + ) + or + exists(Content c | + Private::Steps::summaryReadStep(a.asNode(), c, b.asNode()) and + value = "read (" + c + ")" + or + Private::Steps::summaryStoreStep(a.asNode(), c, b.asNode()) and + value = "store (" + c + ")" + or + Private::Steps::summaryClearsContent(a.asNode(), c) and + b = a and + value = "clear (" + c + ")" + ) + or + summaryPostUpdateNode(b.asNode(), a.asNode()) and + value = "post-update" + or + b.asCall() = summaryDataFlowCall(a.asNode()) and + value = "receiver" + or + exists(ArgumentPosition pos | + summaryArgumentNode(b.asCall(), a.asNode(), pos) and + value = "argument (" + pos + ")" + ) + } + + query predicate edges(NodeOrCall a, NodeOrCall b, string key, string value) { + key = "semmle.label" and + value = strictconcat(string s | edgesComponent(a, b, s) | s, " / ") + } + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImplSpecific.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImplSpecific.qll new file mode 100644 index 00000000000..4d8e19461df --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImplSpecific.qll @@ -0,0 +1,299 @@ +/** + * Provides Go-specific classes and predicates for defining flow summaries. + */ + +private import go +private import DataFlowPrivate +private import DataFlowUtil +private import FlowSummaryImpl::Private +private import FlowSummaryImpl::Public +private import semmle.go.dataflow.ExternalFlow +private import DataFlowImplCommon + +private module FlowSummaries { + private import semmle.go.dataflow.FlowSummary as F +} + +/** Holds if `i` is a valid parameter position. */ +predicate parameterPosition(int i) { + i = [-1 .. any(DataFlowCallable c).getType().getNumParameter()] +} + +/** Gets the parameter position of the instance parameter. */ +int instanceParameterPosition() { result = -1 } + +/** A parameter position represented by an integer. */ +class ParameterPosition extends int { + ParameterPosition() { parameterPosition(this) } +} + +/** An argument position represented by an integer. */ +class ArgumentPosition extends int { + ArgumentPosition() { parameterPosition(this) } +} + +/** Holds if arguments at position `apos` match parameters at position `ppos`. */ +pragma[inline] +predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos } + +/** + * Holds if `arg` is an argument of `call` with an argument position that matches + * parameter position `ppos`. + */ +pragma[noinline] +predicate argumentPositionMatch(DataFlowCall call, ArgNode arg, ParameterPosition ppos) { + exists(ArgumentPosition apos | + arg.argumentOf(call, apos) and + parameterMatch(ppos, apos) + ) +} + +/** Gets the textual representation of a parameter position in the format used for flow summaries. */ +string getParameterPositionCsv(ParameterPosition pos) { result = pos.toString() } + +/** Gets the textual representation of an argument position in the format used for flow summaries. */ +string getArgumentPositionCsv(ArgumentPosition pos) { result = pos.toString() } + +Node summaryNode(SummarizedCallable c, SummaryNodeState state) { result = getSummaryNode(c, state) } + +/** Gets the synthesized data-flow call for `receiver`. */ +DataFlowCall summaryDataFlowCall(Node receiver) { + // We do not currently have support for callback-based library models. + none() +} + +/** Gets the type of content `c`. */ +DataFlowType getContentType(Content c) { result = c.getType() } + +/** Gets the return type of kind `rk` for callable `c`. */ +DataFlowType getReturnType(SummarizedCallable c, ReturnKind rk) { + result = c.getType().getResultType(rk.getIndex()) +} + +/** + * Gets the type of the `i`th parameter in a synthesized call that targets a + * callback of type `t`. + */ +DataFlowType getCallbackParameterType(DataFlowType t, int i) { none() } + +/** + * Gets the return type of kind `rk` in a synthesized call that targets a + * callback of type `t`. + */ +DataFlowType getCallbackReturnType(DataFlowType t, ReturnKind rk) { none() } + +/** + * Holds if an external flow summary exists for `c` with input specification + * `input`, output specification `output`, and kind `kind`. + */ +predicate summaryElement(DataFlowCallable c, string input, string output, string kind) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext + | + summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind) and + c.asFunction() = interpretElement(namespace, type, subtypes, name, signature, ext).asEntity() + ) +} + +/** Gets the summary component for specification component `c`, if any. */ +bindingset[c] +SummaryComponent interpretComponentSpecific(string c) { + exists(int pos | parseReturn(c, pos) and result = SummaryComponent::return(getReturnKind(pos))) + or + exists(Content content | parseContent(c, content) and result = SummaryComponent::content(content)) +} + +/** Gets the summary component for specification component `c`, if any. */ +private string getContentSpecificCsv(Content c) { + exists(Field f, string package, string className, string fieldName | + f = c.(FieldContent).getField() and + f.hasQualifiedName(package, className, fieldName) and + result = "Field[" + package + "." + className + "." + fieldName + "]" + ) + or + exists(SyntheticField f | + f = c.(SyntheticFieldContent).getField() and result = "SyntheticField[" + f + "]" + ) + or + c instanceof ArrayContent and result = "ArrayElement" + or + c instanceof CollectionContent and result = "Element" + or + c instanceof MapKeyContent and result = "MapKey" + or + c instanceof MapValueContent and result = "MapValue" +} + +/** Gets the textual representation of the content in the format used for flow summaries. */ +string getComponentSpecificCsv(SummaryComponent sc) { + exists(Content c | sc = TContentSummaryComponent(c) and result = getContentSpecificCsv(c)) + or + exists(ReturnKind rk, int n | n = rk.getIndex() | + sc = TReturnSummaryComponent(rk) and + result = "ReturnValue[" + n + "]" and + n != 0 + ) +} + +/** Holds if input specification component `c` needs a reference. */ +predicate inputNeedsReferenceSpecific(string c) { none() } + +/** Holds if output specification component `c` needs a reference. */ +predicate outputNeedsReferenceSpecific(string c) { parseReturn(c, _) } + +private newtype TSourceOrSinkElement = + TEntityElement(Entity e) or + TAstElement(AstNode n) + +/** An element representable by CSV modeling. */ +class SourceOrSinkElement extends TSourceOrSinkElement { + /** Gets this source or sink element as an entity, if it is one. */ + Entity asEntity() { this = TEntityElement(result) } + + /** Gets this source or sink element as an AST node, if it is one. */ + AstNode asAstNode() { this = TAstElement(result) } + + /** Gets a textual representation of this source or sink element. */ + string toString() { + result = "element representing " + [this.asEntity().toString(), this.asAstNode().toString()] + } + + predicate hasLocationInfo(string fp, int sl, int sc, int el, int ec) { + this.asEntity().hasLocationInfo(fp, sl, sc, el, ec) or + this.asAstNode().hasLocationInfo(fp, sl, sc, el, ec) + } +} + +/** + * Holds if an external source specification exists for `e` with output specification + * `output` and kind `kind`. + */ +predicate sourceElement(SourceOrSinkElement e, string output, string kind) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext + | + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind) and + e = interpretElement(namespace, type, subtypes, name, signature, ext) + ) +} + +/** + * Holds if an external sink specification exists for `e` with input specification + * `input` and kind `kind`. + */ +predicate sinkElement(SourceOrSinkElement e, string input, string kind) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext + | + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind) and + e = interpretElement(namespace, type, subtypes, name, signature, ext) + ) +} + +/** Gets the return kind corresponding to specification `"ReturnValue"`. */ +ReturnKind getReturnValueKind() { result = getReturnKind(0) } + +private newtype TInterpretNode = + TElement(SourceOrSinkElement n) or + TNode(Node n) + +/** An entity used to interpret a source/sink specification. */ +class InterpretNode extends TInterpretNode { + /** Gets the element that this node corresponds to, if any. */ + SourceOrSinkElement asElement() { this = TElement(result) } + + /** Gets the data-flow node that this node corresponds to, if any. */ + Node asNode() { this = TNode(result) } + + /** Gets the call that this node corresponds to, if any. */ + DataFlowCall asCall() { result = this.asElement().asAstNode() } + + /** Gets the callable that this node corresponds to, if any. */ + DataFlowCallable asCallable() { + result.asFunction() = this.asElement().asEntity() + or + result.asFuncLit() = this.asElement().asAstNode() + } + + /** Gets the target of this call, if any. */ + SourceOrSinkElement getCallTarget() { + result.asEntity() = this.asCall().getNode().(DataFlow::CallNode).getTarget() + } + + /** Gets a textual representation of this node. */ + string toString() { + result = this.asElement().toString() + or + result = this.asNode().toString() + } + + /** Gets the location of this node. */ + predicate hasLocationInfo(string fp, int sl, int sc, int el, int ec) { + this.asElement().hasLocationInfo(fp, sl, sc, el, ec) + or + this.asNode().hasLocationInfo(fp, sl, sc, el, ec) + } +} + +/** Provides additional sink specification logic required for annotations. */ +pragma[inline] +predicate interpretOutputSpecific(string c, InterpretNode mid, InterpretNode node) { + exists(int pos | node.asNode() = getAnOutNodeExt(mid.asCall(), TValueReturn(getReturnKind(pos))) | + parseReturn(c, pos) + ) + or + exists(Node n, SourceOrSinkElement e | + n = node.asNode() and + e = mid.asElement() + | + (c = "Parameter" or c = "") and + node.asNode().asParameter() = e.asEntity() + or + c = "" and + n.(DataFlow::FieldReadNode).getField() = e.asEntity() + ) +} + +/** Provides additional source specification logic required for annotations. */ +pragma[inline] +predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) { + exists(int pos, ReturnNodeExt ret | + parseReturn(c, pos) and + ret = n.asNode() and + ret.getKind().(ValueReturnKind).getKind() = getReturnKind(pos) and + mid.asCallable() = getNodeEnclosingCallable(ret) + ) + or + exists(DataFlow::Write fw, Field f | + c = "" and + f = mid.asElement().asEntity() and + fw.writesField(_, f, n.asNode()) + ) +} + +/** Holds if specification component `c` parses as return value `n`. */ +predicate parseReturn(AccessPathToken c, int n) { + ( + c = "ReturnValue" and n = 0 + or + c.getName() = "ReturnValue" and + n = parseConstantOrRange(c.getAnArgument()) + ) +} + +bindingset[arg] +private int parseConstantOrRange(string arg) { + result = arg.toInt() + or + exists(int n1, int n2 | + arg.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 1).toInt() = n1 and + arg.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 2).toInt() = n2 and + result = [n1 .. n2] + ) +} + +bindingset[arg] +ArgumentPosition parseParamBody(string arg) { result = parseConstantOrRange(arg) } + +bindingset[arg] +ParameterPosition parseArgBody(string arg) { result = parseConstantOrRange(arg) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll new file mode 100644 index 00000000000..f33048ed08a --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -0,0 +1,423 @@ +/** + * Provides Go-specific definitions for use in the taint-tracking library. + */ + +private import go +private import FlowSummaryImpl as FlowSummaryImpl + +/** + * Holds if taint can flow from `src` to `sink` in zero or more + * local (intra-procedural) steps. + */ +predicate localTaint(DataFlow::Node src, DataFlow::Node sink) { localTaintStep*(src, sink) } + +/** + * Holds if taint can flow from `src` to `sink` in zero or more + * local (intra-procedural) steps. + */ +predicate localExprTaint(Expr src, Expr sink) { + localTaint(DataFlow::exprNode(src), DataFlow::exprNode(sink)) +} + +/** + * Holds if taint can flow in one local step from `src` to `sink`. + */ +predicate localTaintStep(DataFlow::Node src, DataFlow::Node sink) { + DataFlow::localFlowStep(src, sink) or + localAdditionalTaintStep(src, sink) or + // Simple flow through library code is included in the exposed local + // step relation, even though flow is technically inter-procedural + FlowSummaryImpl::Private::Steps::summaryThroughStep(src, sink, false) +} + +private Type getElementType(Type containerType) { + result = containerType.(ArrayType).getElementType() or + result = containerType.(SliceType).getElementType() or + result = containerType.(ChanType).getElementType() or + result = containerType.(MapType).getValueType() or + result = containerType.(PointerType).getPointerType() +} + +/** + * Holds if default `TaintTracking::Configuration`s should allow implicit reads + * of `c` at sinks and inputs to additional taint steps. + */ +bindingset[node] +predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::Content c) { + exists(Type containerType | + node instanceof DataFlow::ArgumentNode and + getElementType*(node.getType()) = containerType + | + containerType instanceof ArrayType and + c instanceof DataFlow::ArrayContent + or + containerType instanceof SliceType and + c instanceof DataFlow::ArrayContent + or + containerType instanceof ChanType and + c instanceof DataFlow::CollectionContent + or + containerType instanceof MapType and + c instanceof DataFlow::MapValueContent + or + c.(DataFlow::PointerContent).getPointerType() = containerType + ) +} + +private newtype TUnit = TMkUnit() + +/** A singleton class containing a single dummy "unit" value. */ +private class Unit extends TUnit { + /** Gets a textual representation of this element. */ + string toString() { result = "unit" } +} + +/** + * A unit class for adding additional taint steps. + * + * Extend this class to add additional taint steps that should apply to all + * taint configurations. + */ +class AdditionalTaintStep extends Unit { + /** + * Holds if the step from `node1` to `node2` should be considered a taint + * step for all configurations. + */ + abstract predicate step(DataFlow::Node node1, DataFlow::Node node2); +} + +/** + * Holds if the additional step from `pred` to `succ` should be included in all + * global taint flow configurations. + */ +predicate localAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + referenceStep(pred, succ) or + elementWriteStep(pred, succ) or + fieldReadStep(pred, succ) or + elementStep(pred, succ) or + tupleStep(pred, succ) or + stringConcatStep(pred, succ) or + sliceStep(pred, succ) or + any(FunctionModel fm).taintStep(pred, succ) or + any(AdditionalTaintStep a).step(pred, succ) or + FlowSummaryImpl::Private::Steps::summaryLocalStep(pred, succ, false) +} + +/** + * Holds if taint flows from `pred` to `succ` via a reference or dereference. + * + * The taint-tracking library does not distinguish between a reference and its referent, + * treating one as tainted if the other is. + */ +predicate referenceStep(DataFlow::Node pred, DataFlow::Node succ) { + exists(DataFlow::AddressOperationNode addr | + // from `x` to `&x` + pred = addr.getOperand() and + succ = addr + or + // from `&x` to `x` + pred = addr and + succ.(DataFlow::PostUpdateNode).getPreUpdateNode() = addr.getOperand() + ) + or + exists(DataFlow::PointerDereferenceNode deref | + // from `x` to `*x` + pred = deref.getOperand() and + succ = deref + or + // from `*x` to `x` + pred = deref and + succ.(DataFlow::PostUpdateNode).getPreUpdateNode() = deref.getOperand() + ) +} + +/** + * Holds if there is an assignment of the form `succ[idx] = pred`, meaning that `pred` may taint + * `succ`. + */ +predicate elementWriteStep(DataFlow::Node pred, DataFlow::Node succ) { + any(DataFlow::Write w).writesElement(succ.(DataFlow::PostUpdateNode).getPreUpdateNode(), _, pred) +} + +/** Holds if taint flows from `pred` to `succ` via a field read. */ +predicate fieldReadStep(DataFlow::Node pred, DataFlow::Node succ) { + succ.(DataFlow::FieldReadNode).getBase() = pred +} + +/** + * Holds if taint flows from `pred` to `succ` via an array, map, slice, or string + * index operation. + */ +predicate elementStep(DataFlow::Node pred, DataFlow::Node succ) { + succ.(DataFlow::ElementReadNode).getBase() = pred + or + exists(IR::GetNextEntryInstruction nextEntry | + pred.asInstruction() = nextEntry.getDomain() and + // only step into the value, not the index + succ.asInstruction() = IR::extractTupleElement(nextEntry, 1) + ) +} + +deprecated predicate arrayStep = elementStep/2; + +/** Holds if taint flows from `pred` to `succ` via an extract tuple operation. */ +predicate tupleStep(DataFlow::Node pred, DataFlow::Node succ) { + succ = DataFlow::extractTupleElement(pred, _) +} + +/** Holds if taint flows from `pred` to `succ` via string concatenation. */ +predicate stringConcatStep(DataFlow::Node pred, DataFlow::Node succ) { + exists(DataFlow::BinaryOperationNode conc | + conc.getOperator() = "+" and conc.getType() instanceof StringType + | + succ = conc and conc.getAnOperand() = pred + ) +} + +/** Holds if taint flows from `pred` to `succ` via a slice operation. */ +predicate sliceStep(DataFlow::Node pred, DataFlow::Node succ) { + succ.(DataFlow::SliceNode).getBase() = pred +} + +/** + * A model of a function specifying that the function propagates taint from + * a parameter or qualifier to a result. + */ +abstract class FunctionModel extends Function { + /** Holds if taint propagates through this function from `input` to `output`. */ + abstract predicate hasTaintFlow(FunctionInput input, FunctionOutput output); + + /** Gets an input node for this model for the call `c`. */ + DataFlow::Node getAnInputNode(DataFlow::CallNode c) { this.taintStepForCall(result, _, c) } + + /** Gets an output node for this model for the call `c`. */ + DataFlow::Node getAnOutputNode(DataFlow::CallNode c) { this.taintStepForCall(_, result, c) } + + /** Holds if this function model causes taint to flow from `pred` to `succ` for the call `c`. */ + predicate taintStepForCall(DataFlow::Node pred, DataFlow::Node succ, DataFlow::CallNode c) { + c = this.getACall() and + exists(FunctionInput inp, FunctionOutput outp | this.hasTaintFlow(inp, outp) | + pred = inp.getNode(c) and + succ = outp.getNode(c) + ) + } + + /** Holds if this function model causes taint to flow from `pred` to `succ`. */ + predicate taintStep(DataFlow::Node pred, DataFlow::Node succ) { + this.taintStepForCall(pred, succ, _) + } +} + +/** + * Holds if the additional step from `src` to `sink` should be included in all + * global taint flow configurations. + */ +predicate defaultAdditionalTaintStep(DataFlow::Node src, DataFlow::Node sink) { + localAdditionalTaintStep(src, sink) +} + +/** + * A sanitizer in all global taint flow configurations but not in local taint. + */ +abstract class DefaultTaintSanitizer extends DataFlow::Node { } + +/** + * Holds if `node` should be a sanitizer in all global taint flow configurations + * but not in local taint. + */ +predicate defaultTaintSanitizer(DataFlow::Node node) { node instanceof DefaultTaintSanitizer } + +/** + * A sanitizer guard in all global taint flow configurations but not in local taint. + */ +abstract class DefaultTaintSanitizerGuard extends DataFlow::BarrierGuard { } + +/** + * Holds if `guard` should be a sanitizer guard in all global taint flow configurations + * but not in local taint. + */ +predicate defaultTaintSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof DefaultTaintSanitizerGuard +} + +/** + * An equality test acting as a sanitizer guard for `nonConstNode` by + * restricting it to a known value. + * + * Note that comparisons to `nil` are excluded. This is needed for performance + * reasons. + */ +class EqualityTestGuard extends DefaultTaintSanitizerGuard, DataFlow::EqualityTestNode { + DataFlow::Node nonConstNode; + + EqualityTestGuard() { + this.getAnOperand().isConst() and + nonConstNode = this.getAnOperand() and + not nonConstNode.isConst() and + not this.getAnOperand() = Builtin::nil().getARead() + } + + override predicate checks(Expr e, boolean outcome) { + e = nonConstNode.asExpr() and + outcome = this.getPolarity() + } +} + +/** + * Holds if data flows from `node` to `switchExprNode`, which is the expression + * of a switch statement. + */ +private predicate flowsToSwitchExpression(DataFlow::Node node, DataFlow::Node switchExprNode) { + switchExprNode.asExpr() = any(ExpressionSwitchStmt ess).getExpr() and + DataFlow::localFlow(node, switchExprNode) +} + +/** + * Holds if `inputNode` is the exit node of a parameter to `fd` and data flows + * from `inputNode` to the expression of a switch statement. + */ +private predicate isPossibleInputNode(DataFlow::Node inputNode, FuncDef fd) { + inputNode = any(FunctionInput inp | inp.isParameter(_)).getExitNode(fd) and + flowsToSwitchExpression(inputNode, _) +} + +/** + * Gets a predecessor of `succ` without following edges corresponding to + * passing a constant case test in a switch statement which is switching on + * an expression which data flows to from `inputNode`. + */ +private ControlFlow::Node getANonTestPassingPredecessor( + ControlFlow::Node succ, DataFlow::Node inputNode +) { + isPossibleInputNode(inputNode, succ.getRoot()) and + result = succ.getAPredecessor() and + not exists(Expr testExpr, DataFlow::Node switchExprNode | + flowsToSwitchExpression(inputNode, switchExprNode) and + ControlFlow::isSwitchCaseTestPassingEdge(result, succ, switchExprNode.asExpr(), testExpr) and + testExpr.isConst() + ) +} + +private ControlFlow::Node getANonTestPassingReachingNodeRecursive( + ControlFlow::Node n, DataFlow::Node inputNode +) { + isPossibleInputNode(inputNode, n.getRoot()) and + ( + result = n or + result = + getANonTestPassingReachingNodeRecursive(getANonTestPassingPredecessor(n, inputNode), inputNode) + ) +} + +/** + * Gets a node by following predecessors from `ret` without following edges + * corresponding to passing a constant case test in a switch statement which is + * switching on an expression which data flows to from `inputNode`. + */ +private ControlFlow::Node getANonTestPassingReachingNodeBase( + IR::ReturnInstruction ret, DataFlow::Node inputNode +) { + result = getANonTestPassingReachingNodeRecursive(ret, inputNode) +} + +/** + * Holds if every way to get from the entry node of the function to `ret` + * involves passing a constant test case in a switch statement which is + * switching on an expression which data flows to from `inputNode`. + */ +private predicate mustPassConstantCaseTestToReach( + IR::ReturnInstruction ret, DataFlow::Node inputNode +) { + isPossibleInputNode(inputNode, ret.getRoot()) and + not exists(ControlFlow::Node entry | entry = ret.getRoot().getEntryNode() | + entry = getANonTestPassingReachingNodeBase(ret, inputNode) + ) +} + +/** + * Holds if whenever `outp` of function `f` satisfies `p`, the input `inp` of + * `f` matched a constant in a case clause of a switch statement. + * + * We check this by looking for guards on `inp` that collectively dominate all + * the `return` statements in `f` that can return `true`. This means that if + * `f` returns `true`, one of the guards must have been satisfied. (Similar + * reasoning is applied for statements returning `false`, `nil` or a non-`nil` + * value.) + */ +predicate functionEnsuresInputIsConstant( + Function f, FunctionInput inp, FunctionOutput outp, DataFlow::Property p +) { + exists(FuncDecl fd | fd.getFunction() = f | + exists(boolean b | + p.isBoolean(b) and + forex(DataFlow::Node ret, IR::ReturnInstruction ri | + ret = outp.getEntryNode(fd) and + ri.getReturnStmt().getAnExpr() = ret.asExpr() and + DataFlow::possiblyReturnsBool(fd, outp, ret, b) + | + mustPassConstantCaseTestToReach(ri, inp.getExitNode(fd)) + ) + ) + or + p.isNonNil() and + forex(DataFlow::Node ret, IR::ReturnInstruction ri | + ret = outp.getEntryNode(fd) and + ri.getReturnStmt().getAnExpr() = ret.asExpr() and + DataFlow::possiblyReturnsNonNil(fd, outp, ret) + | + mustPassConstantCaseTestToReach(ri, inp.getExitNode(fd)) + ) + or + p.isNil() and + forex(DataFlow::Node ret, IR::ReturnInstruction ri | + ret = outp.getEntryNode(fd) and + ri.getReturnStmt().getAnExpr() = ret.asExpr() and + ret.asExpr() = Builtin::nil().getAReference() + | + exists(DataFlow::Node exprNode | + DataFlow::localFlow(inp.getExitNode(fd), exprNode) and + mustPassConstantCaseTestToReach(ri, inp.getExitNode(fd)) + ) + ) + ) +} + +/** + * Holds if whenever `outputNode` satisfies `p`, `inputNode` matched a constant + * in a case clause of a switch statement. + */ +pragma[noinline] +predicate inputIsConstantIfOutputHasProperty( + DataFlow::Node inputNode, DataFlow::Node outputNode, DataFlow::Property p +) { + exists(Function f, FunctionInput inp, FunctionOutput outp, DataFlow::CallNode call | + functionEnsuresInputIsConstant(f, inp, outp, p) and + call = f.getACall() and + inputNode = inp.getNode(call) and + DataFlow::localFlow(outp.getNode(call), outputNode) + ) +} + +/** + * A comparison against a list of constants, acting as a sanitizer guard for + * `guardedExpr` by restricting it to a known value. + * + * Currently this only looks for functions containing a switch statement, but + * it could equally look for a check for membership of a constant map or + * constant array, which does not need to be in its own function. + */ +class ListOfConstantsComparisonSanitizerGuard extends TaintTracking::DefaultTaintSanitizerGuard { + DataFlow::Node guardedExpr; + boolean outcome; + + ListOfConstantsComparisonSanitizerGuard() { + exists(DataFlow::Node outputNode, DataFlow::Property p | + inputIsConstantIfOutputHasProperty(guardedExpr, outputNode, p) and + p.checkOn(this, outcome, outputNode) + ) + } + + override predicate checks(Expr e, boolean branch) { + e = guardedExpr.asExpr() and branch = outcome + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll new file mode 100644 index 00000000000..7f7d5bbb883 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll @@ -0,0 +1,122 @@ +/** + * Provides an implementation of global (interprocedural) taint tracking. + * This file re-exports the local (intraprocedural) taint-tracking analysis + * from `TaintTrackingParameter::Public` and adds a global analysis, mainly + * exposed through the `Configuration` class. For some languages, this file + * exists in several identical copies, allowing queries to use multiple + * `Configuration` classes that depend on each other without introducing + * mutual recursion among those configurations. + */ + +import TaintTrackingParameter::Public +private import TaintTrackingParameter::Private + +/** + * A configuration of interprocedural taint tracking analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the taint tracking library must define its own unique extension of + * this abstract class. + * + * A taint-tracking configuration is a special data flow configuration + * (`DataFlow::Configuration`) that allows for flow through nodes that do not + * necessarily preserve values but are still relevant from a taint tracking + * perspective. (For example, string concatenation, where one of the operands + * is tainted.) + * + * To create a configuration, extend this class with a subclass whose + * characteristic predicate is a unique singleton string. For example, write + * + * ```ql + * class MyAnalysisConfiguration extends TaintTracking::Configuration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isSanitizer`. + * // Optionally override `isSanitizerIn`. + * // Optionally override `isSanitizerOut`. + * // Optionally override `isSanitizerGuard`. + * // Optionally override `isAdditionalTaintStep`. + * } + * ``` + * + * Then, to query whether there is flow between some `source` and `sink`, + * write + * + * ```ql + * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) + * ``` + * + * Multiple configurations can coexist, but it is unsupported to depend on + * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the + * overridden predicates that define sources, sinks, or additional steps. + * Instead, the dependency should go to a `TaintTracking2::Configuration` or a + * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. + */ +abstract class Configuration extends DataFlow::Configuration { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant taint source. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + abstract override predicate isSource(DataFlow::Node source); + + /** + * Holds if `sink` is a relevant taint sink. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + abstract override predicate isSink(DataFlow::Node sink); + + /** Holds if the node `node` is a taint sanitizer. */ + predicate isSanitizer(DataFlow::Node node) { none() } + + final override predicate isBarrier(DataFlow::Node node) { + this.isSanitizer(node) or + defaultTaintSanitizer(node) + } + + /** Holds if taint propagation into `node` is prohibited. */ + predicate isSanitizerIn(DataFlow::Node node) { none() } + + final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } + + /** Holds if taint propagation out of `node` is prohibited. */ + predicate isSanitizerOut(DataFlow::Node node) { none() } + + final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } + + /** Holds if taint propagation through nodes guarded by `guard` is prohibited. */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard) { + this.isSanitizerGuard(guard) or defaultTaintSanitizerGuard(guard) + } + + /** + * Holds if the additional taint propagation step from `node1` to `node2` + * must be taken into account in the analysis. + */ + predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } + + final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + this.isAdditionalTaintStep(node1, node2) or + defaultAdditionalTaintStep(node1, node2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and + defaultImplicitTaintRead(node, c) + } + + /** + * Holds if taint may flow from `source` to `sink` for this configuration. + */ + // overridden to provide taint-tracking specific qldoc + override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { + super.hasFlow(source, sink) + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll new file mode 100644 index 00000000000..b38482194ec --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll @@ -0,0 +1,5 @@ +import semmle.go.dataflow.internal.TaintTrackingUtil as Public + +module Private { + import semmle.go.dataflow.DataFlow::DataFlow as DataFlow +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll new file mode 100644 index 00000000000..7f7d5bbb883 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll @@ -0,0 +1,122 @@ +/** + * Provides an implementation of global (interprocedural) taint tracking. + * This file re-exports the local (intraprocedural) taint-tracking analysis + * from `TaintTrackingParameter::Public` and adds a global analysis, mainly + * exposed through the `Configuration` class. For some languages, this file + * exists in several identical copies, allowing queries to use multiple + * `Configuration` classes that depend on each other without introducing + * mutual recursion among those configurations. + */ + +import TaintTrackingParameter::Public +private import TaintTrackingParameter::Private + +/** + * A configuration of interprocedural taint tracking analysis. This defines + * sources, sinks, and any other configurable aspect of the analysis. Each + * use of the taint tracking library must define its own unique extension of + * this abstract class. + * + * A taint-tracking configuration is a special data flow configuration + * (`DataFlow::Configuration`) that allows for flow through nodes that do not + * necessarily preserve values but are still relevant from a taint tracking + * perspective. (For example, string concatenation, where one of the operands + * is tainted.) + * + * To create a configuration, extend this class with a subclass whose + * characteristic predicate is a unique singleton string. For example, write + * + * ```ql + * class MyAnalysisConfiguration extends TaintTracking::Configuration { + * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } + * // Override `isSource` and `isSink`. + * // Optionally override `isSanitizer`. + * // Optionally override `isSanitizerIn`. + * // Optionally override `isSanitizerOut`. + * // Optionally override `isSanitizerGuard`. + * // Optionally override `isAdditionalTaintStep`. + * } + * ``` + * + * Then, to query whether there is flow between some `source` and `sink`, + * write + * + * ```ql + * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) + * ``` + * + * Multiple configurations can coexist, but it is unsupported to depend on + * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the + * overridden predicates that define sources, sinks, or additional steps. + * Instead, the dependency should go to a `TaintTracking2::Configuration` or a + * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. + */ +abstract class Configuration extends DataFlow::Configuration { + bindingset[this] + Configuration() { any() } + + /** + * Holds if `source` is a relevant taint source. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + abstract override predicate isSource(DataFlow::Node source); + + /** + * Holds if `sink` is a relevant taint sink. + * + * The smaller this predicate is, the faster `hasFlow()` will converge. + */ + // overridden to provide taint-tracking specific qldoc + abstract override predicate isSink(DataFlow::Node sink); + + /** Holds if the node `node` is a taint sanitizer. */ + predicate isSanitizer(DataFlow::Node node) { none() } + + final override predicate isBarrier(DataFlow::Node node) { + this.isSanitizer(node) or + defaultTaintSanitizer(node) + } + + /** Holds if taint propagation into `node` is prohibited. */ + predicate isSanitizerIn(DataFlow::Node node) { none() } + + final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } + + /** Holds if taint propagation out of `node` is prohibited. */ + predicate isSanitizerOut(DataFlow::Node node) { none() } + + final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } + + /** Holds if taint propagation through nodes guarded by `guard` is prohibited. */ + predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { none() } + + final override predicate isBarrierGuard(DataFlow::BarrierGuard guard) { + this.isSanitizerGuard(guard) or defaultTaintSanitizerGuard(guard) + } + + /** + * Holds if the additional taint propagation step from `node1` to `node2` + * must be taken into account in the analysis. + */ + predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } + + final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + this.isAdditionalTaintStep(node1, node2) or + defaultAdditionalTaintStep(node1, node2) + } + + override predicate allowImplicitRead(DataFlow::Node node, DataFlow::Content c) { + (this.isSink(node) or this.isAdditionalTaintStep(node, _)) and + defaultImplicitTaintRead(node, c) + } + + /** + * Holds if taint may flow from `source` to `sink` for this configuration. + */ + // overridden to provide taint-tracking specific qldoc + override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { + super.hasFlow(source, sink) + } +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll new file mode 100644 index 00000000000..1130c2e42e1 --- /dev/null +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll @@ -0,0 +1,5 @@ +import semmle.go.dataflow.internal.TaintTrackingUtil as Public + +module Private { + import semmle.go.dataflow.DataFlow2::DataFlow2 as DataFlow +} diff --git a/go/ql/lib/semmle/go/dependencies/Dependencies.qll b/go/ql/lib/semmle/go/dependencies/Dependencies.qll new file mode 100644 index 00000000000..5fc746e6987 --- /dev/null +++ b/go/ql/lib/semmle/go/dependencies/Dependencies.qll @@ -0,0 +1,95 @@ +/** + * Provides classes for modeling go.mod dependencies. + */ + +import go + +/** + * An abstract representation of a dependency. + */ +abstract class Dependency extends Locatable { + /** + * Holds if this dependency has package path `path` and version `v`. + * + * If the version cannot be determined, `v` is bound to the string + * `"unknown"`. + */ + abstract predicate info(string path, string v); + + /** Gets the package path of this dependency. */ + string getDepPath() { this.info(result, _) } + + /** Gets the version of this dependency. */ + string getDepVersion() { this.info(_, result) } + + /** + * Holds if this dependency is relevant for imports in file `file`. That is, an import of this + * dependency's path that is in `file` will use this dependency. + */ + abstract predicate relevantForFile(File file); + + /** + * An import of this dependency. + */ + ImportSpec getAnImport() { + result.getPath().regexpMatch("\\Q" + this.getDepPath() + "\\E(/.*)?") and + this.relevantForFile(result.getFile()) + } +} + +/** + * A dependency from a go.mod file. + */ +class GoModDependency extends Dependency, GoModRequireLine { + override predicate info(string path, string v) { + this.replacementInfo(path, v) + or + not this.replacementInfo(_, _) and + this.originalInfo(path, v) + } + + override predicate relevantForFile(File file) { + exists(Folder parent | parent.getAFile() = this.getFile() | + parent.getAFolder*().getAFile() = file + ) + } + + /** + * Holds if there is a replace line that replaces this dependency with a dependency on `path`, + * version `v`. + */ + predicate replacementInfo(string path, string v) { + exists(GoModReplaceLine replace | + replace.getFile() = this.getFile() and + replace.getOriginalPath() = this.getPath() + | + path = replace.getReplacementPath() and + ( + v = replace.getReplacementVersion() + or + not exists(replace.getReplacementVersion()) and + v = "unknown" + ) + ) + } + + /** + * Get a version that was excluded for this dependency. + */ + string getAnExcludedVersion() { + exists(GoModExcludeLine exclude | + exclude.getFile() = this.getFile() and + exclude.getPath() = this.getPath() + | + result = exclude.getVersion() + ) + } + + /** + * Holds if this require line originally states dependency `path` had version `ver`. + * + * The actual info of this dependency can change based on `replace` directives in the same go.mod + * file, which replace a dependency with another one. + */ + predicate originalInfo(string path, string v) { path = this.getPath() and v = this.getVersion() } +} diff --git a/go/ql/lib/semmle/go/dependencies/SemVer.qll b/go/ql/lib/semmle/go/dependencies/SemVer.qll new file mode 100644 index 00000000000..88d37563931 --- /dev/null +++ b/go/ql/lib/semmle/go/dependencies/SemVer.qll @@ -0,0 +1,100 @@ +/** + * Provides classes for dealing with semantic versions, for dependency versions. + */ + +import semmle.go.dependencies.Dependencies + +/** + * A SemVer-formatted version string in a dependency. + * + * Pre-release information and build metadata is not yet supported. + */ +class DependencySemVer extends string { + Dependency dep; + string normalized; + + DependencySemVer() { + this = dep.getDepVersion() and + normalized = normalizeSemver(this) + } + + /** + * Holds if this version may be before `last`. + */ + bindingset[last] + predicate maybeBefore(string last) { normalized < normalizeSemver(last) } + + /** + * Holds if this version may be after `first`. + */ + bindingset[first] + predicate maybeAfter(string first) { normalizeSemver(first) < normalized } + + /** + * Holds if this version may be between `first` (inclusive) and `last` (exclusive). + */ + bindingset[first, last] + predicate maybeBetween(string first, string last) { + normalizeSemver(first) <= normalized and + normalized < normalizeSemver(last) + } + + /** + * Holds if this version is equivalent to `other`. + */ + bindingset[other] + predicate is(string other) { normalized = normalizeSemver(other) } + + /** + * Gets the dependency that uses this string. + */ + Dependency getDependency() { result = dep } +} + +bindingset[str] +private string leftPad(string str) { result = ("000" + str).suffix(str.length()) } + +/** + * Normalizes a SemVer string such that the lexicographical ordering + * of two normalized strings is consistent with the SemVer ordering. + * + * Pre-release information and build metadata is not yet supported. + */ +bindingset[orig] +private string normalizeSemver(string orig) { + exists(string pattern, string major, string minor, string patch | + pattern = "v?(\\d+)\\.(\\d+)\\.(\\d+)(\\D.*)?" and + major = orig.regexpCapture(pattern, 1) and + minor = orig.regexpCapture(pattern, 2) and + patch = orig.regexpCapture(pattern, 3) + | + result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) + ) +} + +/** + * A version string in a dependency that has a SemVer, but also contains a git commit SHA. + * + * This class is useful for interacting with go.mod versions, which use SemVer, but can also contain + * SHAs if no useful tags are found, or when a user wishes to specify a commit SHA. + * + * Pre-release information and build metadata is not yet supported. + */ +class DependencySemShaVersion extends DependencySemVer { + string sha; + + DependencySemShaVersion() { sha = this.regexpCapture(".*-([0-9a-f]+)", 1) } + + /** + * Gets the commit SHA associated with this version. + */ + string getSha() { result = sha } + + bindingset[other] + override predicate is(string other) { + this.getSha() = other.(DependencySemShaVersion).getSha() + or + not other instanceof DependencySemShaVersion and + super.is(other) + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Beego.qll b/go/ql/lib/semmle/go/frameworks/Beego.qll new file mode 100644 index 00000000000..edcf383c6be --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Beego.qll @@ -0,0 +1,378 @@ +/** + * Provides classes for working with untrusted flow sources, sinks and taint propagators + * from the `github.com/beego/beego` package. + */ + +import go +import semmle.go.security.Xss +private import semmle.go.security.SafeUrlFlowCustomizations + +/** + * Provides classes for working with untrusted flow sources, sinks and taint propagators + * from the [Beego](https://github.com/beego/beego) package. + */ +module Beego { + /** Gets the v1 module path `github.com/astaxie/beego` or `github.com/beego/beego`. */ + string v1modulePath() { result = ["github.com/astaxie/beego", "github.com/beego/beego"] } + + /** Gets the v2 module path `github.com/beego/beego/v2` */ + string v2modulePath() { result = "github.com/beego/beego/v2" } + + /** Gets the path for the root package of beego. */ + string packagePath() { + result = package(v1modulePath(), "") + or + result = package(v2modulePath(), "server/web") + } + + /** Gets the path for the context package of beego. */ + string contextPackagePath() { + result = package(v1modulePath(), "context") + or + result = package(v2modulePath(), "server/web/context") + } + + /** Gets the path for the logs package of beego. */ + string logsPackagePath() { + result = package(v1modulePath(), "logs") + or + result = package(v2modulePath(), "core/logs") + } + + /** Gets the path for the utils package of beego. */ + string utilsPackagePath() { + result = package(v1modulePath(), "utils") + or + result = package(v2modulePath(), "core/utils") + } + + /** + * `BeegoInput` sources of untrusted data. + */ + private class BeegoInputSource extends UntrustedFlowSource::Range { + string methodName; + FunctionOutput output; + + BeegoInputSource() { + exists(DataFlow::MethodCallNode c | this = output.getExitNode(c) | + c.getTarget().hasQualifiedName(contextPackagePath(), "BeegoInput", methodName) + ) and + ( + methodName = "Bind" and + output.isParameter(0) + or + methodName in [ + "Cookie", "Data", "GetData", "Header", "Param", "Params", "Query", "Refer", "Referer", + "URI", "URL", "UserAgent" + ] and + output.isResult(0) + ) + } + + predicate isSafeUrlSource() { methodName in ["URI", "URL"] } + } + + /** `BeegoInput` sources that are safe to use for redirection. */ + private class BeegoInputSafeUrlSource extends SafeUrlFlow::Source { + BeegoInputSafeUrlSource() { this.(BeegoInputSource).isSafeUrlSource() } + } + + /** + * `beego.Controller` sources of untrusted data. + */ + private class BeegoControllerSource extends UntrustedFlowSource::Range { + string methodName; + FunctionOutput output; + + BeegoControllerSource() { + exists(DataFlow::MethodCallNode c | + c.getTarget().hasQualifiedName(packagePath(), "Controller", methodName) + | + this = output.getExitNode(c) + ) and + ( + methodName = "ParseForm" and + output.isParameter(0) + or + methodName in ["GetFile", "GetFiles", "GetString", "GetStrings", "Input"] and + output.isResult(0) + or + methodName = "GetFile" and + output.isResult(1) + ) + } + } + + /** + * `beego/context.Context` sources of untrusted data. + */ + private class BeegoContextSource extends UntrustedFlowSource::Range { + BeegoContextSource() { + exists(Method m | m.hasQualifiedName(contextPackagePath(), "Context", "GetCookie") | + this = m.getACall().getResult() + ) + } + } + + private class BeegoOutputInstance extends HTTP::ResponseWriter::Range { + SsaWithFields v; + + BeegoOutputInstance() { + this = v.getBaseVariable().getSourceVariable() and + v.getType().(PointerType).getBaseType().hasQualifiedName(contextPackagePath(), "BeegoOutput") + } + + override DataFlow::Node getANode() { result = v.similar().getAUse().getASuccessor*() } + + /** Gets a header object that corresponds to this HTTP response. */ + DataFlow::MethodCallNode getAHeaderObject() { + result.getTarget().getName() = ["ContentType", "Header"] and + this.getANode() = result.getReceiver() + } + } + + private class BeegoHeaderWrite extends HTTP::HeaderWrite::Range, DataFlow::MethodCallNode { + string methodName; + + BeegoHeaderWrite() { + this.getTarget().hasQualifiedName(contextPackagePath(), "BeegoOutput", methodName) and + methodName in ["ContentType", "Header"] + } + + override DataFlow::Node getName() { methodName = "Header" and result = this.getArgument(0) } + + override string getHeaderName() { + result = HTTP::HeaderWrite::Range.super.getHeaderName() + or + methodName = "ContentType" and result = "content-type" + } + + override DataFlow::Node getValue() { + if methodName = "ContentType" + then result = this.getArgument(0) + else result = this.getArgument(1) + } + + override HTTP::ResponseWriter getResponseWriter() { + result.(BeegoOutputInstance).getAHeaderObject() = this + } + } + + private class BeegoResponseBody extends HTTP::ResponseBody::Range { + DataFlow::MethodCallNode call; + string methodName; + + BeegoResponseBody() { + exists(Method m | m.hasQualifiedName(contextPackagePath(), "BeegoOutput", methodName) | + call = m.getACall() and + this = call.getArgument(0) + ) and + methodName in ["Body", "JSON", "JSONP", "ServeFormatted", "XML", "YAML"] + } + + override HTTP::ResponseWriter getResponseWriter() { result.getANode() = call.getReceiver() } + + override string getAContentType() { + // Super-method provides content-types for `Body`, which requires us to search + // for `ContentType` and `Header` calls against the same `BeegoOutput` instance + result = super.getAContentType() + or + // Specifically describe methods that set the content-type and body in one operation: + result = "application/json" and methodName = "JSON" + or + result = "application/javascript" and methodName = "JSONP" + or + // Actually ServeFormatted can serve JSON, XML or YAML depending on the incoming + // `Accept` header, but the important bit is this method cannot serve text/html. + result = "application/json" and methodName = "ServeFormatted" + or + result = "text/xml" and methodName = "XML" + or + result = "application/x-yaml" and methodName = "YAML" + } + } + + private class ControllerResponseBody extends HTTP::ResponseBody::Range { + string name; + + ControllerResponseBody() { + exists(Method m | m.hasQualifiedName(packagePath(), "Controller", name) | + name = "CustomAbort" and this = m.getACall().getArgument(1) + or + name = "SetData" and this = m.getACall().getArgument(0) + ) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + override string getAContentType() { + // Actually SetData can serve JSON, XML or YAML depending on the incoming + // `Accept` header, but the important bit is this method cannot serve text/html. + result = "application/json" and name = "SetData" + // CustomAbort doesn't specify a content type, so we assume anything could happen. + } + } + + private class ContextResponseBody extends HTTP::ResponseBody::Range { + string name; + + ContextResponseBody() { + exists(Method m | m.hasQualifiedName(contextPackagePath(), "Context", name) | + name = "Abort" and this = m.getACall().getArgument(1) + or + name = "WriteString" and this = m.getACall().getArgument(0) + ) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + // Neither method is likely to be used with well-typed data such as JSON output, + // because there are better methods to do this. Assume the Content-Type could + // be anything. + override string getAContentType() { none() } + } + + private string getALogFunctionName() { + result = + [ + "Alert", "Critical", "Debug", "Emergency", "Error", "Info", "Informational", "Notice", + "Trace", "Warn", "Warning" + ] + } + + private class ToplevelBeegoLoggers extends LoggerCall::Range, DataFlow::CallNode { + ToplevelBeegoLoggers() { + this.getTarget().hasQualifiedName([packagePath(), logsPackagePath()], getALogFunctionName()) + } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + + private class BeegoLoggerMethods extends LoggerCall::Range, DataFlow::MethodCallNode { + BeegoLoggerMethods() { + this.getTarget().hasQualifiedName(logsPackagePath(), "BeeLogger", getALogFunctionName()) + } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + + private class UtilLoggers extends LoggerCall::Range, DataFlow::CallNode { + UtilLoggers() { this.getTarget().hasQualifiedName(utilsPackagePath(), "Display") } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + + private class TopLevelTaintPropagators extends TaintTracking::FunctionModel { + string name; + + TopLevelTaintPropagators() { + this.hasQualifiedName(packagePath(), name) and + name in ["HTML2str", "Htmlquote", "Htmlunquote", "MapGet", "ParseForm", "Str2html", "Substr"] + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + name in ["HTML2str", "Htmlquote", "Htmlunquote", "MapGet", "Str2html", "Substr"] and + input.isParameter(0) and + output.isResult(0) + or + name = "ParseForm" and + input.isParameter(0) and + output.isParameter(1) + } + } + + private class ContextTaintPropagators extends TaintTracking::FunctionModel { + ContextTaintPropagators() { this.hasQualifiedName(contextPackagePath(), "WriteBody") } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input.isParameter(2) and output.isParameter(1) + } + } + + private class HtmlQuoteSanitizer extends SharedXss::Sanitizer { + HtmlQuoteSanitizer() { + exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName(packagePath(), "Htmlquote") | + this = c.getArgument(0) + ) + } + } + + private class FsOperations extends FileSystemAccess::Range, DataFlow::CallNode { + FsOperations() { + this.getTarget().hasQualifiedName(packagePath(), "Walk") + or + exists(Method m | this = m.getACall() | + m.hasQualifiedName(packagePath(), "FileSystem", "Open") or + m.hasQualifiedName(packagePath(), "Controller", "SaveToFile") + ) + } + + override DataFlow::Node getAPathArgument() { + this.getTarget().getName() = ["Walk", "SaveToFile"] and result = this.getArgument(1) + or + this.getTarget().getName() = "Open" and result = this.getArgument(0) + } + } + + private class RedirectMethods extends HTTP::Redirect::Range, DataFlow::CallNode { + string package; + string className; + + RedirectMethods() { + ( + package = packagePath() and className = "Controller" + or + package = contextPackagePath() and className = "Context" + ) and + this = any(Method m | m.hasQualifiedName(package, className, "Redirect")).getACall() + } + + override DataFlow::Node getUrl() { + className = "Controller" and result = this.getArgument(0) + or + className = "Context" and result = this.getArgument(1) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + private class UtilsTaintPropagators extends TaintTracking::FunctionModel { + string name; + + UtilsTaintPropagators() { + this.hasQualifiedName(utilsPackagePath(), name) and + name in [ + "GetDisplayString", "SliceChunk", "SliceDiff", "SliceFilter", "SliceIntersect", + "SliceMerge", "SlicePad", "SliceRand", "SliceReduce", "SliceShuffle", "SliceUnique" + ] + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + name in [ + "GetDisplayString", "SliceIntersect", "SliceMerge", "SlicePad", "SliceRand", + "SliceShuffle", "SliceUnique" + ] and + input.isParameter(_) and + output.isResult(0) + or + name in ["SliceChunk", "SliceDiff", "SliceFilter", "SliceReduce"] and + input.isParameter(0) and + output.isResult(0) + } + } + + private class BeeMapModels extends TaintTracking::FunctionModel, Method { + string name; + + BeeMapModels() { + this.hasQualifiedName(utilsPackagePath(), "BeeMap", name) and + name in ["Get", "Set", "Items"] + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + name = "Set" and input.isParameter(1) and output.isReceiver() + or + name in ["Get", "Items"] and input.isReceiver() and output.isResult(0) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/BeegoOrm.qll b/go/ql/lib/semmle/go/frameworks/BeegoOrm.qll new file mode 100644 index 00000000000..f83556c307f --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/BeegoOrm.qll @@ -0,0 +1,101 @@ +/** + * Provides classes for working with untrusted flow sources, sinks and taint propagators + * from the `github.com/astaxie/beego/orm` subpackage. + */ + +import go +private import semmle.go.security.StoredXssCustomizations + +/** + * Provides classes for working with untrusted flow sources, sinks and taint propagators + * from the [Beego ORM](https://github.com/astaxie/beego/orm) subpackage. + */ +module BeegoOrm { + /** Gets the package name `github.com/astaxie/beego/orm`. */ + string packagePath() { result = package("github.com/astaxie/beego", "orm") } + + private class DbSink extends SQL::QueryString::Range { + DbSink() { + exists(Method m, string methodName, int argNum | + m.hasQualifiedName(packagePath(), "DB", methodName) and + methodName in [ + "Exec", "ExecContext", "Prepare", "PrepareContext", "Query", "QueryContext", "QueryRow", + "QueryRowContext" + ] and + if methodName.matches("%Context") then argNum = 1 else argNum = 0 + | + this = m.getACall().getArgument(argNum) + ) + } + } + + private class QueryBuilderSink extends SQL::QueryString::Range { + // Note this class doesn't do any escaping, unlike the true ORM part of the package + QueryBuilderSink() { + exists(Method impl | impl.implements(packagePath(), "QueryBuilder", _) | + this = impl.getACall().getAnArgument() + ) and + this.getType().getUnderlyingType() instanceof StringType + } + } + + private class OrmerRawSink extends SQL::QueryString::Range { + OrmerRawSink() { + exists(Method impl | impl.implements(packagePath(), "Ormer", "Raw") | + this = impl.getACall().getArgument(0) + ) + } + } + + private class QuerySeterFilterRawSink extends SQL::QueryString::Range { + QuerySeterFilterRawSink() { + exists(Method impl | impl.implements(packagePath(), "QuerySeter", "FilterRaw") | + this = impl.getACall().getArgument(1) + ) + } + } + + private class ConditionRawSink extends SQL::QueryString::Range { + ConditionRawSink() { + exists(Method impl | impl.implements(packagePath(), "Condition", "Raw") | + this = impl.getACall().getArgument(1) + ) + } + } + + private class OrmerSource extends StoredXss::Source { + OrmerSource() { + exists(Method impl | + impl.implements(packagePath(), "Ormer", ["Read", "ReadForUpdate", "ReadOrCreate"]) + | + this = FunctionOutput::parameter(0).getExitNode(impl.getACall()) + ) + } + } + + private class StringFieldSource extends StoredXss::Source { + StringFieldSource() { + exists(Method m | + m.hasQualifiedName(packagePath(), ["JSONField", "JsonbField", "TextField"], + ["RawValue", "String", "Value"]) + | + this = m.getACall().getResult() + ) + } + } + + private class SeterSource extends StoredXss::Source { + SeterSource() { + exists(Method impl | + // All and One are exclusive to QuerySeter, QueryRow[s] are exclusive to RawSeter, the rest are common. + impl.implements(packagePath(), ["QuerySeter", "RawSeter"], + [ + "All", "One", "Values", "ValuesList", "ValuesFlat", "RowsToMap", "RowsToStruct", + "QueryRow", "QueryRows" + ]) + | + this = FunctionOutput::parameter(0).getExitNode(impl.getACall()) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Chi.qll b/go/ql/lib/semmle/go/frameworks/Chi.qll new file mode 100644 index 00000000000..89f1a41d350 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Chi.qll @@ -0,0 +1,29 @@ +/** + * Provides classes for working with untrusted flow sources from the `github.com/go-chi/chi` package. + */ + +import go + +private module Chi { + /** Gets the package name `github.com/go-chi/chi`. */ + string packagePath() { result = package("github.com/go-chi/chi", "") } + + /** + * Functions that extract URL parameters, considered as a source of untrusted flow. + */ + private class UserControlledFunction extends UntrustedFlowSource::Range, DataFlow::CallNode { + UserControlledFunction() { + this.getTarget().hasQualifiedName(packagePath(), ["URLParam", "URLParamFromCtx"]) + } + } + + /** + * Methods that extract URL parameters, considered as a source of untrusted flow. + */ + private class UserControlledRequestMethod extends UntrustedFlowSource::Range, + DataFlow::MethodCallNode { + UserControlledRequestMethod() { + this.getTarget().hasQualifiedName(packagePath(), "Context", "URLParam") + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Couchbase.qll b/go/ql/lib/semmle/go/frameworks/Couchbase.qll new file mode 100644 index 00000000000..983c445d710 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Couchbase.qll @@ -0,0 +1,98 @@ +/** + * Provides models of commonly used functions in the official Couchbase Go SDK library. + */ + +import go + +/** + * Provides models of commonly used functions in the official Couchbase Go SDK library. + */ +module Couchbase { + /** + * Gets a package path for the official Couchbase Go SDK library. + * + * Note that v1 and v2 have different APIs, but the names are disjoint so there is no need to + * distinguish between them. + */ + string packagePath() { + result = + package([ + "gopkg.in/couchbase/gocb", "github.com/couchbase/gocb", "github.com/couchbaselabs/gocb" + ], "") + } + + /** + * Models of methods on `gocb/AnalyticsQuery` and `gocb/N1qlQuery` which which support a fluent + * interface by returning the receiver. They are not inherently relevant to taint. + */ + private class QueryMethodV1 extends TaintTracking::FunctionModel, Method { + QueryMethodV1() { + exists(string queryTypeName, string methodName | + queryTypeName = "AnalyticsQuery" and + methodName in [ + "ContextId", "Deferred", "Pretty", "Priority", "RawParam", "ServerSideTimeout" + ] + or + queryTypeName = "N1qlQuery" and + methodName in [ + "AdHoc", "Consistency", "ConsistentWith", "Custom", "PipelineBatch", "PipelineCap", + "Profile", "ReadOnly", "ScanCap", "Timeout" + ] + | + this.hasQualifiedName(packagePath(), queryTypeName, methodName) + ) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class QueryFromN1qlStatementV1 extends TaintTracking::FunctionModel { + QueryFromN1qlStatementV1() { + this.hasQualifiedName(packagePath(), ["NewAnalyticsQuery", "NewN1qlQuery"]) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isParameter(0) and outp.isResult() + } + } + + /** + * A query used in an API function acting on a `Bucket` or `Cluster` struct of v1 of + * the official Couchbase Go library, gocb. + */ + private class CouchbaseV1Query extends NoSQL::Query::Range { + CouchbaseV1Query() { + // func (b *Bucket) ExecuteAnalyticsQuery(q *AnalyticsQuery, params interface{}) (AnalyticsResults, error) + // func (b *Bucket) ExecuteN1qlQuery(q *N1qlQuery, params interface{}) (QueryResults, error) + // func (c *Cluster) ExecuteAnalyticsQuery(q *AnalyticsQuery, params interface{}) (AnalyticsResults, error) + // func (c *Cluster) ExecuteN1qlQuery(q *N1qlQuery, params interface{}) (QueryResults, error) + exists(Method meth, string structName, string methodName | + structName in ["Bucket", "Cluster"] and + methodName in ["ExecuteN1qlQuery", "ExecuteAnalyticsQuery"] and + meth.hasQualifiedName(packagePath(), structName, methodName) and + this = meth.getACall().getArgument(0) + ) + } + } + + /** + * A query used in an API function acting on a `Bucket` or `Cluster` struct of v1 of + * the official Couchbase Go library, gocb. + */ + private class CouchbaseV2Query extends NoSQL::Query::Range { + CouchbaseV2Query() { + // func (c *Cluster) AnalyticsQuery(statement string, opts *AnalyticsOptions) (*AnalyticsResult, error) + // func (c *Cluster) Query(statement string, opts *QueryOptions) (*QueryResult, error) + // func (s *Scope) AnalyticsQuery(statement string, opts *AnalyticsOptions) (*AnalyticsResult, error) + // func (s *Scope) Query(statement string, opts *QueryOptions) (*QueryResult, error) + exists(Method meth, string structName, string methodName | + structName in ["Cluster", "Scope"] and + methodName in ["AnalyticsQuery", "Query"] and + meth.hasQualifiedName(packagePath(), structName, methodName) and + this = meth.getACall().getArgument(0) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Echo.qll b/go/ql/lib/semmle/go/frameworks/Echo.qll new file mode 100644 index 00000000000..df58b492b87 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Echo.qll @@ -0,0 +1,123 @@ +/** + * Provides classes for working with untrusted flow sources, taint propagators, and HTTP sinks + * from the `github.com/labstack/echo` package. + */ + +import go + +private module Echo { + /** Gets the package name `github.com/labstack/echo`. */ + private string packagePath() { result = package("github.com/labstack/echo", "") } + + /** + * Data from a `Context` interface method, considered as a source of untrusted flow. + */ + private class EchoContextSource extends UntrustedFlowSource::Range { + EchoContextSource() { + exists(DataFlow::MethodCallNode call, string methodName | + methodName = + [ + "Param", "ParamValues", "QueryParam", "QueryParams", "QueryString", "FormValue", + "FormParams", "FormFile", "MultipartForm", "Cookie", "Cookies" + ] and + call.getTarget().hasQualifiedName(packagePath(), "Context", methodName) and + this = call.getResult(0) + ) + } + } + + /** + * Data from a `Context` interface method that is not generally exploitable for open-redirect attacks. + */ + private class EchoContextRedirectUnexploitableSource extends HTTP::Redirect::UnexploitableSource { + EchoContextRedirectUnexploitableSource() { + exists(DataFlow::MethodCallNode call, string methodName | + methodName = ["FormValue", "FormParams", "FormFile", "MultipartForm", "Cookie", "Cookies"] and + call.getTarget().hasQualifiedName(packagePath(), "Context", methodName) and + this = call.getResult(0) + ) + } + } + + /** + * Models of `Context.Get/Set`. `Context` behaves like a map, with corresponding taint propagation. + */ + private class ContextMapModels extends TaintTracking::FunctionModel, Method { + string methodName; + FunctionInput input; + FunctionOutput output; + + ContextMapModels() { + ( + methodName = "Get" and input.isReceiver() and output.isResult() + or + methodName = "Set" and input.isParameter(1) and output.isReceiver() + ) and + this.hasQualifiedName(packagePath(), "Context", methodName) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp = input and outp = output + } + } + + /** + * A call to a method on `Context` struct that unmarshals data into a target. + */ + private class EchoContextBinder extends UntrustedFlowSource::Range { + EchoContextBinder() { + exists(DataFlow::MethodCallNode call | + call.getTarget().hasQualifiedName(packagePath(), "Context", "Bind") + | + this = FunctionOutput::parameter(0).getExitNode(call) + ) + } + } + + /** + * `echo.Context` methods which set the content-type to `text/html` and write a result in one operation. + */ + private class EchoHtmlOutputs extends HTTP::ResponseBody::Range { + EchoHtmlOutputs() { + exists(Method m | m.hasQualifiedName(packagePath(), "Context", ["HTML", "HTMLBlob"]) | + this = m.getACall().getArgument(1) + ) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + override string getAContentType() { result = "text/html" } + } + + /** + * `echo.Context` methods which take a content-type as a parameter. + */ + private class EchoParameterizedOutputs extends HTTP::ResponseBody::Range { + DataFlow::CallNode callNode; + + EchoParameterizedOutputs() { + exists(Method m | m.hasQualifiedName(packagePath(), "Context", ["Blob", "Stream"]) | + callNode = m.getACall() and this = callNode.getArgument(2) + ) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + override DataFlow::Node getAContentTypeNode() { result = callNode.getArgument(1) } + } + + /** + * The `echo.Context.Redirect` method. + */ + private class EchoRedirectMethod extends HTTP::Redirect::Range, DataFlow::CallNode { + EchoRedirectMethod() { + exists(Method m | m.hasQualifiedName(packagePath(), "Context", "Redirect") | + this = m.getACall() + ) + } + + override DataFlow::Node getUrl() { result = this.getArgument(1) } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/ElazarlGoproxy.qll b/go/ql/lib/semmle/go/frameworks/ElazarlGoproxy.qll new file mode 100644 index 00000000000..0d49431e72b --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/ElazarlGoproxy.qll @@ -0,0 +1,143 @@ +/** + * Provides classes for working with concepts relating to the [github.com/elazarl/goproxy](https://pkg.go.dev/github.com/elazarl/goproxy) package. + */ + +import go +private import semmle.go.StringOps + +/** + * Provides classes for working with concepts relating to the [github.com/elazarl/goproxy](https://pkg.go.dev/github.com/elazarl/goproxy) package. + */ +module ElazarlGoproxy { + /** Gets the package name. */ + string packagePath() { result = package("github.com/elazarl/goproxy", "") } + + private class NewResponse extends HTTP::HeaderWrite::Range, DataFlow::CallNode { + NewResponse() { this.getTarget().hasQualifiedName(packagePath(), "NewResponse") } + + override string getHeaderName() { this.definesHeader(result, _) } + + override string getHeaderValue() { this.definesHeader(_, result) } + + override DataFlow::Node getName() { none() } + + override DataFlow::Node getValue() { result = this.getArgument([1, 2]) } + + override predicate definesHeader(string header, string value) { + header = "status" and value = this.getArgument(2).getIntValue().toString() + or + header = "content-type" and value = this.getArgument(1).getStringValue() + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + /** A body argument to a `NewResponse` call. */ + private class NewResponseBody extends HTTP::ResponseBody::Range { + NewResponse call; + + NewResponseBody() { this = call.getArgument(3) } + + override DataFlow::Node getAContentTypeNode() { result = call.getArgument(1) } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + private class TextResponse extends HTTP::HeaderWrite::Range, DataFlow::CallNode { + TextResponse() { this.getTarget().hasQualifiedName(packagePath(), "TextResponse") } + + override string getHeaderName() { this.definesHeader(result, _) } + + override string getHeaderValue() { this.definesHeader(_, result) } + + override DataFlow::Node getName() { none() } + + override DataFlow::Node getValue() { none() } + + override predicate definesHeader(string header, string value) { + header = "status" and value = "200" + or + header = "content-type" and value = "text/plain" + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + /** A body argument to a `TextResponse` call. */ + private class TextResponseBody extends HTTP::ResponseBody::Range, TextResponse { + TextResponse call; + + TextResponseBody() { this = call.getArgument(2) } + + override DataFlow::Node getAContentTypeNode() { result = call.getArgument(1) } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + /** A handler attached to a goproxy proxy type. */ + private class ProxyHandler extends HTTP::RequestHandler::Range { + DataFlow::MethodCallNode handlerReg; + + ProxyHandler() { + handlerReg + .getTarget() + .hasQualifiedName(packagePath(), "ReqProxyConds", ["Do", "DoFunc", "HandleConnect"]) and + this = handlerReg.getArgument(0) + } + + override predicate guardedBy(DataFlow::Node check) { + // note OnResponse is not modeled, as that server responses are not currently considered untrusted input + exists(DataFlow::MethodCallNode onreqcall | + onreqcall.getTarget().hasQualifiedName(packagePath(), "ProxyHttpServer", "OnRequest") + | + handlerReg.getReceiver() = onreqcall.getASuccessor*() and + check = onreqcall.getArgument(0) + ) + } + } + + private class UserControlledRequestData extends UntrustedFlowSource::Range { + UserControlledRequestData() { + exists(DataFlow::FieldReadNode frn | this = frn | + // liberally consider ProxyCtx.UserData to be untrusted; it's a data field set by a request handler + frn.getField().hasQualifiedName(packagePath(), "ProxyCtx", "UserData") + ) + or + exists(DataFlow::MethodCallNode call | this = call | + call.getTarget().hasQualifiedName(packagePath(), "ProxyCtx", "Charset") + ) + } + } + + private class ProxyLogFunction extends StringOps::Formatting::Range, Method { + ProxyLogFunction() { this.hasQualifiedName(packagePath(), "ProxyCtx", ["Logf", "Warnf"]) } + + override int getFormatStringIndex() { result = 0 } + + override int getFirstFormattedParameterIndex() { result = 1 } + } + + private class ProxyLog extends LoggerCall::Range, DataFlow::MethodCallNode { + ProxyLog() { this.getTarget() instanceof ProxyLogFunction } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + + private class MethodModels extends TaintTracking::FunctionModel, Method { + FunctionInput inp; + FunctionOutput outp; + + MethodModels() { + // Methods: + // signature: func CertStorage.Fetch(hostname string, gen func() (*tls.Certificate, error)) (*tls.Certificate, error) + // + // `hostname` excluded because if the cert storage or generator function themselves have not + // been tainted, `hostname` would be unlikely to fetch user-controlled data + this.hasQualifiedName(packagePath(), "CertStorage", "Fetch") and + (inp.isReceiver() or inp.isParameter(1)) and + outp.isResult(0) + } + + override predicate hasTaintFlow(FunctionInput i, FunctionOutput o) { i = inp and o = outp } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Email.qll b/go/ql/lib/semmle/go/frameworks/Email.qll new file mode 100644 index 00000000000..049af5f87bf --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Email.qll @@ -0,0 +1,114 @@ +/** Provides classes for working with email-related APIs. */ + +import go + +/** + * A data-flow node that represents data written to an email, either as part + * of the headers or as part of the body. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `EmailData::Range` instead. + */ +class EmailData extends DataFlow::Node { + EmailData::Range self; + + EmailData() { this = self } +} + +/** Provides classes for working with data that is incorporated into an email. */ +module EmailData { + /** + * A data-flow node that represents data which is written to an email, either as part + * of the headers or as part of the body. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `EmailData` instead. + */ + abstract class Range extends DataFlow::Node { } + + /** A data-flow node that is written to an email using the net/smtp package. */ + private class SmtpData extends Range { + SmtpData() { + // func (c *Client) Data() (io.WriteCloser, error) + exists(Method data | + data.hasQualifiedName("net/smtp", "Client", "Data") and + this.(DataFlow::SsaNode).getInit() = data.getACall().getResult(0) + ) + or + // func SendMail(addr string, a Auth, from string, to []string, msg []byte) error + exists(Function sendMail | + sendMail.hasQualifiedName("net/smtp", "SendMail") and + this = sendMail.getACall().getArgument(4) + ) + } + } + + /** Gets the package name `github.com/sendgrid/sendgrid-go/helpers/mail`. */ + private string sendgridMail() { + result = package("github.com/sendgrid/sendgrid-go", "helpers/mail") + } + + private class NewContent extends TaintTracking::FunctionModel { + NewContent() { + // func NewContent(contentType string, value string) *Content + this.hasQualifiedName(sendgridMail(), "NewContent") + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input.isParameter(1) and output.isResult() + } + } + + /** A data-flow node that is written to an email using the sendgrid/sendgrid-go package. */ + private class SendGridEmail extends Range { + SendGridEmail() { + // func NewSingleEmail(from *Email, subject string, to *Email, plainTextContent string, htmlContent string) *SGMailV3 + exists(Function newSingleEmail | + newSingleEmail.hasQualifiedName(sendgridMail(), "NewSingleEmail") and + this = newSingleEmail.getACall().getArgument([1, 3, 4]) + ) + or + // func NewV3MailInit(from *Email, subject string, to *Email, content ...*Content) *SGMailV3 + exists(Function newv3MailInit | + newv3MailInit.hasQualifiedName(sendgridMail(), "NewV3MailInit") and + this = newv3MailInit.getACall().getArgument(any(int i | i = 1 or i >= 3)) + ) + or + // func (s *SGMailV3) AddContent(c ...*Content) *SGMailV3 + exists(Method addContent | + addContent.hasQualifiedName(sendgridMail(), "SGMailV3", "AddContent") and + this = addContent.getACall().getAnArgument() + ) + } + } +} + +/** + * A taint model of the `Writer.CreatePart` method from `mime/multipart`. + * + * If tainted data is written to the multipart section created by this method, the underlying writer + * should be considered tainted as well. + */ +private class MultipartWriterCreatePartModel extends TaintTracking::FunctionModel, Method { + MultipartWriterCreatePartModel() { + this.hasQualifiedName("mime/multipart", "Writer", "CreatePart") + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input.isResult(0) and output.isReceiver() + } +} + +/** + * A taint model of the `NewWriter` function from `mime/multipart`. + * + * If tainted data is written to the writer created by this function, the underlying writer + * should be considered tainted as well. + */ +private class MultipartNewWriterModel extends TaintTracking::FunctionModel { + MultipartNewWriterModel() { this.hasQualifiedName("mime/multipart", "NewWriter") } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input.isResult() and output.isParameter(0) + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Encoding.qll b/go/ql/lib/semmle/go/frameworks/Encoding.qll new file mode 100644 index 00000000000..34af4ce6ed7 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Encoding.qll @@ -0,0 +1,28 @@ +/** + * Provides classes modeling taint propagation through marshalling and encoding functions. + */ + +import go + +/** Gets the package name `github.com/json-iterator/go`. */ +private string packagePath() { result = package("github.com/json-iterator/go", "") } + +/** A model of json-iterator's `Unmarshal` function, propagating taint from the JSON input to the decoded object. */ +private class JsonIteratorUnmarshalFunction extends TaintTracking::FunctionModel, + UnmarshalingFunction::Range { + JsonIteratorUnmarshalFunction() { + this.hasQualifiedName(packagePath(), ["Unmarshal", "UnmarshalFromString"]) + or + this.(Method).implements(packagePath(), "API", ["Unmarshal", "UnmarshalFromString"]) + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(1) } + + override string getFormat() { result = "JSON" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } +} diff --git a/go/ql/lib/semmle/go/frameworks/EvanphxJsonPatch.qll b/go/ql/lib/semmle/go/frameworks/EvanphxJsonPatch.qll new file mode 100644 index 00000000000..6408b3d1d4c --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/EvanphxJsonPatch.qll @@ -0,0 +1,61 @@ +/** + * Provides classes modeling `github.com/evanphx/json-patch`. + */ + +import go + +private module EvanphxJsonPatch { + /** Gets the package name `github.com/evanphx/json-patch`. */ + private string packagePath() { result = package("github.com/evanphx/json-patch", "") } + + private class MergeMergePatches extends TaintTracking::FunctionModel { + MergeMergePatches() { this.hasQualifiedName(packagePath(), "MergeMergePatches") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + (inp.isParameter(0) or inp.isParameter(1)) and + outp.isResult(0) + } + } + + private class MergePatch extends TaintTracking::FunctionModel { + MergePatch() { this.hasQualifiedName(packagePath(), "MergePatch") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + (inp.isParameter(0) or inp.isParameter(1)) and + outp.isResult(0) + } + } + + private class CreateMergePatch extends TaintTracking::FunctionModel { + CreateMergePatch() { this.hasQualifiedName(packagePath(), "CreateMergePatch") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + (inp.isParameter(0) or inp.isParameter(1)) and + outp.isResult(0) + } + } + + private class DecodePatch extends TaintTracking::FunctionModel { + DecodePatch() { this.hasQualifiedName(packagePath(), "DecodePatch") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and + outp.isResult(0) + } + } + + private class Apply extends TaintTracking::FunctionModel, Method { + Apply() { + exists(string fn | + fn in ["Apply", "ApplyWithOptions", "ApplyIndent", "ApplyIndentWithOptions"] + | + this.hasQualifiedName(packagePath(), "Patch", fn) + ) + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + (inp.isParameter(0) or inp.isReceiver()) and + outp.isResult(0) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Gin.qll b/go/ql/lib/semmle/go/frameworks/Gin.qll new file mode 100644 index 00000000000..87212868ae3 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Gin.qll @@ -0,0 +1,72 @@ +/** + * Provides classes for working with untrusted flow sources from the `github.com/gin-gonic/gin` package. + */ + +import go + +private module Gin { + /** Gets the package name `github.com/gin-gonic/gin`. */ + string packagePath() { result = package("github.com/gin-gonic/gin", "") } + + /** + * Data from a `Context` struct, considered as a source of untrusted flow. + */ + private class GithubComGinGonicGinContextSource extends UntrustedFlowSource::Range { + GithubComGinGonicGinContextSource() { + // Method calls: + exists(DataFlow::MethodCallNode call, string methodName | + call.getTarget().hasQualifiedName(packagePath(), "Context", methodName) and + methodName in [ + "FullPath", "GetHeader", "QueryArray", "Query", "PostFormArray", "PostForm", "Param", + "GetStringSlice", "GetString", "GetRawData", "ClientIP", "ContentType", "Cookie", + "GetQueryArray", "GetQuery", "GetPostFormArray", "GetPostForm", "DefaultPostForm", + "DefaultQuery", "GetPostFormMap", "GetQueryMap", "GetStringMap", "GetStringMapString", + "GetStringMapStringSlice", "PostFormMap", "QueryMap" + ] + | + this = call.getResult(0) + ) + or + // Field reads: + exists(DataFlow::Field fld | + fld.hasQualifiedName(packagePath(), "Context", ["Accepted", "Params"]) and + this = fld.getARead() + ) + } + } + + private class ParamsGet extends TaintTracking::FunctionModel, Method { + ParamsGet() { this.hasQualifiedName(packagePath(), "Params", "Get") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult(0) + } + } + + private class ParamsByName extends TaintTracking::FunctionModel, Method { + ParamsByName() { this.hasQualifiedName(packagePath(), "Params", "ByName") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + /** + * A call to a method on `Context` struct that unmarshals data into a target. + */ + private class GithubComGinGonicGinContextBindSource extends UntrustedFlowSource::Range { + GithubComGinGonicGinContextBindSource() { + exists(DataFlow::MethodCallNode call, string methodName | + call.getTarget().hasQualifiedName(packagePath(), "Context", methodName) and + methodName in [ + "BindJSON", "BindYAML", "BindXML", "BindUri", "BindQuery", "BindWith", "BindHeader", + "MustBindWith", "Bind", "ShouldBind", "ShouldBindBodyWith", "ShouldBindJSON", + "ShouldBindQuery", "ShouldBindUri", "ShouldBindHeader", "ShouldBindWith", + "ShouldBindXML", "ShouldBindYAML" + ] + | + this = FunctionOutput::parameter(0).getExitNode(call) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Glog.qll b/go/ql/lib/semmle/go/frameworks/Glog.qll new file mode 100644 index 00000000000..70b117a71e6 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Glog.qll @@ -0,0 +1,56 @@ +/** + * Provides models of commonly used functions in the `github.com/golang/glog` and `k8s.io/klog` + * packages. + */ + +import go +private import semmle.go.StringOps + +/** + * Provides models of commonly used functions in the `github.com/golang/glog` packages and its + * forks. + */ +module Glog { + private class GlogFunction extends Function { + int firstPrintedArg; + + GlogFunction() { + exists(string pkg, string fn, string level | + pkg = package(["github.com/golang/glog", "gopkg.in/glog", "k8s.io/klog"], "") and + level = ["Error", "Exit", "Fatal", "Info", "Warning"] and + ( + fn = level + ["", "f", "ln"] and firstPrintedArg = 0 + or + fn = level + "Depth" and firstPrintedArg = 1 + ) + | + this.hasQualifiedName(pkg, fn) + or + this.(Method).hasQualifiedName(pkg, "Verbose", fn) + ) + } + + /** + * Gets the index of the first argument that may be output, including a format string if one is present. + */ + int getFirstPrintedArg() { result = firstPrintedArg } + } + + private class StringFormatter extends StringOps::Formatting::Range instanceof GlogFunction { + StringFormatter() { this.getName().matches("%f") } + + override int getFormatStringIndex() { result = super.getFirstPrintedArg() } + + override int getFirstFormattedParameterIndex() { result = super.getFirstPrintedArg() + 1 } + } + + private class GlogCall extends LoggerCall::Range, DataFlow::CallNode { + GlogFunction callee; + + GlogCall() { this = callee.getACall() } + + override DataFlow::Node getAMessageComponent() { + result = this.getArgument(any(int i | i >= callee.getFirstPrintedArg())) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/GoKit.qll b/go/ql/lib/semmle/go/frameworks/GoKit.qll new file mode 100644 index 00000000000..c501858997c --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/GoKit.qll @@ -0,0 +1,45 @@ +/** + * Provides classes for working with concepts relating to the [github.com/go-kit/kit](https://pkg.go.dev/github.com/go-kit/kit) package. + * + * Note that these models are not included by default; to include them, add `import semmle.go.frameworks.GoKit` to your query or to + * `Customizations.qll`. + */ + +import go + +/** + * Provides classes for working with concepts relating to the [github.com/go-kit/kit](https://pkg.go.dev/github.com/go-kit/kit) package. + */ +module GoKit { + /** Gets the package name. */ + string packagePath() { result = package("github.com/go-kit/kit", "") } + + /** + * Provides classes for working with concepts relating to the `endpoint` package of the + * [github.com/go-kit/kit](https://pkg.go.dev/github.com/go-kit/kit) package. + */ + module Endpoint { + /** Gets the package name. */ + string endpointPackagePath() { result = package("github.com/go-kit/kit", "endpoint") } + + // gets a function that returns an endpoint + private DataFlow::Node getAnEndpointFactoryResult() { + exists(Function mkFn, FunctionOutput res | + mkFn.getResultType(0).hasQualifiedName(endpointPackagePath(), "Endpoint") and + result = res.getEntryNode(mkFn.getFuncDecl()).getAPredecessor*() + ) + } + + private FuncDef getAnEndpointFunction() { + exists(Function endpointFn | endpointFn.getFuncDecl() = result | + endpointFn.getARead() = getAnEndpointFactoryResult() + ) + or + DataFlow::exprNode(result.(FuncLit)) = getAnEndpointFactoryResult() + } + + private class EndpointRequest extends UntrustedFlowSource::Range { + EndpointRequest() { this = DataFlow::parameterNode(getAnEndpointFunction().getParameter(1)) } + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/GoRestfulHttp.qll b/go/ql/lib/semmle/go/frameworks/GoRestfulHttp.qll new file mode 100644 index 00000000000..ddaf4dde544 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/GoRestfulHttp.qll @@ -0,0 +1,46 @@ +/** + * Provides models of the [go-restful library](https://github.com/emicklei/go-restful). + */ + +import go + +/** + * Provides models of the [go-restful library](https://github.com/emicklei/go-restful). + */ +private module GoRestfulHttp { + /** Gets the package name `github.com/emicklei/go-restful`. */ + string packagePath() { result = package("github.com/emicklei/go-restful", "") } + + /** + * A model for methods defined on go-restful's `Request` object that may return user-controlled data. + */ + private class GoRestfulSourceMethod extends Method { + GoRestfulSourceMethod() { + this.hasQualifiedName(packagePath(), "Request", + [ + "QueryParameters", "QueryParameter", "BodyParameter", "HeaderParameter", "PathParameter", + "PathParameters" + ]) + } + } + + /** + * A model of go-restful's `Request` object as a source of user-controlled data. + */ + private class GoRestfulSource extends UntrustedFlowSource::Range { + GoRestfulSource() { this = any(GoRestfulSourceMethod g).getACall() } + } + + /** + * A model of go-restful's `Request.ReadEntity` method as a source of user-controlled data. + */ + private class GoRestfulReadEntitySource extends UntrustedFlowSource::Range { + GoRestfulReadEntitySource() { + exists(DataFlow::MethodCallNode call | + call.getTarget().hasQualifiedName(packagePath(), "Request", "ReadEntity") + | + this = FunctionOutput::parameter(0).getExitNode(call) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/K8sIoApiCoreV1.qll b/go/ql/lib/semmle/go/frameworks/K8sIoApiCoreV1.qll new file mode 100644 index 00000000000..9918274f166 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/K8sIoApiCoreV1.qll @@ -0,0 +1,61 @@ +/** Provides models of commonly used functions in the `k8s.io/api/core/v1` package. */ + +import go + +/** + * Provides models of commonly used functions in the `k8s.io/api/core/v1` package. + */ +module K8sIoApiCoreV1 { + /** Gets the package name `k8s.io/api/core/v1`. */ + string packagePath() { result = package("k8s.io/api", "core/v1") } + + private class SecretDeepCopy extends TaintTracking::FunctionModel, Method { + string methodName; + FunctionOutput output; + + SecretDeepCopy() { + ( + methodName in ["DeepCopy", "DeepCopyObject"] and output.isResult() + or + methodName = "DeepCopyInto" and output.isParameter(0) + ) and + this.hasQualifiedName(packagePath(), ["Secret", "SecretList"], methodName) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp = outp + } + } + + private class SecretMarshal extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + SecretMarshal() { this.hasQualifiedName(packagePath(), ["Secret", "SecretList"], "Marshal") } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isResult(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class SecretUnmarshal extends TaintTracking::FunctionModel, Method, + UnmarshalingFunction::Range { + SecretUnmarshal() { + this.hasQualifiedName(packagePath(), ["Secret", "SecretList"], "Unmarshal") + } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/K8sIoApimachineryPkgRuntime.qll b/go/ql/lib/semmle/go/frameworks/K8sIoApimachineryPkgRuntime.qll new file mode 100644 index 00000000000..3ce4df3dc92 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/K8sIoApimachineryPkgRuntime.qll @@ -0,0 +1,424 @@ +/** Provides models of commonly used functions in the `k8s.io/apimachinery/pkg/runtime` package. */ + +import go + +/** + * Provides models of commonly used functions in the `k8s.io/apimachinery/pkg/runtime` package. + */ +module K8sIoApimachineryPkgRuntime { + /** Gets the package name `k8s.io/apimachinery/pkg/runtime`. */ + string packagePath() { result = package("k8s.io/apimachinery", "pkg/runtime") } + + private class ConvertTypeToType extends TaintTracking::FunctionModel { + ConvertTypeToType() { + this.hasQualifiedName(packagePath(), + [ + "Convert_Slice_string_To_Pointer_int64", "Convert_Slice_string_To_int", + "Convert_Slice_string_To_int64", "Convert_Slice_string_To_string", + "Convert_runtime_Object_To_runtime_RawExtension", + "Convert_runtime_RawExtension_To_runtime_Object", "Convert_string_To_Pointer_int64", + "Convert_string_To_int64" + ]) + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isParameter(1) + } + } + + private class DecodeInto extends TaintTracking::FunctionModel, UnmarshalingFunction::Range { + DecodeInto() { this.hasQualifiedName(packagePath(), "DecodeInto") } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(1) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(2) } + + override string getFormat() { + // The format is not fixed. It depends on parameter 1 or 2. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class DeepCopyJSON extends TaintTracking::FunctionModel { + DeepCopyJSON() { this.hasQualifiedName(packagePath(), ["DeepCopyJSON", "DeepCopyJSONValue"]) } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isResult() + } + } + + private class Encode extends TaintTracking::FunctionModel, MarshalingFunction::Range { + Encode() { this.hasQualifiedName(packagePath(), ["Encode", "EncodeOrDie"]) } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(1) } + + override DataFlow::FunctionOutput getOutput() { result.isResult(0) } + + override string getFormat() { + // The format is not fixed. It depends on the receiver. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class ReadField extends TaintTracking::FunctionModel { + ReadField() { this.hasQualifiedName(packagePath(), ["Field", "FieldPtr"]) } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isParameter(2) + } + } + + private class SetField extends TaintTracking::FunctionModel { + SetField() { this.hasQualifiedName(packagePath(), "SetField") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isParameter(1) + } + } + + private class CacheableObjectCacheEncode extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + CacheableObjectCacheEncode() { + this.implements(packagePath(), "CacheableObject", "CacheEncode") + } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(2) } + + override string getFormat() { + // The format is not fixed. It depends on the receiver. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class CacheableObjectGetObject extends TaintTracking::FunctionModel, Method { + CacheableObjectGetObject() { this.implements(packagePath(), "CacheableObject", "GetObject") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class DecoderDecode extends TaintTracking::FunctionModel, Method, + UnmarshalingFunction::Range { + DecoderDecode() { + this.implements(packagePath(), "Decoder", "Decode") or + this.hasQualifiedName(packagePath(), "WithoutVersionDecoder", "Decode") + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(2) or result.isResult(0) } + + override string getFormat() { + // The format is not fixed. It depends on the receiver. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class EncoderEncode extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + EncoderEncode() { + this.implements(packagePath(), "Encoder", "Encode") or + this.hasQualifiedName(packagePath(), "WithVersionEncoder", "Encode") + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(1) } + + override string getFormat() { + // The format is not fixed. It depends on the receiver. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class FramerNewFrameReader extends TaintTracking::FunctionModel, Method { + FramerNewFrameReader() { this.implements(packagePath(), "Framer", "NewFrameReader") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isResult() + } + } + + private class FramerNewFrameWriter extends TaintTracking::FunctionModel, Method { + FramerNewFrameWriter() { this.implements(packagePath(), "Framer", "NewFrameWriter") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isResult() + } + } + + private class ObjectDeepCopyObject extends TaintTracking::FunctionModel, Method { + ObjectDeepCopyObject() { this.implements(packagePath(), "Object", "DeepCopyObject") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class Decode extends TaintTracking::FunctionModel, UnmarshalingFunction::Range { + Decode() { this.hasQualifiedName(packagePath(), "Decode") } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(1) } + + override DataFlow::FunctionOutput getOutput() { result.isResult(0) } + + override string getFormat() { + // The format is not fixed. It depends on the parameter 0. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class NewEncodable extends TaintTracking::FunctionModel { + NewEncodable() { this.hasQualifiedName(packagePath(), ["NewEncodable", "NewEncodableList"]) } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(1) and outp.isResult() + } + } + + private class UseOrCreateObject extends TaintTracking::FunctionModel { + UseOrCreateObject() { this.hasQualifiedName(packagePath(), "UseOrCreateObject") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(3) and outp.isResult(0) + } + } + + private class ObjectConvertorConvert extends TaintTracking::FunctionModel, Method { + ObjectConvertorConvert() { this.implements(packagePath(), "ObjectConvertor", "Convert") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isParameter(1) + } + } + + private class ObjectConvertorConvertToVersion extends TaintTracking::FunctionModel, Method { + ObjectConvertorConvertToVersion() { + this.implements(packagePath(), "ObjectConvertor", "ConvertToVersion") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isResult(0) + } + } + + private class ObjectVersionerConvertToVersion extends TaintTracking::FunctionModel, Method { + ObjectVersionerConvertToVersion() { + this.implements(packagePath(), "ObjectVersioner", "ConvertToVersion") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isResult(0) + } + } + + private class ParameterCodecDecodeParameters extends TaintTracking::FunctionModel, Method, + UnmarshalingFunction::Range { + ParameterCodecDecodeParameters() { + this.implements(packagePath(), "ParameterCodec", "DecodeParameters") + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(2) } + + override string getFormat() { + // The format is not fixed. It depends on parameter 1. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class ParameterCodecEncodeParameters extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + ParameterCodecEncodeParameters() { + this.implements(packagePath(), "ParameterCodec", "EncodeParameters") + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isResult(0) } + + override string getFormat() { + // The format is not fixed. It depends on parameter 1. + none() + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class ProtobufMarshallerMarshalTo extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + ProtobufMarshallerMarshalTo() { + this.implements(packagePath(), "ProtobufMarshaller", "MarshalTo") or + this.implements(packagePath(), "ProtobufReverseMarshaller", "MarshalToSizedBuffer") + } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class RawExtensionDeepCopy extends TaintTracking::FunctionModel, Method { + RawExtensionDeepCopy() { this.hasQualifiedName(packagePath(), "RawExtension", "DeepCopy") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class RawExtensionDeepCopyInto extends TaintTracking::FunctionModel, Method { + RawExtensionDeepCopyInto() { + this.hasQualifiedName(packagePath(), "RawExtension", "DeepCopyInto") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isParameter(0) + } + } + + private class RawExtensionMarshal extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + RawExtensionMarshal() { this.hasQualifiedName(packagePath(), "RawExtension", "Marshal") } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isResult(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class RawExtensionUnmarshal extends TaintTracking::FunctionModel, Method, + UnmarshalingFunction::Range { + RawExtensionUnmarshal() { this.hasQualifiedName(packagePath(), "RawExtension", "Unmarshal") } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class UnknownDeepCopy extends TaintTracking::FunctionModel, Method { + UnknownDeepCopy() { + this.hasQualifiedName(packagePath(), "Unknown", ["DeepCopy", "DeepCopyObject"]) + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class UnknownDeepCopyInto extends TaintTracking::FunctionModel, Method { + UnknownDeepCopyInto() { this.hasQualifiedName(packagePath(), "Unknown", "DeepCopyInto") } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isParameter(0) + } + } + + private class UnknownMarshal extends TaintTracking::FunctionModel, Method, + MarshalingFunction::Range { + string methodName; + + UnknownMarshal() { + methodName in ["Marshal", "NestedMarshalTo"] and + this.hasQualifiedName(packagePath(), "Unknown", methodName) + } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { + methodName = "Marshal" and result.isResult(0) + or + methodName = "NestedMarshalTo" and result.isParameter(0) + } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class UnknownUnmarshal extends TaintTracking::FunctionModel, Method, + UnmarshalingFunction::Range { + UnknownUnmarshal() { this.hasQualifiedName(packagePath(), "Unknown", "Unmarshal") } + + override DataFlow::FunctionInput getAnInput() { result.isReceiver() } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(0) } + + override string getFormat() { result = "protobuf" } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + } + + private class UnstructuredUnstructuredContent extends TaintTracking::FunctionModel, Method { + UnstructuredUnstructuredContent() { + this.implements(packagePath(), "Unstructured", "UnstructuredContent") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class UnstructuredSetUnstructuredContent extends TaintTracking::FunctionModel, Method { + UnstructuredSetUnstructuredContent() { + this.implements(packagePath(), "Unstructured", "SetUnstructuredContent") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp.isParameter(0) and outp.isReceiver() + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/K8sIoClientGo.qll b/go/ql/lib/semmle/go/frameworks/K8sIoClientGo.qll new file mode 100644 index 00000000000..c087cc26ff8 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/K8sIoClientGo.qll @@ -0,0 +1,28 @@ +/** Provides models of commonly used functions in the `k8s.io/client-go/kubernetes/typed/core/v1` package. */ + +import go + +/** + * Provides models of commonly used functions in the `k8s.io/client-go/kubernetes/typed/core/v1` + * package. + */ +module K8sIoClientGo { + /** Gets the package name `k8s.io/client-go/kubernetes/typed/core/v1`. */ + string packagePath() { result = package("k8s.io/client-go", "kubernetes/typed/core/v1") } + + /** + * A model of `SecretInterface` methods that are sources of secret data. + */ + private class SecretInterfaceSourceMethod extends Method { + SecretInterfaceSourceMethod() { + this.implements(packagePath(), "SecretInterface", ["Get", "List", "Patch"]) + } + } + + /** + * A model of `SecretInterface` as a source of secret data. + */ + class SecretInterfaceSource extends DataFlow::Node { + SecretInterfaceSource() { this = any(SecretInterfaceSourceMethod g).getACall().getResult(0) } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Logrus.qll b/go/ql/lib/semmle/go/frameworks/Logrus.qll new file mode 100644 index 00000000000..9255b6767b5 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Logrus.qll @@ -0,0 +1,53 @@ +/** Provides models of commonly used functions in the `github.com/sirupsen/logrus` package. */ + +import go +private import semmle.go.StringOps + +/** Provides models of commonly used functions in the `github.com/sirupsen/logrus` package. */ +module Logrus { + /** Gets the package name `github.com/sirupsen/logrus`. */ + string packagePath() { + result = package(["github.com/sirupsen/logrus", "github.com/Sirupsen/logrus"], "") + } + + bindingset[result] + private string getALogResultName() { + result + .matches([ + "Debug%", "Error%", "Fatal%", "Info%", "Log%", "Panic%", "Print%", "Trace%", "Warn%" + ]) + } + + bindingset[result] + private string getAnEntryUpdatingMethodName() { + result.regexpMatch("With(Context|Error|Fields?|Time)") + } + + private class LogFunction extends Function { + LogFunction() { + exists(string name | name = getALogResultName() or name = getAnEntryUpdatingMethodName() | + this.hasQualifiedName(packagePath(), name) or + this.(Method).hasQualifiedName(packagePath(), ["Entry", "Logger"], name) + ) + } + } + + private class LogCall extends LoggerCall::Range, DataFlow::CallNode { + LogCall() { this = any(LogFunction f).getACall() } + + override DataFlow::Node getAMessageComponent() { result = this.getAnArgument() } + } + + private class StringFormatters extends StringOps::Formatting::Range instanceof LogFunction { + int argOffset; + + StringFormatters() { + this.getName().matches("%f") and + if this.getName() = "Logf" then argOffset = 1 else argOffset = 0 + } + + override int getFormatStringIndex() { result = argOffset } + + override int getFirstFormattedParameterIndex() { result = argOffset + 1 } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Macaron.qll b/go/ql/lib/semmle/go/frameworks/Macaron.qll new file mode 100644 index 00000000000..a38b2b20da0 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Macaron.qll @@ -0,0 +1,30 @@ +/** + * Provides classes for working with concepts relating to the Macaron web framework + */ + +import go + +private module Macaron { + private class Context extends HTTP::ResponseWriter::Range { + SsaWithFields v; + + Context() { + this = v.getBaseVariable().getSourceVariable() and + exists(Method m | m.hasQualifiedName("gopkg.in/macaron.v1", "Context", "Redirect") | + v.getType().getMethod("Redirect") = m + ) + } + + override DataFlow::Node getANode() { result = v.similar().getAUse().getASuccessor*() } + } + + private class RedirectCall extends HTTP::Redirect::Range, DataFlow::MethodCallNode { + RedirectCall() { + this.getTarget().hasQualifiedName("gopkg.in/macaron.v1", "Context", "Redirect") + } + + override DataFlow::Node getUrl() { result = this.getArgument(0) } + + override HTTP::ResponseWriter getResponseWriter() { result.getANode() = this.getReceiver() } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Mux.qll b/go/ql/lib/semmle/go/frameworks/Mux.qll new file mode 100644 index 00000000000..bca64c17cf6 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Mux.qll @@ -0,0 +1,17 @@ +/** + * Provides classes for working with concepts in the Mux HTTP middleware library. + */ + +import go + +/** + * Provides classes for working with concepts in the Mux HTTP middleware library. + */ +module Mux { + /** An access to a Mux middleware variable. */ + class RequestVars extends DataFlow::UntrustedFlowSource::Range, DataFlow::CallNode { + RequestVars() { + this.getTarget().hasQualifiedName(package("github.com/gorilla/mux", ""), "Vars") + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/NoSQL.qll b/go/ql/lib/semmle/go/frameworks/NoSQL.qll new file mode 100644 index 00000000000..9f9ca609084 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/NoSQL.qll @@ -0,0 +1,121 @@ +/** + * Provides classes for working with NoSQL-related concepts such as queries. + */ + +import go + +/** Provides classes for working with NoSQL-related APIs. */ +module NoSQL { + /** + * A data-flow node whose value is interpreted as (part of) a NoSQL query. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `NoSQL::Query::Range` instead. + */ + class Query extends DataFlow::Node { + Query::Range self; + + Query() { this = self } + } + + /** Provides classes for working with NoSQL queries. */ + module Query { + /** + * A data-flow node whose value is interpreted as (part of) a NoSQL query. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `NoSQL::Query` instead. + */ + abstract class Range extends DataFlow::Node { } + + /** + * Holds if method `name` of struct `Collection` from package + * [go.mongodb.org/mongo-driver/mongo](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo) + * interprets parameter `n` as a query. + */ + private predicate mongoDbCollectionMethod(string name, int n) { + // func (coll *Collection) CountDocuments(ctx context.Context, filter interface{}, + // opts ...*options.CountOptions) (int64, error) + name = "CountDocuments" and n = 1 + or + // func (coll *Collection) DeleteMany(ctx context.Context, filter interface{}, + // opts ...*options.DeleteOptions) (*DeleteResult, error) + name = "DeleteMany" and n = 1 + or + // func (coll *Collection) DeleteOne(ctx context.Context, filter interface{}, + // opts ...*options.DeleteOptions) (*DeleteResult, error) + name = "DeleteOne" and n = 1 + or + // func (coll *Collection) Distinct(ctx context.Context, fieldName string, filter interface{}, + // ...) ([]interface{}, error) + name = "Distinct" and n = 2 + or + // func (coll *Collection) Find(ctx context.Context, filter interface{}, + // opts ...*options.FindOptions) (*Cursor, error) + name = "Find" and n = 1 + or + // func (coll *Collection) FindOne(ctx context.Context, filter interface{}, + // opts ...*options.FindOneOptions) *SingleResult + name = "FindOne" and n = 1 + or + // func (coll *Collection) FindOneAndDelete(ctx context.Context, filter interface{}, ...) + // *SingleResult + name = "FindOneAndDelete" and n = 1 + or + // func (coll *Collection) FindOneAndReplace(ctx context.Context, filter interface{}, + // replacement interface{}, ...) *SingleResult + name = "FindOneAndReplace" and n = 1 + or + // func (coll *Collection) FindOneAndUpdate(ctx context.Context, filter interface{}, + // update interface{}, ...) *SingleResult + name = "FindOneAndUpdate" and n = 1 + or + // func (coll *Collection) ReplaceOne(ctx context.Context, filter interface{}, + // replacement interface{}, ...) (*UpdateResult, error) + name = "ReplaceOne" and n = 1 + or + // func (coll *Collection) UpdateMany(ctx context.Context, filter interface{}, + // update interface{}, ...) (*UpdateResult, error) + name = "UpdateMany" and n = 1 + or + // func (coll *Collection) UpdateOne(ctx context.Context, filter interface{}, + // update interface{}, ...) (*UpdateResult, error) + name = "UpdateOne" and n = 1 + or + // func (coll *Collection) Watch(ctx context.Context, pipeline interface{}, ...) + // (*ChangeStream, error) + name = "Watch" and n = 1 + or + // func (coll *Collection) Aggregate(ctx context.Context, pipeline interface{}, + // opts ...*options.AggregateOptions) (*Cursor, error) + name = "Aggregate" and n = 1 + } + + /** + * A query used in an API function acting on a `Collection` struct of package + * [go.mongodb.org/mongo-driver/mongo](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo). + */ + private class MongoDbCollectionQuery extends Range { + MongoDbCollectionQuery() { + exists(Method meth, string methodName, int n | + mongoDbCollectionMethod(methodName, n) and + meth.hasQualifiedName(package("go.mongodb.org/mongo-driver", "mongo"), "Collection", + methodName) and + this = meth.getACall().getArgument(n) + ) + } + } + } + + /** + * Holds if taint flows from `pred` to `succ` through a MongoDB-specific API. + */ + predicate isAdditionalMongoTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + // Taint an entry if the `Value` is tainted + exists(Write w, DataFlow::Node base, Field f | w.writesField(base, f, pred) | + base = succ.(DataFlow::PostUpdateNode).getPreUpdateNode() and + base.getType().hasQualifiedName(package("go.mongodb.org/mongo-driver", "bson/primitive"), "E") and + f.getName() = "Value" + ) + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Protobuf.qll b/go/ql/lib/semmle/go/frameworks/Protobuf.qll new file mode 100644 index 00000000000..66b3bba8de9 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Protobuf.qll @@ -0,0 +1,178 @@ +/** Provides models of commonly used functions and types in the protobuf packages. */ + +import go + +/** Provides models of commonly used functions and types in the protobuf packages. */ +module Protobuf { + /** Gets the name of the modern protobuf top-level implementation package. */ + string modernProtobufPackage() { result = package("google.golang.org/protobuf", "proto") } + + /** Gets the name of the modern protobuf implementation's `protoiface` subpackage. */ + string protobufIfacePackage() { + result = package("google.golang.org/protobuf", "runtime/protoiface") + } + + /** Gets the name of the modern protobuf implementation's `protoreflect` subpackage. */ + string protobufReflectPackage() { + result = package("google.golang.org/protobuf", "reflect/protoreflect") + } + + /** Gets the name of a top-level protobuf implementation package. */ + string protobufPackages() { + result in [package("github.com/golang/protobuf", "proto"), modernProtobufPackage()] + } + + /** The `Marshal` and `MarshalAppend` functions in the protobuf packages. */ + private class MarshalFunction extends TaintTracking::FunctionModel, MarshalingFunction::Range { + string name; + + MarshalFunction() { + name = ["Marshal", "MarshalAppend"] and + ( + this.hasQualifiedName(protobufPackages(), name) or + this.(Method).hasQualifiedName(modernProtobufPackage(), "MarshalOptions", name) + ) + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + + override DataFlow::FunctionInput getAnInput() { + if name = "MarshalAppend" then result.isParameter(1) else result.isParameter(0) + } + + override DataFlow::FunctionOutput getOutput() { + name = "MarshalAppend" and result.isParameter(0) + or + result.isResult(0) + } + + override string getFormat() { result = "protobuf" } + } + + private Field inputMessageField() { + result.hasQualifiedName(protobufIfacePackage(), "MarshalInput", "Message") + } + + private Method marshalStateMethod() { + result.hasQualifiedName(protobufIfacePackage(), "MarshalOptions", "MarshalState") + } + + /** + * Additional taint-flow step modeling flow from `MarshalInput.Message` to `MarshalOutput`, + * mediated by a `MarshalOptions.MarshalState` call. + * + * Note we can taint the whole `MarshalOutput` as it only has one field (`Buf`), and taint- + * tracking always considers a field of a tainted struct to itself be tainted. + */ + private class MarshalStateStep extends TaintTracking::AdditionalTaintStep { + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists(DataFlow::PostUpdateNode marshalInput, DataFlow::CallNode marshalStateCall | + marshalStateCall = marshalStateMethod().getACall() and + // pred -> marshalInput.Message + any(DataFlow::Write w) + .writesField(marshalInput.getPreUpdateNode(), inputMessageField(), pred) and + // marshalInput -> marshalStateCall + marshalStateCall.getArgument(0) = globalValueNumber(marshalInput).getANode() and + // marshalStateCall -> succ + marshalStateCall.getResult() = succ + ) + } + } + + /** The `Unmarshal` function in the protobuf packages. */ + class UnmarshalFunction extends TaintTracking::FunctionModel, UnmarshalingFunction::Range { + UnmarshalFunction() { + this.hasQualifiedName(protobufPackages(), "Unmarshal") or + this.(Method).hasQualifiedName(modernProtobufPackage(), "UnmarshalOptions", "Unmarshal") + } + + override predicate hasTaintFlow(DataFlow::FunctionInput inp, DataFlow::FunctionOutput outp) { + inp = this.getAnInput() and outp = this.getOutput() + } + + override DataFlow::FunctionInput getAnInput() { result.isParameter(0) } + + override DataFlow::FunctionOutput getOutput() { result.isParameter(1) } + + override string getFormat() { result = "protobuf" } + } + + /** The `Merge` function in the protobuf packages. */ + private class MergeFunction extends TaintTracking::FunctionModel { + MergeFunction() { this.hasQualifiedName(protobufPackages(), "Merge") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isParameter(1) and outp.isParameter(0) + } + } + + /** A protobuf `Message` type. */ + class MessageType extends Type { + MessageType() { this.implements(protobufReflectPackage(), "ProtoMessage") } + } + + /** The `Clone` function in the protobuf packages. */ + private class MessageCloneFunction extends TaintTracking::FunctionModel { + MessageCloneFunction() { this.hasQualifiedName(protobufPackages(), "Clone") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isParameter(0) and outp.isResult() + } + } + + /** A `Get` method of a protobuf `Message` type. */ + private class GetMethod extends DataFlow::FunctionModel, Method { + GetMethod() { + exists(string name | name.matches("Get%") | this = any(MessageType msg).getMethod(name)) + } + + override predicate hasDataFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + /** A `ProtoReflect` method of a protobuf `Message` type. */ + private class ProtoReflectMethod extends DataFlow::FunctionModel, Method { + ProtoReflectMethod() { this = any(MessageType msg).getMethod("ProtoReflect") } + + override predicate hasDataFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + /** + * Gets the base of `node`, looking through any dereference node found. + */ + private DataFlow::Node getBaseLookingThroughDerefs(DataFlow::ComponentReadNode node) { + result = node.getBase().(DataFlow::PointerDereferenceNode).getOperand() + or + result = node.getBase() and not node.getBase() instanceof DataFlow::PointerDereferenceNode + } + + /** + * Gets the data-flow node representing the bottom of a stack of zero or more `ComponentReadNode`s + * perhaps with interleaved dereferences. + * + * For example, in the expression a.b[c].d[e], this would return the dataflow node for the read from `a`. + */ + private DataFlow::Node getUnderlyingNode(DataFlow::ReadNode read) { + (result = read or result = getBaseLookingThroughDerefs+(read)) and + not result instanceof DataFlow::ComponentReadNode + } + + /** + * Additional taint step tainting a Message when taint is written to any of its fields and/or elements. + */ + private class WriteMessageFieldStep extends TaintTracking::AdditionalTaintStep { + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + [succ.getType(), succ.getType().getPointerType()] instanceof MessageType and + exists(DataFlow::ReadNode base | + succ.(DataFlow::PostUpdateNode).getPreUpdateNode() = getUnderlyingNode(base) + | + any(DataFlow::Write w).writesComponent(base, pred) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Revel.qll b/go/ql/lib/semmle/go/frameworks/Revel.qll new file mode 100644 index 00000000000..1ccad431b84 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Revel.qll @@ -0,0 +1,334 @@ +/** + * Provides classes for working with untrusted flow sources from the `github.com/revel/revel` package. + */ + +import go +private import semmle.go.security.OpenUrlRedirectCustomizations + +/** Provides classes and methods modeling the Revel web framework. */ +module Revel { + /** Gets the package name `github.com/revel/revel`. */ + string packagePath() { result = package(["github.com/revel", "github.com/robfig"], "revel") } + + private class ControllerParams extends UntrustedFlowSource::Range, DataFlow::FieldReadNode { + ControllerParams() { + exists(Field f | + this.readsField(_, f) and + f.hasQualifiedName(packagePath(), "Controller", "Params") + ) + } + } + + private class ParamsFixedSanitizer extends TaintTracking::DefaultTaintSanitizer, + DataFlow::FieldReadNode { + ParamsFixedSanitizer() { + exists(Field f | + this.readsField(_, f) and + f.hasQualifiedName(packagePath(), "Params", "Fixed") + ) + } + } + + private class ParamsBind extends TaintTracking::FunctionModel, Method { + ParamsBind() { this.hasQualifiedName(packagePath(), "Params", ["Bind", "BindJSON"]) } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isParameter(0) + } + } + + private class RouteMatchParams extends UntrustedFlowSource::Range, DataFlow::FieldReadNode { + RouteMatchParams() { + exists(Field f | + this.readsField(_, f) and + f.hasQualifiedName(packagePath(), "RouteMatch", "Params") + ) + } + } + + /** An access to an HTTP request field whose value may be controlled by an untrusted user. */ + private class UserControlledRequestField extends UntrustedFlowSource::Range, + DataFlow::FieldReadNode { + UserControlledRequestField() { + exists(string fieldName | + this.getField().hasQualifiedName(packagePath(), "Request", fieldName) + | + fieldName in [ + "Header", "ContentType", "AcceptLanguages", "Locale", "URL", "Form", "MultipartForm" + ] + ) + } + } + + private class UserControlledRequestMethod extends UntrustedFlowSource::Range, + DataFlow::MethodCallNode { + UserControlledRequestMethod() { + this.getTarget() + .hasQualifiedName(packagePath(), "Request", + [ + "FormValue", "PostFormValue", "GetQuery", "GetForm", "GetMultipartForm", "GetBody", + "Cookie", "GetHttpHeader", "GetRequestURI", "MultipartReader", "Referer", "UserAgent" + ]) + } + } + + private class ServerCookieGetValue extends TaintTracking::FunctionModel, Method { + ServerCookieGetValue() { this.implements(packagePath(), "ServerCookie", "GetValue") } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private class ServerMultipartFormGetFiles extends TaintTracking::FunctionModel, Method { + ServerMultipartFormGetFiles() { + this.implements(packagePath(), "ServerMultipartForm", ["GetFiles", "GetValues"]) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp.isReceiver() and outp.isResult() + } + } + + private string contentTypeFromFilename(DataFlow::Node filename) { + if filename.getStringValue().toLowerCase().matches(["%.htm", "%.html"]) + then result = "text/html" + else result = "application/octet-stream" + // Actually Revel can figure out a variety of other content-types, but none of our analyses care to + // distinguish ones other than text/html. + } + + /** + * `revel.Controller` methods which set the response content-type to and designate a result in one operation. + * + * Note these don't actually generate the response, they return a struct which is then returned by the controller + * method, but it is very likely if a string is being rendered that it will end up sent to the user. + * + * The `Render` and `RenderTemplate` methods are handled by `TemplateRender` below. + * + * The `RenderError` method can actually return HTML content, but again only via an HTML template if one exists; + * we assume it falls back to return plain text as this implies there is probably not an injection opportunity + * but there is an information leakage issue. + * + * The `RenderBinary` method can also return a variety of content-types based on the file extension passed. + * We look particularly for html file extensions, since these are the only ones we currently have special rules + * for (in particular, detecting XSS vulnerabilities). + */ + private class ControllerRenderMethods extends HTTP::ResponseBody::Range { + string contentType; + + ControllerRenderMethods() { + exists(Method m, string methodName, DataFlow::CallNode methodCall | + m.hasQualifiedName(packagePath(), "Controller", methodName) and + methodCall = m.getACall() + | + exists(int exposedArgument | + this = methodCall.getArgument(exposedArgument) and + ( + methodName = "RenderBinary" and + contentType = contentTypeFromFilename(methodCall.getArgument(1)) and + exposedArgument = 0 + or + methodName = "RenderError" and contentType = "text/plain" and exposedArgument = 0 + or + methodName = "RenderHTML" and contentType = "text/html" and exposedArgument = 0 + or + methodName = "RenderJSON" and contentType = "application/json" and exposedArgument = 0 + or + methodName = "RenderJSONP" and + contentType = "application/javascript" and + exposedArgument = 1 + or + methodName = "RenderXML" and contentType = "text/xml" and exposedArgument = 0 + ) + ) + or + methodName = "RenderText" and + contentType = "text/plain" and + this = methodCall.getAnArgument() + ) + } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + override string getAContentType() { result = contentType } + } + + /** + * The `revel.Controller.RenderFileName` method, which instructs Revel to open a file and return its contents. + * We extend FileSystemAccess rather than HTTP::ResponseBody as this will usually mean exposing a user-controlled + * file rather than the actual contents being user-controlled. + */ + private class RenderFileNameCall extends FileSystemAccess::Range, DataFlow::CallNode { + RenderFileNameCall() { + this = + any(Method m | m.hasQualifiedName(packagePath(), "Controller", "RenderFileName")).getACall() + } + + override DataFlow::Node getAPathArgument() { result = this.getArgument(0) } + } + + /** + * The `revel.Controller.Redirect` method. + * + * It is currently assumed that a tainted `value` in `Redirect(url, value)`, which calls `Sprintf(url, value)` + * internally, cannot lead to an open redirect vulnerability. + */ + private class ControllerRedirectMethod extends HTTP::Redirect::Range, DataFlow::CallNode { + ControllerRedirectMethod() { + exists(Method m | m.hasQualifiedName(packagePath(), "Controller", "Redirect") | + this = m.getACall() + ) + } + + override DataFlow::Node getUrl() { result = this.getArgument(0) } + + override HTTP::ResponseWriter getResponseWriter() { none() } + } + + /** + * The getter and setter methods of `revel.RevelHeader`. + * + * Note we currently don't implement `HeaderWrite` and related concepts, as they are currently only used + * to track content-type, and directly setting headers does not seem to be the usual way to set the response + * content-type for this framework. If and when the `HeaderWrite` concept has a more abstract idea of the + * relationship between header-writes and HTTP responses than looking for a particular `http.ResponseWriter` + * instance connecting the two, then we may implement it here for completeness. + */ + private class RevelHeaderMethods extends TaintTracking::FunctionModel { + FunctionInput input; + FunctionOutput output; + string name; + + RevelHeaderMethods() { + this.(Method).hasQualifiedName(packagePath(), "RevelHeader", name) and + ( + name = ["Add", "Set"] and input.isParameter([0, 1]) and output.isReceiver() + or + name = ["Get", "GetAll"] and input.isReceiver() and output.isResult() + or + name = "SetCookie" and input.isParameter(0) and output.isReceiver() + ) + } + + override predicate hasTaintFlow(FunctionInput inp, FunctionOutput outp) { + inp = input and outp = output + } + } + + /** + * A read in a Revel template that uses Revel's `raw` function. + */ + class RawTemplateRead extends HtmlTemplate::TemplateRead { + RawTemplateRead() { parent.getBody().regexpMatch("(?s)raw\\s.*") } + } + + /** + * A write to a template argument field that is read raw inside of a template. + */ + private class RawTemplateArgument extends HTTP::TemplateResponseBody::Range { + RawTemplateRead read; + + RawTemplateArgument() { + exists(TemplateRender render, VariableWithFields var | + render.getRenderedFile() = read.getFile() and + // if var is a.b.c, any rhs of a write to a, a.b, or a.b.cb + this = var.getParent*().getAWrite().getRhs() + | + var.getParent*() = render.getArgumentVariable() and + ( + var = read.getReadVariable(render.getArgumentVariable()) + or + // if no write or use of that variable exists, no VariableWithFields will be generated + // so we try to find a parent VariableWithFields + // this isn't covered by the 'getParent*' above because no match would be found at all + // for var + not exists(read.getReadVariable(render.getArgumentVariable())) and + exists(string fieldName | fieldName = read.getFieldName() | + var.getQualifiedName() = + render.getArgumentVariable().getQualifiedName() + + ["." + fieldName.substring(0, fieldName.indexOf(".")), ""] + ) + ) + or + // a revel controller.Render(arg) will set controller.ViewArgs["arg"] = arg + exists(Variable arg | arg.getARead() = render.(ControllerRender).getAnArgument() | + var.getBaseVariable() = arg and + var.getQualifiedName() = read.getFieldName() + ) + ) + } + + override string getAContentType() { result = "text/html" } + + override HTTP::ResponseWriter getResponseWriter() { none() } + + override HtmlTemplate::TemplateRead getRead() { result = read } + } + + /** + * A render of a template. + */ + abstract class TemplateRender extends DataFlow::Node, TemplateInstantiation::Range { + /** Gets the name of the file that is rendered. */ + abstract File getRenderedFile(); + + /** Gets the variable passed as an argument to the template. */ + abstract VariableWithFields getArgumentVariable(); + + override DataFlow::Node getADataArgument() { result = this.getArgumentVariable().getAUse() } + } + + private IR::EvalInstruction skipImplicitFieldReads(IR::Instruction insn) { + result = insn or + result = skipImplicitFieldReads(insn.(IR::ImplicitFieldReadInstruction).getBase()) + } + + /** A call to `Controller.Render`. */ + private class ControllerRender extends TemplateRender, DataFlow::MethodCallNode { + ControllerRender() { this.getTarget().hasQualifiedName(packagePath(), "Controller", "Render") } + + override DataFlow::Node getTemplateArgument() { none() } + + override File getRenderedFile() { + exists(Type controllerType, string controllerRe, string handlerRe, string pathRe | + controllerType = skipImplicitFieldReads(this.getReceiver().asInstruction()).getResultType() and + controllerRe = "\\Q" + controllerType.getName() + "\\E" and + handlerRe = "\\Q" + this.getRoot().(FuncDef).getName() + "\\E" and + // find a file named '/views//(.